关于作者

用户名:guanjinhai
笔名:guanjinhai
地区: 河南-南阳
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



最新评论

访问统计:
文章个数:9
评论个数:0
留言条数:1




Powered by BlogDriver 2.1

关金海的博客

 

欢迎访问关金海的博客

文章

脚本实现网络启用和禁用

Const ssfCONTROLS = 3

sConnectionName = "NAT"  此处需要更改为您的网络连接名,一般为“本地连接”

sEnableVerb = "启用(&A)"
sDisableVerb = "禁用(&B)"

set shellApp = createobject("shell.application")
set oControlPanel = shellApp.Namespace(ssfCONTROLS)

set oNetConnections = nothing
for each folderitem in oControlPanel.items
if folderitem.name = "网络连接" then
set oNetConnections = folderitem.getfolder: exit for
end if
next

if oNetConnections is nothing then
wscript.quit
end if

set oLanConnection = nothing
for each folderitem in oNetConnections.items
if lcase(folderitem.name) = lcase(sConnectionName) then
set oLanConnection = folderitem: exit for
end if
next

if oLanConnection is nothing then
wscript.quit
end if

bEnabled = true
set oEnableVerb = nothing
set oDisableVerb = nothing
s = "Verbs: " & vbcrlf
for each verb in oLanConnection.verbs
s = s & vbcrlf & verb.name
if verb.name = sEnableVerb then
set oEnableVerb = verb
bEnabled = false
end if
if verb.name = sDisableVerb then
set oDisableVerb = verb
end if
next


if bEnabled then
oDisableVerb.DoIt
else
oEnableVerb.DoIt
end if

wscript.sleep 1000
以上另存为.vbs,可实现网路的启用和禁用

- 作者: guanjinhai 2006年05月26日, 星期五 19:09  回复(0) |  引用(0) 加入博采

音量开关脚本
摘要:通过脚本,配合计划任务可实现定时声音播放 查看全文

- 作者: guanjinhai 2006年05月26日, 星期五 19:02  回复(0) |  引用(0) 加入博采

一些Select检索高级用法
一些Select检索高级用法(适用于SQL Server)


 SQL五个集合函数:SUM,AVG,COUNT,
MAX,MIN

 通配符的一些用法:(关键字:like % [] -)
  select * from tablename where column1 like '[A-M]%'
  这样可以选择出column字段中首字母在A-M之间的记录
  select * from tablename where column1 like '[ABC]%'
  这样可以选择出column字段中首字母是A或者B或者C的记录
  select * from tablename where column1 like '[A-CG]%'
  这样可以选择出column字段中首字母在A-C之间的或者是G的记录
  select * from tablename where column1 like '[^C]%'
  这样可以选择出column字段中首字母不是C的记录

 脱字符(关键字:like _)
  通过使用下滑线字符(_),可以匹配任意单个字符
  select * from tablename where column1 like 'M_crosoft'

 匹配特殊字符:([ ] _ - %)
  把他们都放到[]中就行了,比如:
  select * from tablename where column1 like '%[%]%'

 匹配发音(关键字:SOUNDEX DIFFERENCE)
  如果不知道一个名字确切的发音,但是又多少知道一点,可以考虑使用SOUNDEX DIFFERENCE函数。
  select * from tablename where DIFFERENCE(column1,'Laofei'>3)
  DIFFERENCE

- 作者: guanjinhai 2005年08月9日, 星期二 09:41  回复(0) |  引用(0) 加入博采

使ACCESS数据库保持同步

  同步(

  1.Replicable属性:

  Replicable属性用来使一个数据库对象或数据库中的表对象、查询对象等对象成为可复制副本的,即成为设计正本。但数据库对象并不提供Replicable这一属性,因此首先要用CreatePropety方法来创建它,然后把它添加到对象的属性集中,最后再给它赋值,使数据库成为设计正本。对于数据库对象而言,把Replicable属性设置为“T”将使数据库对象成为可复制的。以下代码将使VB6.0安装目录下附带的Nwind.mdb数据库成为一个设计正本(为确保安全建议在操作前备份这一库文件):

  Private Sub Command1_Click()

  Dim dbNwind As Database

  '如果末引用DAO则一定要先引用

  Dim prpNew As Property

  Set dbNwind = OpenDatabase("Nwind.mdb", True)

  With dbNwind

  '建立Replicable属性,如果已经存在该属性则程序略过这一步

  On Error Resume Next

  Set prpNew = .CreateProperty("Replicable", dbText, "T")

  .Properties.Append prpNew

  '设置数据库的Replicable属性为True

  .Properties("Replicable") = "T"

  .Close

  End With

  End Sub

  2.MakeReplica方法:

  MakeReplica方法从设计正本复制出一个新的完全副本。其语法为:database.MakeReplica replica,

  description,

  options,其中replica是代表一个新副本路径名称的字符串;description是对正在创建的新副本的一个描述字符串;options是一个可选项,可以是dbRepMakePartial常量(创建一个部分副本)或dbRepMakeReadOnly常量(防止用户修改新副本中的可复制对象),如果要建立的是一个只读式的部分副本,则要加入参数常量

  dbRepMakeReadOnly + dbRepMakePartial 。

  在第一个例子中,在关闭数据库之前加入代码:.MakeReplica "NwReplica", "replica of

  nwind.mdb",则从Nwind.mdb设计正本复制出一个名为NwReplica.mdb的副本,位置在Nwind.mdb同一目录中。以下是一个通过传递参数的形式,在实际应用中可供灵活调用的函数,每调用该函数一次即可实现新建一个副本:

  Function MakeAdditionalReplica(strReplicableDB As String, strNewReplica As

  String, intOptions As Integer) As Integer

  Dim dbsTemp As Database

  On Error GoTo ErrorHandler

  Set dbsTemp = OpenDatabase(strReplicableDB)

  ' 如果在调用此函数时,intOptions处末给出参数, 则忽略该参数项,

  '默认建立一个完全的、可读/写的副本,否则就利用提供的参数按要求建立副本

  If intOptions = 0 Then

  dbsTemp.MakeReplica strNewReplica, "Replica of " & strReplicableDB

  Else

  dbsTemp.MakeReplica strNewReplica, "Replica of " & strReplicableDB,

  intOptions

  End If

  dbsTemp.Close

  ErrorHandler:

  Select Case Err

  Case 0:

  MakeAdditionalReplica = 0

  Exit Function

  Case Else:

  MsgBox "Error " & Err & " : " & Error

  MakeAdditionalReplica = Err

  Exit Function

  End Select

  End Function

  3.Synchronize方法:

  Synchronize方法使两个完全副本(包括设计正本)同步化。其语法为:database.Synchronize pathname,

  exchange。其中pathname为要同步的目标副本的路径名称字符串(串中的

  .mdb扩展名可省略);exchange用来标识两个数据库之间的同步方向(如表一),这是一个可选项,默认为表中的第三个选项,即双向交换。利用表中第四个dbRepSyncInternet常量选项,还可对通过Internet互联的数据库进行同步化,

  这时要将代表本地网络路径选项pathname用URL地址来代替。

  表一、同步化方向常量

  常量同步化方向

  DbRepExportChanges从数据库到副本路径名称

  DbRepImportChanges从副本路径名称到数据库

  DbRepImpExpChanges双向交换改变(默认)

  DbRepSyncInternet在通过Internet路径连接的数据库之间传递改变

  在同步化操作之前,要确保已经利用 Replicable属性使一个数据库初始出设计正本,并且利用MakeReplica方法复制出了一个以上的副本。

  以下通过在第一个例子添加的副本复制语句之后,加入如下语句:.Synchronize "NwReplica.mdb",

  dbRepExportChanges,实现把数据库Nwind的设计正本的任何改变传递给副本

  NwReplica。我们可以在Nwind.mdb库中改变一些数据内容,然后再运行这一例子,我们会发现Nwind.mdb库的改变已经反映在NwReplica.mdb这一副本中了。

  以上语句实现从数据库到副本路径名称的同步(把设计正本的数据或结构改变传递给副本),把dbRepExportChanges常量改为dbRepImportChanges和dbRepImpExpChanges可分别实现从副本路径名称到数据库(数据库接收副本上的改变)以及双向交换(两者间的双向数据传递)同步。

  Synchronize方法还可对通过Internet互联的数据库进行同步化,以下语句实现本地数据库正本与位于Internet服务器上的一个副本同步化:dbNwind.Synchronize

  "www.mycompany.myserver.com" & "/files/NwReplica.mdb", dbRepImpExpChanges

  + dbRepSyncInternet

  4.PopulatePartial 方法:

  上面介绍利用Synchronize方法使两个完全副本同步化,不会出现问题,但如果用一个完全副本来同步一个部分副本,因为部分副本是由副本过滤器来从完全副本来过滤重新生成的,因此可能在部分副本中产生所谓的“孤立”记录,即这些记录不能再与其他副本保持同步。要解决这一问题引入了另一个称为PopulatePartial的方法,该方法与Synchronize方法类似,只不过它是实现部分副本与完全副本的同步,在同步时,首先清除部分副本中的所有记录,然后根据当前副本的过滤器来重新生成部分副本,这样就解决了“孤立”记录的问题。其语法为:database.PopulatePartial

  dbname。dbname是完全副本的路径名称。由于篇幅所限以及其与Synchronize方法的相似性,因此在此不再累述,更详细的描述请参

Synchronization)是数据库在网络环境中应用所要涉及到的一个重要概念。其基本过程大致分以下几个步骤:首先把一个数据库设为可复制副本属性,使其成为设计正本(VB中称设计原版,ACCESS中称设计母版);然后根据应用程序的实现需要从设计正本复制出多个副本(VB中称复本),这些副本组成一个副本集合(设计正本也被看做是第一个的、初始的副本);最后在集中任何复本的数据或结构被更改会时启用同步机制把改变发送并且应用于此复本集中的其他成员,使得副本集中的成员在数据或结构上保持一致性。实现同步的这一过程被称为同步化。VB6.0为实现同步,在数据库对象中提供了多个属性与方法来实现这一过程,以下介绍主要的几个属性与方法,分别对应同步化的几个步骤:

- 作者: guanjinhai 2005年08月9日, 星期二 09:35  回复(0) |  引用(1) 加入博采

用ASP连接各种数据库的方法集锦
用ASP连接各种数据库的方法集锦

http://www.webjx.com  更新日期:2005-03-19  网页教学网  浏览次数: 1751

  一、ASP的对象存取数据库方法

  在ASP中,用来存取数据库的对象统称ADO(Active Data Objects),主要含有三种对象:Connection、Recordset 、Command
  Connection:负责打开或连接数据
  Recordset:负责存取数据表
  Command:负责对数据库执行行动查询命令

  二、连接各数据库的驱动程序

  连接各数据库可以使用驱动程序,也可以使用数据源,不过我建议大家使用驱动程序,因为使用驱动程序非常方便、简单,而使用数据源比较麻烦。

  ODBC链接

  适合数据库类型 链接方式
access "Driver={microsoft access driver(*.mdb)};dbq=*.mdb;uid=admin;pwd=pass;"
dBase "Driver={microsoft dbase driver(*.dbf)};driverid=277;dbq=------------;"
Oracle "Driver={microsoft odbc for oracle};server=oraclesever.world;uid=admin;pwd=pass;"
MSSQL server "Driver={sql server};server=servername;database=dbname;uid=sa;pwd=pass;"
MS text "Driver={microsoft text driver(*.txt; *.csv)};dbq=-----;extensions=asc,csv,tab,txt;Persist SecurityInfo=false;"
Visual Foxpro "Driver={microsoft Visual Foxpro driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"
MySQL "Driver={mysql};database=yourdatabase;uid=username;pwd=yourpassword;option=16386;"


  OLEDB链接

  适合的数据库类型 链接方式
access "Provider=microsoft.jet.oledb.4.0;data source=your_database_path;user id=admin;password=pass;"
Oracle "Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"
MS SQL Server "Provider=SQLOLEDB;data source=machinename;initial catalog=dbname;userid=sa;password=pass;"
MS text "Provider=microsof.jet.oledb.4.0;data source=your_path;Extended Properties′text;FMT=Delimited′"


  而我们在一般情况下使用Access的数据库比较多,在这里我建议大家连接Access数据库使用下面的方法:

dim conn
set conn = server.createobject("adodb.connection")
conn.open = "provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath("../db/bbs.mdb")

  其中../db/bbs.mdb是你的数据库存放的相对路径!如果你的数据库和ASP文件在同一目录下,你只要这样写就可以了:

dim conn
set conn = server.createobject("adodb.connection")
conn.open = "provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath("bbs.mdb")

  有许多初学者在遇到数据库连接时总是会出问题,然而使用上面的驱动程序只要你的数据库路径选对了就不会出问题了。

- 作者: guanjinhai 2005年08月9日, 星期二 09:29  回复(0) |  引用(1) 加入博采

防止ACCESS数据库被下载的9种方法 [整理版]

防止ACCESS数据库被下载的9种方法 [整理版]
作者:yinhu   来自:http://www.powers.com.cn

篇首语:原来改mdb为asp就能防下载是鬼话。 

引子:昨天和animator试验了一下,把data.mdb文件改名为data.asp文件后放在wwwroot目录里。然后 在IE中输入data.asp路径后,发现IE显示一片空白,右键->察看源文件,跳出记事本,将内容另存为.mdb文件 ,用ACCESS打开,发现需要密码,也就是说至少文件头被破坏。 
然后用Flashget试验下载data.asp文件,并另存为data.mdb文件,发现用ACCESS打开完好无损!!!看 来,好一些编程人员在开发的时候都认为,改了mdb后缀为asp就能防下载的概念,是错的!后台数据库被下载对于一个asp+a ccess的网站来说无疑是一场惨绝人寰的灾难。今天找了各方的文章,归纳一下有以下9种办法防止数据库被下载(欢迎补充):& nbsp;


1.发挥你的想象力 修改数据库文件名 
不用说,这是最最偷懒的方法,但是若攻击者通过第三方途径获得了数据库的路径),就玩完了。比如说攻击者本来只能拿到list权 ,结果意外看到了数据库路径,就可以冠冕堂皇地把数据库下载回去研究了。另外,数据文件通常大小都比较大,起再隐蔽的文件名都瞒 不了人。故保密性为最低。 


2.数据库名后缀改为ASA、ASP等 

此法须配合一些要进行一些设置,否则就会出现本文开头的那种情况 

(1)二进制字段添加(此招我还没有炼成-_-+)。 

(2)在这个文件中加入<%或%>,IIS就会按ASP语法来解析,然后就会报告500错误,自然不能下载了。可是 如果只是简单的在数据库的文本或者备注字段加入<%是没用的,因为ACCESS会对其中的内容进行处理,在数据库里他会以 < %的形式存在,无效!正确的方法是将<%存入OLE对象字段里,这样我们的目的就能达到了。&nbs p;
作方法: 
    首先,用notepad新建一个内容为 <% 的 文本文件,随便起个名字存档。 
  接着,用Access打开您的数据库文件,新建一个表,随便起个名字,在表中添加一个OLE对象的字段,然后添加一个记录, 插入之前建立的文本文件,如果操作正确的话,应该可以看到一个新的名为"数据包"的记录。即可 


3.数据库名前加"#" 
  只需要把数据库文件前名加上#、然后修改数据库连接文件(如conn.asp)中的数据库地址。原理是下载的时候只能识别& nbsp;#号前名的部分,对于后面的自动去掉,比如你要下载:http://www.pcdigest.com/date/# 123.mdb(假设存在的话)。无论是IE还是FLASHGET等下到的都是http://www.test.com/dat e/index.htm(index.asp、default.jsp等你在IIS设置的首页文档)  
  另外在数据库文件名中保留一些空格也起到类似作用,由于HTTP协议对地址解析的特殊性,空格会被编码为"%",如http ://www.test.com/date/123  ;456.mdb,下载的时http://www. test.com/date/123 %456.mdb。而我们的目录就根本没有123%456.mdb这个文件,所 以下载也是无效的这样的修改后,即使你暴露了数据库地址,一般情况下别人也是无法下载! 


4.加密数据库 
  首先在选取"工具->安全->加密/解密数据库,选取数据库(如:employer.mdb),然后接确定,接 着会出现"数据库加密后另存为"的窗口,存为:employer1.mdb。接着employer.mdb就会被编码,然后存为 employer1.mdb..要注意的是,以上的动作并不是对数据库设置密码,而只是对数据库文件加以编码,目的是为了防止他 人使用别的工具来查看数据库文件的内容。 
    接下来我们为数据库加密,首先以打开经过编码了的  e mployer1.mdb,在打开时,选择"独占"方式。然后选取功能表的"工具->安全->设置数据库密码",& nbsp;接着输入密码即可。这样即使他人得到了employer1.mdb文件,没有密码他是无法看到 emplo yer1.mdb的。  
  加密后要修改数据库连接页, 如: 
conn.open "driver={microsoft access driver&nb sp;(*.mdb)};uid=admin;pwd=数据库密码;dbq=数据库路径" 
  这样修改后,数据库即使被人下载了,别人也无法打开(前提是你的数据库连接页中的密码没有被泄露) 
  但值得注意的是,由于Access数据库的加密机制比较简单,即使设置了密码,解密也很容易。该数据库系统通过将用户输入的 密码与某一固定密钥进行"异或"来形成一个加密串,并将其存储在*.mdb文件从地址"&H42"开始的区域内。所以一 个好的程序员可以轻松制作一个几十行的小程序就可以轻松地获得任何Access数据库的密码。因此,只要数据库被下载,其信息安 全依然是个未知数。  


5.数据库放在WEB目录外或将数据库连接文件放到其他虚拟目录下 
  如你的WEB目录是e:\webroot,可以把数据库放到e:\data这个文件夹里,在e:\webroot里的数据库 连接页中修改数据库连接地址为:"../data/数据库名" 的形式,这样数据库可以正常调用,但是无法下载的,因 为它不在WEB目录里!这个方法一般也不适合购买虚拟空间的用户。 


6.使用ODBC数据源。 
  在ASP等程序设计中,如果有条件,应尽量使用ODBC数据源,不要把数据库名写在程序中,否则,数据库名将随ASP源代码 的失密而一同失密,例如: DBPath = Server.MapPath("../123/ abc/asfadf.mdb ")  
conn.open "driver={Microsoft Access Driver&nb sp;(*.mdb)};dbq="& DBPath  
  可见,即使数据库名字起得再怪异,隐藏的目录再深,ASP源代码失密后,也很容易被下载下来。如果使用ODBC数据源,就不 会存在这样的问题了: conn.open "ODBC-DSN名" ,不过这样是比较烦的,目 录移动的话又要重新设置数据源了,更方便的方法请看第7,8法! 


7.添加数据库名的如MDB的扩展映射 
  这个方法就是通过修改IIS设置来实现,适合有IIS控制权的朋友,不适合购买虚拟主机用户(除非管理员已经设置了)。这个 方法我认为是目前最好的。只要修改一处,整个站点的数据库都可以防止被下载。无须修改代码即使暴露目标地址也可以防止下载。&n bsp;
  我们在IIS属性---主目录---配置---映射---应用程序扩展那里添加.mdb文件的应用解析。注意这里的选择的D LL(或EXE等)似乎也不是任意的,选择不当,这个MDB文件还是可以被下载的,  注意最好不要选择选 择asp.dll等。你可以自己多测试下 
  这样修改后下载数据库如:http://www.test.com/data/dvbbs6.mdb。就出现(404或50 0等错误)  


8:使用.net的优越性 
  动网的木鸟就写过一个防非法下载文件的"WBAL 防盗链工具"。具体可以登陆http://www.9seek .com/WBAL/  ; 
  不过 那个只实现了防止非本地下载的 ,没有起到真正的防下载数据库的功能。不过这个方法已经跟5法差 不多可以通过修改.NET文件,实现本地也不能下载! 

  这几个方法中,只有第7和8个是统一性改的,一次修改配置后,整个站点的数据库都可以防止下载,其他几个就要分别修改数据库 名和连接文件,比较麻烦,不过对于虚拟主机的朋友也只能这样了! 

  其实第6个方法应该是第5个方法的扩展,可以实现特殊的功能,但对于不支持.net的主机或者怕设置麻烦的话,还是直接用第 5个方法了,而且默认情况下第6个方法,依然可以通过复制连接到同主机的论坛或留言本发表,然后就可以点击下载了(因为这样的引 用页是来自同主机的) 

9.利用NTFS分区的文件权限设置(by percyboy) 
    我们已经知道,ASP.NET 中使用 ADO.NET  访问数据库,通过 OleDb 的连接可以访问 Access 数据库— —我们非常常用的低端数据库之一。本文讨论了 ASP.NET 中可能看到的若干错误提示,从中看到&nb sp;Access 2000 和 Access XP 创建的数据库文件 ,在访问出现错误时会出现不太相同的错误提示。希望对大家有所帮助。另一个要点是,希望通过此文,使大家对 ASP. NET 中 Access 数据库文件的 NTFS 权限设置有所新的认识 。  

 

(一)实验过程  


为了叙述方便,举个具体例子做个实验:应用程序为 /test ,数据库存放在 D:\wwwr oot\test\data\db1.mdb,我们已经知道在 ASP.NET 中是以一个叫做  ;ASPNET 虚拟用户的身份访问数据库的,我们需要给这个账户以特定的 NTFS 权限才能 使 ASP.NET 程序正常运行。  

 


为了得到最严格的 NTFS 权限设置,实验开始时我们给程序最低的 NTFS 权限 :  

  a) D:\wwwroot\test\data\ 文件夹的给用户ASPNET 以如下权限:  
                         允许  拒绝  
      完全控制   &n bsp;      □   & nbsp;□  
      修改   &nbs p;         &nbs p;□    □  
      读取及运行   & nbsp;    √    □  ; 
      列出文件夹目录    ; √    □  
      读取   &nbs p;         &nbs p;√    □  
      写入   &nbs p;         &nbs p;□    □  

   b) D:\wwwroot\test\data\db1.mdb  文件本身给用户ASPNET以如下权限:  
      √ 允许将来自父系的可继承权限传播给该 对象  

 


1.1  对于某个只包含有"SELECT"命令的aspx程序,上述权限设置运行时无障碍,即:上述权限 已经满足这类程序的运行了。  

 

1.2  对于包含有"UPDATE""INSERT""UPDATE"等命令的aspx程序,  ; 

(a) 如果 db1.mdb 是 Access 2000 创 建的数据库,出现如下错误:  

"/test"应用程序中的服务器错误。  
---------------------------------------  
Microsoft Jet 数据库引擎打不开文件'D:\wwwroot\test\data\'。&n bsp;它已经被别的用户以独占方式打开,或没有查看数据的权限。   
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误 以及代码中导致错误的出处的详细信息。   
异常详细信息: System.Data.OleDb.OleDbException: Microsof t Jet 数据库引擎打不开文件'D:\wwwroot\test\data\'。 它已经被 别的用户以独占方式打开,或没有查看数据的权限。  

 

(b) 如果 db1.mdb 是 Access XP 创建的 数据库,出现如下错误:  

"/test"应用程序中的服务器错误。  
----------------------------------------------  
操作必须使用一个可更新的查询。  
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误 以及代码中导致错误的出处的详细信息。   
异常详细信息: System.Data.OleDb.OleDbException: 操作必须使用一个 可更新的查询。  

 

(c) 原因初步分析:因为包含有"UPDATE""INSERT""UPDATE"等命令,需要对数据库文件本身进 行写入操作,所以上述权限不能满足此需求,我们需要进一步放开权限。  

我们放开一些权限,  
  a) D:\wwwroot\test\data\ 文件夹不变: & nbsp;

   b) D:\wwwroot\test\data\db1.mdb  文件本身给用户ASPNET以如下权限:  
                         允许  拒绝  
      完全控制   &n bsp;      □   & nbsp;□  
      修改   &nbs p;         &nbs p;□    □  
      读取及运行   & nbsp;    √    □  ; 
      列出文件夹目录    ; √    □  
      读取   &nbs p;         &nbs p;√    □  
      写入   &nbs p;         &nbs p;√    □  

 

 

1.3  放开权限后继续实验,  

(a) 如果 db1.mdb 是 Access 2000 创 建的数据库,出现如下错误:  

"/test"应用程序中的服务器错误。  
------------------------------------------  
不能锁定文件。  
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误 以及代码中导致错误的出处的详细信息。   
异常详细信息: System.Data.OleDb.OleDbException: 不能锁定文件。& nbsp; 

 

(b) 如果 db1.mdb 是 Access XP 创建的 数据库,没有出现错误。  

 

(c) 原因初步分析:我们发现在打开 Access 数据库时,同时会在所在目录生成一个同名 的 *.ldb 文件,这是一个 Access 的锁定标记。鉴于此,我们猜测,用户  ASPNET 访问 Access 数据库时,也需要生成一个锁定标记,而该目录没 有允许其写入,因此出错。至于 Access XP 创建的数据库为什么没有这个错误,原因还不 得而知。  

我们进一步放开权限,  
  a) D:\wwwroot\test\data\ 文件夹给用户ASPNET以 如下权限:  
                         允许  拒绝  
      完全控制   &n bsp;      □   & nbsp;□  
      修改   &nbs p;         &nbs p;□    □  
      读取及运行   & nbsp;    √    □  ; 
      列出文件夹目录    ; √    □  
      读取   &nbs p;         &nbs p;√    □  
      写入   &nbs p;         &nbs p;√    □  

   b) D:\wwwroot\test\data\db1.mdb  文件本身给用户ASPNET以如下权限:  
      √ 允许将来自父系的可继承权限传播给该 对象  

 

 

1.4 继续实验,发现错误已解决,那么上面这个权限就是我们需要放开的"最低权限"。  

(a) 如果 db1.mdb 是 Access 2000 创 建的数据库,我们会发现一个小问题:生成的 *.ldb 文件不会自己删除,访问后该文件依然存在,但这个 问题不会影响 ASP.NET 的正常运行。  

 

(b) 如果 db1.mdb 是 Access XP 创建的 数据库,没有出现上面类似问题。  

 

(c) 原因初步分析:我们仅仅是给了 ASPNET 以写入文件夹的权限,没有给它修改的权限 ,所以文件一旦写入,便无法修改其内容,*.ldb 也就删除不掉了。  

 

如果非要解决这个问题,进一步放开权限为:  
  a) D:\wwwroot\test\data\ 文件夹给用户ASPNET以 如下权限:  
                         允许  拒绝  
      完全控制   &n bsp;      □   & nbsp;□  
      修改   &nbs p;         &nbs p;√    □  
      读取及运行   & nbsp;    √    □  ; 
      列出文件夹目录    ; √    □  
      读取   &nbs p;         &nbs p;√    □  
      写入   &nbs p;         &nbs p;√    □  

   b) D:\wwwroot\test\data\db1.mdb  文件本身给用户ASPNET以如下权限:  
      √ 允许将来自父系的可继承权限传播给该 对象  

 

 

1.5  附带着,实验另一种情形:我们把 db1.mdb 在 Acce ss 打开编辑,同时访问 ASP.NET。  

(a) 如果 db1.mdb 是 Access 2000 创 建的数据库,我们发现并没有出现什么问题。  


(b) 如果 db1.mdb 是 Access XP 创建的 数据库,出现如下错误:  

"/zhao"应用程序中的服务器错误。  
------------------------------------------------  
不能使用 '';文件已在使用中。  
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误 以及代码中导致错误的出处的详细信息。   
异常详细信息: System.Data.OleDb.OleDbException: 不能使用&nbs p;'';文件已在使用中。  

 

(c) 原因初步分析:Access 数据库是单用户单线程的数据库,我们在 Access&n bsp;里面打开编辑数据库文件时其实是以当前 Windows 用户(比如Administrator) 身份打开数据库,而 ASP.NET 默认使用的是 ASPNET 虚拟用户(隶属于  Users 组),级别低于 Administrator,无法和 Adminis trator "抢夺"权限,所以出现冲突错误。至于 Access 2000 忽略 这个问题的情形我们也不必做讨论了,可能是 Access 2000 没有考虑那么多因素吧。& nbsp; 

 

1.6  再附带一种情形:将 db1.mdb 的属性改为"只读",无论是&nbs p;Access 2000 还是 Access XP 都将分别出现与& nbsp;1.2 中各自的错误相同的错误提示。  

 

(二)实验结论  


(1) 我们首先再次总结一下 Access 数据库文件的 NTFS 权 限设置的缘起:  

   在 ASP.NET 中默认是以一个叫做 ASPNET& nbsp;的虚拟用户的身份来访问、操作数据库的,你可以在"控制面板"-"管理工具"-"计算机管理"-"本地用户和组"-" 用户"中看到这个用户,默认情况下是:  

      全名:ASP.NET 计算机帐户&nb sp; 
      描述为:用于运行 ASP.NET&nb sp;辅助进程(aspnet_wp.exe)的帐户。  
      隶属于:Users组。  

   使用这么一个隶属于 Users 组的用户来进行文件操作、数据库操 作的风险是要比用一个 Administrators 组的用户的风险要小得多,这也是 ASP .NET 在安全方面的一个考虑吧。  

   既然是这么一个用户需要访问、操作数据库文件本身,那么我们就需要给它一定的  NTFS 权限以允许它的访问。显然没有 NTFS 的权限许可,ASPNET 就无 法访问、操作数据库,就会出现上面实验中所看到的那些错误了。  


(2) 经过上面的实验,我们已经知道如下的 NTFS 权限设置是可以满足一般需求的:&nb sp; 

  a) D:\wwwroot\test\data\ 文件夹给用户ASPNET以 如下权限:  
                         允许  拒绝  
      完全控制   &n bsp;      □   & nbsp;□  
      修改   &nbs p;         &nbs p;□    □  
      读取及运行   & nbsp;    √    □  ; 
      列出文件夹目录    ; √    □  
      读取   &nbs p;         &nbs p;√    □  
      写入   &nbs p;         &nbs p;√    □  

   b) D:\wwwroot\test\data\db1.mdb  文件本身给用户ASPNET以如下权限:  
      √ 允许将来自父系的可继承权限传播给该 对象  


同时我们也注意到 db1.mdb 是否为"只读"文件对 ASPNET 的访问也会 有一定影响。  

 

(3) 上述权限设置可以直接设置给 ASPNET 用户自己,也可以设置给 Use rs 组,或者直接给 Everyone 组上述权限都是可以的。因为 ASPNET  隶属于 Users 组,可以通过 用户组 给 ASPNET  设置权限。  

 

(4) NTFS 权限在文件或文件夹右击后得到的"属性"对话框-"安全"选项卡中设置,一般情况下,可 以考虑给 Adminitrators 组以"完全控制"的权限,同时不要轻易在"拒绝"中打勾,有关&n bsp;NTFS 权限设置的技巧,可以咨询网络管理员、网络安全专家的建议。  

注:FAT, FAT32 格式的分区中不支持 NTFS 权限。 &nb sp;

 

(5) Windows 2000 系列,Windows Server  2003 系列的"安全"选项卡默认是很容易找到的,但 Windows XP Pr ofessional 中的"安全"选项卡默认是关闭的,可以将"控制面板"-"文件夹选项"-"查看"选项卡中的" 高级设置"中"使用简单共享(推荐)"一项的"√"去除,"确定"之后,再次按照上面的方法即可看到"安全"选项卡了。&nbs p; 

 

=========== 
    综上所述,2、3、4法一起使用,是防止数据库被下载最基本,最行之有效的方 法,既适用于对服务器有管辖权的网管,又适用于虚拟主机的用户,推荐每一个制作者同时必用这三种方法 

    若你对服务器拥有管辖权,推荐再加上方法9,你的ACCESS数据库的安全性 就可以大大提高了

- 作者: guanjinhai 2005年08月9日, 星期二 09:28  回复(0) |  引用(1) 加入博采

如何正确应用网络地址转换(NAT)技术
来源:ChinaITLab
2002-9-24 20:35:00
 

  前言:随着Internet技术的不断以指数级速度增长,珍贵的网络地址分配给专用网络终于被视作是一种对宝贵的虚拟房地产的浪费。因此出现了网络地址转换(NAT)标准,就是将某些IP地址留出来供专用网络重复使用。本文将详细告诉你如何正确应用网络地址转换NAT技术。
  一、NAT技术的定义
  NAT英文全称是Network Address Translation,称是网络地址转换,它是一个IETF标准,允许一个机构以一个地址出现在Internet上。NAT将每个局域网节点的地址转换成一个IP地址,反之亦然。它也可以应用到防火墙技术里,把个别IP地址隐藏起来不被外界发现,使外界无法直接访问内部网络设备,同时,它还帮助网络可以超越地址的限制,合理地安排网络中的公有Internet 地址和私有IP地址的使用。
  二、NAT技术的基本原理和类型
  1、NAT技术基本原理
  NAT技术能帮助解决令人头痛的IP地址紧缺的问题,而且能使得内外网络隔离,提供一定的网络安全保障。它解决问题的办法是:在内部网络中使用内部地址,通过NAT把内部地址翻译成合法的IP地址在Internet上使用,其具体的做法是把IP包内的地址域用合法的IP地址来替换。 NAT功能通常被集成到路由器、防火墙、ISDN路由器或者单独的NAT设备中。NAT设备维护一个状态表,用来把非法的IP地址映射到合法的IP地址上去。每个包在NAT设备中都被翻译成正确的IP地址,发往下一级,这意味着给处理器带来了一定的负担。但对于一般的网络来说,这种负担是微不足道的。
  2、NAT技术的类型
  NAT有三种类型:静态NAT(Static NAT)、动态地址NAT(Pooled NAT)、网络地址端口转换NAPT(Port-Level NAT)。其中静态NAT设置起来最为简单和最容易实现的一种,内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址。而动态地址NAT则是在外部网络中定义了一系列的合法地址,采用动态分配的方法映射到内部网络。NAPT则是把内部地址映射到外部网络的一个IP地址的不同端口上。根据不同的需要,三种NAT方案各有利弊。
  动态地址NAT只是转换IP地址,它为每一个内部的IP地址分配一个临时的外部IP地址,主要应用于拨号,对于频繁的远程联接也可以采用动态NAT。当远程用户联接上之后,动态地址NAT就会分配给他一个IP地址,用户断开时,这个IP地址就会被释放而留待以后使用。
  网络地址端口转换NAPT(Network Address Port Translation)是人们比较熟悉的一种转换方式。NAPT普遍应用于接入设备中,它可以将中小型的网络隐藏在一个合法的IP地址后面。NAPT与动态地址NAT不同,它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的TCP端口号。
    在Internet中使用NAPT时,所有不同的TCP和UDP信息流看起来好像来源于同一个IP地址。这个优点在小型办公室内非常实用,通过从ISP处申请的一个IP地址,将多个连接通过NAPT接入Internet。实际上,许多SOHO远程访问设备支持基于PPP的动态IP地址。这样,ISP甚至不需要支持NAPT,就可以做到多个内部IP地址共用一个外部IP地址上Internet,虽然这样会导致信道的一定拥塞,但考虑到节省的ISP上网费用和易管理的特点,用NAPT还是很值得的。
  三、在Internet中使用NAT技术
  NAT技术可以让你区域网路中的所有机器经由一台通往Internet的server 线出去,而且只需要注册该server的一个IP就够了。 在以往没有NAT技术以前,我们必须在server上安装sockd,并且所有的clients都必须要支援sockd,才能够经过server的sockd连线出去。这种方式最大的问题是,通常只有telnet/ftp/www-browser支援sockd,其它的程式都不能使用;而且使用sockd的速度稍慢。因此我们使用网络地址转换NAT技术,这样client不需要做任何的更动,只需要把gateway设到该server上就可以了,而且所有的程式(例如kali/kahn等等) 都可以使用。最简单的NAT设备有两条网络连接:一条连接到Internet,一条连接到专用网络。专用网络中使用私有IP地址(有时也被称做Network 10地址,地址使用留做专用的从10.0.0.0开始的地址)的主机,通过直接向NAT设备发送数据包连接到Internet上。与普通路由器不同NAT设备实际上对包头进行修改,将专用网络的源地址变为NAT设备自己的Internet地址,而普通路由器仅在将数据包转发到目的地前读取源地址和目的地址。
  四、应用NAT技术的安全策略
  1、应用NAT技术的安全问题
  在使用NAT时,Internet上的主机表面上看起来直接与NAT设备通信,而非与专用网络中实际的主机通信。输入的数据包被发送到NAT设备的IP地址上,并且NAT设备将目的包头地址由自己的Internet地址变为真正的目的主机的专用网络地址。而结果是,理论上一个全球唯一IP地址后面可以连接几百台、几千台乃至几百万台拥有专用地址的主机。但是,这实际上存在着缺陷。例如,许多Internet协议和应用依赖于真正的端到端网络,在这种网络上,数据包完全不加修改地从源地址发送到目的地址。比如,IP安全架构不能跨NAT设备使用,因为包含原始IP 源地址的原始包头采用了数字签名。如果改变源地址的话,数字签名将不再有效。 NAT还向我们提出了管理上的挑战。尽管NAT 对于一个缺少足够的全球唯一Internet地址的组织、分支机构或者部门来说是一种不错的解决方案,但是当重组、 合并或收购需要对两个或更多的专用网络进行整合时,它就变成了一种严重的问题。甚至在组织结构稳定的情况下,NAT系统不能多层嵌套,从而造成路由噩梦。
  2、应用NAT技术的安全策略
  当我们改变网络的IP地址时,都要仔细考虑这样做会给网络中已有的安全机制带来什么样的影响。如,防火墙根据IP报头中包含的TCP端口号、信宿地址、信源地址以及其它一些信息来决定是否让该数据包通过。可以依NAT设备所处位置来改变防火墙过滤规则,这是因为NAT改变了信源或信宿地址。如果一个NAT设备,如一台内部路由器,被置于受防火墙保护的一侧,将不得不改变负责控制NAT设备身后网络流量的所有安全规则。在许多网络中,NAT机制都是在防火墙上实现的。它的目的是使防火墙能够提供对网络访问与地址转换的双重控制功能。除非可以严格地限定哪一种网络连接可以被进行NAT转换,否则不要将NAT设备置于防火墙之外。任何一个淘气的黑客,只要他能够使NAT误以为他的连接请求是被允许的,都可以以一个授权用户的身份对你的网络进行访问。如果企业正在迈向网络技术的前沿,并正在使用IP安全协议(IPSec)来构造一个虚拟专用网(VPN)时,错误地放置NAT设备会毁了计划。原则上,NAT设备应该被置于VPN受保护的一侧,因为NAT需要改动IP报头中的地址域,而在IPSec报头中该域是无法被改变的,这使可以准确地获知原始报文是发自哪一台工作站的。如果IP地址被改变了,那么IPSec的安全机制也就失效了,因为既然信源地址都可以被改动,那么报文内容就更不用说了。那么NAT技术在系统中我们应采用以下几个策略:
  ①网络地址转换模块
  NAT技术模块是本系统核心部分,而且只有本模块与网络层有关,因此,这一部分应和Unix系统本身的网络层处理部分紧密结合在一起,或对其直接进行修改。本模块进一步可细分为包交换子模块、数据包头替换子模块、规则处理子模块、连接记录子模块与真实地址分配子模块及传输层过滤子模块。
  ②集中访问控制模块
  集中访问控制模块可进一步细分为请求认证子模块和连接中继子模块。请求认证子模块主要负责和认证与访问控制系统通过一种可信的安全机制交换各种身份鉴别信息,识别出合法的用户,并根据用户预先被赋予的权限决定后续的连接形式。连接中继子模块的主要功能是为用户建立起一条最终的无中继的连接通道,并在需要的情况下向内部服务器传送鉴别过的用户身份信息,以完成相关服务协议中所需的鉴别流程。
  ③临时访问端口表
  为了区分数据包的服务对象和防止攻击者对内部主机发起的连接进行非授权的利用,网关把内部主机使用的临时端口、协议类型和内部主机地址登记在临时端口使用表中。由于网关不知道内部主机可能要使用的临时端口,故临时端口使用表是由网关根据接收的数据包动态生成的。对于入向的数据包,防火墙只让那些访问控制表许可的或者临时端口使用表登记的数据包通过。
  ④认证与访问控制系统
  认证与访问控制系统包括用户鉴别模块和访问控制模块,实现用户的身份鉴别和安全策略的控制。其中用户鉴别模块采用一次性口令(One-Time Password)认证技术中Challenge/Response机制实现远程和当地用户的身份鉴别,保护合法用户的有效访问和限制非法用户的访问。它采用Telnet和WEB两种实现方式,满足不同系统环境下用户的应用需求。访问控制模块是基于自主型访问控制策略(DAC),采用ACL的方式,按照用户(组)、地址(组)、服务类型、服务时间等访问控制因素决定对用户是否授权访问。
  ⑤网络安全监控系统
  监控与入侵检测系统作为系统端的监控进程,负责接受进入系统的所有信息,并对信息包进行分析和归类,对可能出现的入侵及时发出报警信息;同时如发现有合法用户的非法访问和非法用户的访问,监控系统将及时断开访问连接,并进行追踪检查。
  ⑥基于WEB的防火墙管理系统
  管理系统主要负责网络地址转换模块、集中访问控制模块、认证与访问控制系统、监控系统等模块的系统配置和监控。它采用基于WEB的管理模式,由于管理系统所涉及到的信息大部分是关于用户帐号等敏感数据信息,故应充分保证信息的安全性,我们采用JAVA APPLET技术代替CGI技术,在信息传递过程中采用加密等安全技术保证用户信息的安全性。
  结尾:尽管NAT技术可以给我们带来各种好处,例如无需为网络重分IP地址、减少ISP帐号花费以及提供更完善的负载平衡功能等,NAT技术对一些管理和安全机制的潜在威胁仍在,看你如何正确应用好网络地址转换NAT技术.  
  作者:徐炳廉

- 作者: guanjinhai 2005年06月14日, 星期二 11:00  回复(0) |  引用(0) 加入博采

ASP函数详解

ASP函数详解

Array()
    FUNCTION: 返回一个数组
    SYNTAX: Array(list)
    ARGUMENTS: 字符,数字均可
    EXAMPLE: <%
    Dim myArray()
    For i = 1 to 7
    Redim Preserve myArray(i)
    myArray(i) = WeekdayName(i)
    Next
    %>
    RESULT: 建立了一个包含7个元素的数组myArray
    myArray("Sunday","Monday", ... ... "Saturday")

CInt()
    FUNCTION: 将一个表达式转化为数字类型
    SYNTAX: CInt(expression)
    ARGUMENTS: 任何有效的字符均可
    EXAMPLE: <%
    f = "234"
    response.write cINT(f) + 2
    %>
    RESULT: 236
    转化字符"234"为数字"234",如果字符串为空,则返回0值

CreateObject()
    FUNCTION: 建立和返回一个已注册的ACTIVEX组件的实例。
    SYNTAX: CreateObject(objName)
    ARGUMENTS: objName 是任何一个有效、已注册的ACTIVEX组件的名字.
    EXAMPLE: <%
    Set con = Server.CreateObject("ADODB.Connection")
    %>
    RESULT:

CStr()
    FUNCTION: 转化一个表达式为字符串.
    SYNTAX: CStr(expression)
    ARGUMENTS: expression 是任何有效的表达式。
    EXAMPLE: <%
    s = 3 + 2
    response.write "The result is: " & cStr(s)
    %>
    RESULT: 转化数字“5”为字符“5”。

Date()
    FUNCTION: 返回当前系统日期.
    SYNTAX: Date()
    ARGUMENTS: None.
    EXAMPLE: <%=Date%>
    RESULT: 8/4/99

DateAdd()
    FUNCTION: 返回一个被改变了的日期。
    SYNTAX: DateAdd(timeinterval,number,date)
    ARGUMENTS: timeinterval is the time interval to add; number is amount of time intervals to add; and date is the starting date.
    EXAMPLE: <%
    currentDate = #8/4/99#
    newDate = DateAdd("m",3,currentDate)
    response.write newDate
    %>

    <%
    currentDate = #12:34:45 PM#
    newDate = DateAdd("h",3,currentDate)
    response.write newDate
    %>
    RESULT: 11/4/99
    3:34:45 PM

    "m" = "month";
    "d" = "day";

    If currentDate is in time format then,
    "h" = "hour";
    "s" = "second";

DateDiff()
    FUNCTION: 返回两个日期之间的差值 。
    SYNTAX: DateDiff(timeinterval,date1,date2 [, firstdayofweek [, firstweekofyear>>)
    ARGUMENTS: timeinterval 表示相隔时间的类型,如“M“表示“月”。
    EXAMPLE: <%
    fromDate = #8/4/99#
    toDate = #1/1/2000#
    response.write "There are " & _
    DateDiff("d",fromDate,toDate) & _
    " days to millenium from 8/4/99."
    %>
    RESULT: 从8/4/99 到2000年还有 150 天.

Day()
    FUNCTION: 返回一个月的第几日 .
    SYNTAX: Day(date)
    ARGUMENTS: date 是任何有效的日期。
    EXAMPLE: <%=Day(#8/4/99#)%>
    RESULT: 4

FormatCurrency()
    FUNCTION: 返回表达式,此表达式已被格式化为货币值
    SYNTAX: FormatCurrency(Expression [, Digit [, LeadingDigit [, Paren [, GroupDigit>>>>)
    ARGUMENTS: Digit 指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置;     LeadingDigit 三态常数,指示是否显示小数值小数点前面的零。
    EXAMPLE: <%=FormatCurrency(34.3456)%>
    RESULT: $34.35

FormatDateTime()
    FUNCTION: 返回表达式,此表达式已被格式化为日期或时间
    SYNTAX: FormatDateTime(Date, [, NamedFormat>)
    ARGUMENTS: NamedFormat 指示所使用的日期/时间格式的数值,如果省略,则使用 vbGeneralDate.
    EXAMPLE: <%=FormatDateTime("08/4/99", vbLongDate)%>
    RESULT: Wednesday, August 04, 1999

FormatNumber()
    FUNCTION: 返回表达式,此表达式已被格式化为数值.
    SYNTAX: FormatNumber(Expression [, Digit [, LeadingDigit [, Paren [, GroupDigit>>>>)
    ARGUMENTS: Digit 指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置。; LeadingDigit i指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置。; Paren 指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置。; GroupDigit i指示小数点右侧显示位数的数值。默认值为 -1,指示使用的是计算机的区域设置。.
    EXAMPLE: <%=FormatNumber(45.324567, 3)%>
    RESULT: 45.325

FormatPercent()
    FUNCTION: 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 (%)
    SYNTAX: FormatPercent(Expression [, Digit [, LeadingDigit [, Paren [, GroupDigit>>>>)
    ARGUMENTS: 同上.
    EXAMPLE: <%=FormatPercent(0.45267, 3)%>
    RESULT: 45.267%

Hour()
    FUNCTION: 以24时返回小时数.
    SYNTAX: Hour(time)
    ARGUMENTS:
    EXAMPLE: <%=Hour(#4:45:34 PM#)%>
    RESULT: 16
    (Hour has been converted to 24-hour system)

Instr()
    FUNCTION: 返回字符或字符串在另一个字符串中第一次出现的位置.
    SYNTAX: Instr([start, > strToBeSearched, strSearchFor [, compare>)
    ARGUMENTS: Start为搜索的起始值,strToBeSearched接受搜索的字符串 strSearchFor要搜索的字符compare 比较方式(详细见ASP常数)
    EXAMPLE: <%
    strText = "This is a test!!"
    pos = Instr(strText, "a")
    response.write pos
    %>
    RESULT: 9

InstrRev()
    FUNCTION: 同上,只是从字符串的最后一个搜索起
    SYNTAX: InstrRev([start, > strToBeSearched, strSearchFor [, compare>)
    ARGUMENTS: 同上.
    EXAMPLE: <%
    strText = "This is a test!!"
    pos = InstrRev(strText, "s")
    response.write pos
    %>
    RESULT: 13


Int()
    FUNCTION: 返回数值类型,不四舍五入。
    SYNTAX: Int(number)
    ARGUMENTS:
    EXAMPLE: <%=INT(32.89)%>
    RESULT: 32

IsArray()
    FUNCTION: 判断一对象是否为数组,返回布尔值 .
    SYNTAX: IsArray(name)
    ARGUMENTS:
    EXAMPLE: <%
    strTest = "Test!"
    response.write IsArray(strTest)
    %>
    RESULT: False

IsDate()
    FUNCTION: 判断一对象是否为日期,返回布尔值
    SYNTAX: IsDate(expression)
    ARGUMENTS: expression is any valid expression.
    EXAMPLE: <%
    strTest = "8/4/99"
    response.write IsDate(strTest)
    %>
    RESULT: True

IsEmpty()
    FUNCTION: 判断一对象是否初始化,返回布尔值.
    SYNTAX: IsEmpty(expression)
    ARGUMENTS:
    EXAMPLE: <%
    Dim i
    response.write IsEmpty(i)
    %>
    RESULT: True

IsNull()
    FUNCTION: 判断一对象是否为空,返回布尔值.
    SYNTAX: IsNull(expression)
    ARGUMENTS:
    EXAMPLE: <%
    Dim i
    response.write IsNull(i)
    %>
    RESULT: False
   
IsNumeric()
    FUNCTION: 判断一对象是否为数字,返回布尔值.
    SYNTAX: IsNumeric(expression)
    ARGUMENTS:
    EXAMPLE: <%
    i = "345"
    response.write IsNumeric(i)
    %>
    RESULT: True
    就算数字加了引号,ASP还是认为它是数字。

IsObject()
    FUNCTION: 判断一对象是否为对象,返回布尔值.
    SYNTAX: IsObject(expression)
    ARGUMENTS:
    EXAMPLE: <%
    Set con = Server.CreateObject("ADODB.Connection")
    response.write IsObject(con)
    %>
    RESULT: True


LBound()
    FUNCTION: 返回指定数组维的最小可用下标.
    SYNTAX: Lbound(arrayname [, dimension>)
    ARGUMENTS: dimension 指明要返回哪一维下界的整数。使用 1 表示第一维,2 表示第二维,以此类    推。如果省略 dimension 参数,默认值为 1.
    EXAMPLE: <%
    i = Array("Monday","Tuesday","Wednesday")
    response.write LBound(i)
    %>
    RESULT: 0

LCase()
    FUNCTION: 返回字符串的小写形式
    SYNTAX: Lcase(string)
    ARGUMENTS: string is any valid string expression.
    EXAMPLE: <%
    strTest = "This is a test!"
    response.write LCase(strTest)
    %>
    RESULT: this is a test!

Left()
    FUNCTION: 返回字符串左边第length个字符以前的字符(含第length个字符).
    SYNTAX: Left(string, length)
    ARGUMENTS:
    EXAMPLE: <%
    strTest = "This is a test!"
    response.write Left(strTest, 3)
    %>
    RESULT: Thi

Len()
    FUNCTION: 返回字符串的长度.
    SYNTAX: Len(string | varName)
    ARGUMENTS:
    EXAMPLE: <%
    strTest = "This is a test!"
    response.write Len(strTest)
    %>
    RESULT: 15

LTrim()
    FUNCTION: 去掉字符串左边的空格.
    SYNTAX: LTrim(string)
    ARGUMENTS:
    EXAMPLE: <%
    strTest = " This is a test!"
    response.write LTrim(strTest)
    %>
    RESULT: This is a test!

Mid()
    FUNCTION: 返回特定长度的字符串(从start开始,长度为length).
    SYNTAX: Mid(string, start [, length>)
    ARGUMENTS:
    EXAMPLE: <%
    strTest = "This is a test! Today is Monday."
    response.write Mid(strTest, 17, 5)
    %>
    RESULT: Today

Minute()
    FUNCTION: 返回时间的分钏.
    SYNTAX: Minute(time)
    ARGUMENTS:
    EXAMPLE: <%=Minute(#12:45:32 PM#)%>
    RESULT: 45

Month()
    FUNCTION: 返回日期.
    SYNTAX: Month(date)
    ARGUMENTS: date is any valid date expression.
    EXAMPLE: <%=Month(#08/04/99#)%>
    RESULT: 8

MonthName()
    FUNCTION: Returns a string identifying the specified month.
    SYNTAX: MonthName(month, [, Abb>)
    ARGUMENTS: month is the numeric representation for a given month; Abb (optional) is a boolean value used to display month abbreviation. True will display the abbreviated month name and False (default) will not show the abbreviation.
    EXAMPLE: <%=MonthName(Month(#08/04/99#))%>
    RESULT: August

Now()
    FUNCTION: Returns the current system date and time.
    SYNTAX: Now()
    ARGUMENTS: None
    EXAMPLE: <%=Now%>
    RESULT: 8/4/99 9:30:16 AM

Replace()
    FUNCTION: Returns a string in which a specified sub-string has been replaced with another substring a specified number of times.
    SYNTAX: Replace(strToBeSearched, strSearchFor, strReplaceWith [, start [, count [, compare>>>)
    ARGUMENTS: strToBeSearched is a string expression containing a sub-string to be replaced; strSearchFor is the string expression to search for within strToBeSearched; strReplaceWith is the string expression to replace sub-string strSearchFor; start (optional) is the numeric character position to begin search; count (optional) is a value indicating the comparision constant.
    EXAMPLE: <%
    strTest = "This is an apple!"
    response.write Replace(strTest, "apple", "orange")
    %>
    RESULT: This is an orange!

Right()
    FUNCTION: 返回字符串右边第length个字符以前的字符(含第length个字符).
    SYNTAX: Right(string, length)
    ARGUMENTS: .
    EXAMPLE: <%
    strTest = "This is an test!"
    response.write Right(strTest, 3)
    %>
    RESULT: st!

Rnd()
    FUNCTION: 产生一个随机数.
    SYNTAX: Rnd [ (number) >
    ARGUMENTS:
    EXAMPLE: <%
    Randomize()
    response.write RND()
    %>
    RESULT: 任何一个在0 到 1 之间的数

Round()
    FUNCTION: 返回按指定位数进行四舍五入的数值.
    SYNTAX: Round(expression [, numRight>)
    ARGUMENTS: numRight数字表明小数点右边有多少位进行四舍五入。如果省略,则 Round 函数返回整数.
    EXAMPLE: <%
    i = 32.45678
    response.write Round(i)
    %>
    RESULT: 32

Rtrim()
    FUNCTION: 去掉字符串右边的字符串.
    SYNTAX: Rtrim(string)
    ARGUMENTS:
    EXAMPLE: <%
    strTest = "This is a test!! "
    response.write RTrim(strTest)
    %>
    RESULT: This is a test!!

Second()
    FUNCTION: 返回秒.
    SYNTAX: Second(time)
    ARGUMENTS: .
    EXAMPLE: <%=Second(#12:34:28 PM#)%>
    RESULT: 28

StrReverse()
    FUNCTION: 反排一字符串
    SYNTAX: StrReverse(string)
    ARGUMENTS:
    EXAMPLE: <%
    strTest = "This is a test!!"
    response.write StrReverse(strTest)
    %>
    RESULT: !!tset a si sihT

Time()
    FUNCTION: 返回系统时间.
    SYNTAX: Time()
    ARGUMENTS: .
    EXAMPLE: <%=Time%>
    RESULT: 9:58:28 AM

Trim()
    FUNCTION: 去掉字符串左右的空格.
    SYNTAX: Trim(string)
    ARGUMENTS: string is any valid string expression.
    EXAMPLE: <%
    strTest = " This is a test!! "
    response.write Trim(strTest)
    %>
    RESULT: This is a test!!

UBound()
    FUNCTION: 返回指定数组维数的最大可用下标.
    SYNTAX: Ubound(arrayname [, dimension>)
    ARGUMENTS: dimension (optional) 指定返回哪一维上界的整数。1 表示第一维,2 表示第二维,以此类推。如果省略 dimension 参数,则默认值为 1.
    EXAMPLE: <%
    i = Array("Monday","Tuesday","Wednesday")
    response.write UBound(i)
    %>
    RESULT: 2

UCase()
    FUNCTION: 返回字符串的大写形式.
    SYNTAX: UCase(string)
    ARGUMENTS:
    EXAMPLE: <%
    strTest = "This is a test!!"
    response.write UCase(strTest)
    %>
    RESULT: THIS IS A TEST!!

VarType()
    FUNCTION: 返回指示变量子类型的值
    SYNTAX: VarType(varName)
    ARGUMENTS:
    EXAMPLE: <%
    i = 3
    response.write varType(i)
    %>
    RESULT: 2(数字)详见"asp常数"

WeekDay()
    FUNCTION: 返回在一周的第几天.
    SYNTAX: WeekDay(date [, firstdayofweek>)
    ARGUMENTS: .
    EXAMPLE: <%
    d = #8/4/99#
    response.write Weekday(d)
    %>
    RESULT: 4(星期三)

WeekDayName()
    FUNCTION: 返回一周第几天的名字.
    SYNTAX: WeekDayName(weekday [, Abb [, firstdayofweek>>)
    ARGUMENTS: Abb可选。Boolean 值,指明是否缩写表示星期各天的名称。如果省略, 默认值为 False,即不缩写星期各天的名称.firstdayofweek指明星期第一天的数值
    EXAMPLE: <%
    d = #8/4/99#
    response.write WeekdayName(Weekday(d))
    %>
    RESULT: Wednesday

Year()
    FUNCTION: 返回当前的年份.
    SYNTAX: Year(date)
    ARGUMENTS:
    EXAMPLE: <%=Year(#8/4/99#)%>
    RESULT: 1999

- 作者: guanjinhai 2005年06月11日, 星期六 19:36  回复(0) |  引用(1) 加入博采

ASP代码精华

ASP代码精华

1.  oncontextmenu="window.event.returnValue=false"      将彻底屏蔽鼠标右键
    <table border oncontextmenu=return(false)><td>no</table>   可用于Table

2.  <body onselectstart="return false">                 取消选取、防止复制

3.  onpaste="return false"                                        不准粘贴

4.  oncopy="return false;" oncut="return false;"                  防止复制

5.  <link rel="Shortcut Icon" href="favicon.ico"> IE地址栏前换成自己的图标

6.  <link rel="Bookmark" href="favicon.ico">  可以在收藏夹中显示出你的图标

7.  <input style="ime-mode:disabled">                           关闭输入法

8.  永远都会带着框架
<script language="JavaScript"><!--
  if (window == top)top.location.href = "frames.htm"; //frames.htm为框架网页
// --></script>

9.  防止被人frame
<SCRIPT LANGUAGE=JAVASCRIPT><!--
  if (top.location != self.location)top.location=self.location;
// --></SCRIPT>

10. <noscript><iframe src=*.html></iframe></noscript>     网页将不能被另存为

11. <input type=button value=查看网页源代码
onclick="window.location = 'view-source:'+ 'http://www.csdn.net/'">

12. 怎样通过asp的手段来检查来访者是否用了代理
<% if Request.ServerVariables("HTTP_X_FORWARDED_FOR")<>"" then
response.write "<font color=#FF0000>您通过了代理服务器,"& _
"真实的IP为"&Request.ServerVariables("HTTP_X_FORWARDED_FOR")
end if
%>

13. 取得控件的绝对位置

//Javascript
<script language="Javascript">
function getIE(e){
  var t=e.offsetTop;
  var l=e.offsetLeft;
  while(e=e.offsetParent){
    t+=e.offsetTop;
    l+=e.offsetLeft;
    }
  alert("top="+t+"\nleft="+l);
  }
</script>

//VBScript
<script language="VBScript"><!--
function getIE()
  dim t,l,a,b
  set a=document.all.img1
  t=document.all.img1.offsetTop
  l=document.all.img1.offsetLeft
  while a.tagName<>"BODY"
    set a = a.offsetParent
    t=t+a.offsetTop
    l=l+a.offsetLeft
  wend
  msgbox "top="&t&chr(13)&"left="&l,64,"得到控件的位置"
end function
--></script>

14. 光标是停在文本框文字的最后
<script language="javascript">
function cc()
{
  var e = event.srcElement;
  var r =e.createTextRange();
  r.moveStart('character',e.value.length);
  r.collapse(true);
  r.select();
}
</script>
<input type=text name=text1 value="123" onfocus="cc()">

15. 判断上一页的来源
asp:
request.servervariables("HTTP_REFERER")

java script:
document.referrer

16. 最小化、最大化、关闭窗口
<object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Minimize"></object>
<object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Maximize"></object>
<OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<PARAM NAME="Command" VALUE="Close"></OBJECT>

<input type=button value=最小化 onclick=hh1.Click()>
<input type=button value=最大化 onclick=hh2.Click()>
<input type=button value=关闭 onclick=hh3.Click()>
本例适用于IE

17.
<%
'定义数据库连接的一些常量
Const adOpenForwardOnly     = 0 '游标只向前浏览记录,不支持分页、Recordset、BookMark
Const adOpenKeyset          = 1 '键集游标,其他用户对记录说做的修改将反映到记录集中,但其他用户增加或删除记录不会反映到记录集中。支持分页、Recordset、BookMark
Const adOpenDynamic         = 2 '动态游标功能最强,但耗资源也最多。用户对记录说做的修改,增加或删除记录都将反映到记录集中。支持全功能浏览(ACCESS不支持)。
Const adOpenStatic          = 3 '静态游标,只是数据的一个快照,用户对记录说做的修改,增加或删除记录都不会反映到记录集中。支持向前或向后移动

Const adLockReadOnly        = 1 '锁定类型,默认的,只读,不能作任何修改
Const adLockPessimistic     = 2 '当编辑时立即锁定记录,最安全的方式
Const adLockOptimistic      = 3 '只有在调用Update方法时才锁定记录集,而在此前的其他操作仍可对当前记录进行更改、插入和删除等
Const adLockBatchOptimistic = 4 '当编辑时记录不会被锁定,而更改、插入和删除是在批处理方式下完成的

Const adCmdText  = &H0001
Const adCmdTable = &H0002
%>

18. 网页不会被缓存
HTM网页
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
或者<META HTTP-EQUIV="expires" CONTENT="0">
ASP网页
  Response.Expires = -1
  Response.ExpiresAbsolute = Now() - 1
  Response.cachecontrol = "no-cache"
PHP网页
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");


19. 检查一段字符串是否全由数字组成
<script language="Javascript"><!--
function checkNum(str){return str.match(/\D/)==null}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
// --></script>

20. 获得一个窗口的大小
document.body.clientWidth,document.body.clientHeight

21. 怎么判断是否是字符
if (/[^\x00-\xff]/g.test(s)) alert("含有汉字");
else alert("全是字符");

22.TEXTAREA自适应文字行数的多少
<textarea rows=1 name=s1 cols=27 onpropertychange="this.style.posHeight=this.scrollHeight">
</textarea>

23. 日期减去天数等于第二个日期
<script language=Javascript>
function cc(dd,dadd)
{
//可以加上错误处理
var a = new Date(dd)
a = a.valueOf()
a = a - dadd * 24 * 60 * 60 * 1000
a = new Date(a)
alert(a.getFullYear() + "年" + (a.getMonth() + 1) + "月" + a.getDate() + "日")
}
cc("12/23/2002",2)
</script>

24. 选择了哪一个Radio
<HTML><script language="vbscript">
function checkme()
  for each ob in radio1
    if ob.checked then window.alert ob.value
  next
end function
</script><BODY>
<INPUT name="radio1" type="radio" value="style" checked>Style
<INPUT name="radio1" type="radio" value="barcode">Barcode
<INPUT type="button" value="check" onclick="checkme()">
</BODY></HTML>

25.获得本页url的request.servervariables("")集合
Response.Write "<TABLE border=1><!-- Table Header --><TR><TD><B>Variables</B></TD><TD><B>Value</B></TD></TR>"
for each ob in Request.ServerVariables
Response.Write "<TR><TD>"&ob&"</TD><TD>"&Request.ServerVariables(ob)&"</TD></TR>"
next
Response.Write "</TABLE>"

26.
本机ip<%=request.servervariables("remote_addr")%>
服务器名<%=Request.ServerVariables("SERVER_NAME")%>
服务器IP<%=Request.ServerVariables("LOCAL_ADDR")%>
服务器端口<%=Request.ServerVariables("SERVER_PORT")%>
服务器时间<%=now%>
IIS版本<%=Request.ServerVariables"SERVER_SOFTWARE")%>
脚本超时时间<%=Server.ScriptTimeout%>
本文件路径<%=server.mappath(Request.ServerVariables("SCRIPT_NAME"))%>
服务器CPU数量<%=Request.ServerVariables("NUMBER_OF_PROCESSORS")%>
服务器解译引擎<%=ScriptEngine & "/"& ScriptEngineMajorVersion &"."&ScriptEngineMinorVersion&"."& ScriptEngineBuildVersion %>
服务器操作系统<%=Request.ServerVariables("OS")%>

27.ENTER键可以让光标移到下一个输入框
<input onkeydown="if(event.keyCode==13)event.keyCode=9">

28. 检测某个网站的链接速度:
把如下代码加入<body>区域中:
<script language=Javascript>
tim=1
setInterval("tim++",100)
b=1

var autourl=new Array()
autourl[1]="www.njcatv.net"
autourl[2]="javacool.3322.net"
autourl[3]="www.sina.com.cn"
autourl[4]="www.nuaa.edu.cn"
autourl[5]="www.cctv.com"

function butt(){
documents.write("<form name=autof>")
for(var i=1;i<autourl.length;i++)
documents.write("<input type=text name=txt"+i+" size=10 value=测试中……> =》<input type=text name=url"+i+" size=40> =》<input type=button value=GO onclick=windows.open(this.form.url"+i+".value)><br/>")
documents.write("<input type=submit value=刷新></form>")
}
butt()
function auto(url){
document.forms[0]["url"+b].value=url
if(tim>200)
{document.forms[0]["txt"+b].value="链接超时"}
else
{document.forms[0]["txt"+b].value="时间"+tim/10+"秒"}
b++
}
function run(){for(var i=1;i<autourl.length;i++)documents.write("<img src=http://"+autourl[i]+"/"+Math.random()+" width=1 height=1 onerror=auto('http://"+autourl[i]+"')>")}
run()</script>


29. 各种样式的光标
auto          :标准光标
default       :标准箭头
hand          :手形光标
wait          :等待光标
text          :I形光标
vertical-text :水平I形光标
no-drop       :不可拖动光标
not-allowed   :无效光标
help          :?帮助光标
all-scroll    :三角方向标
move          :移动标
crosshair     :十字标
e-resize
n-resize
nw-resize
w-resize
s-resize
se-resize
sw-resize

1.本地无缓存,每次自动刷新
response.expires=0
response.addHeader "pragma" , "no-cache"
response.addHeader "cache-control" , "private"

2.修改contentType并下载gif等格式
<%
function dl(f,n)
on error resume next

set s=CreateObject("Adodb.Stream")
S.Mode=3
S.Type=1
S.Open
s.LoadFromFile(server.mappath(f))
if err.number>0 then
  response.write err.number & ":" & err.description
else
  response.contentType="application/x-gzip"
  response.addheader "Content-Disposition:","attachment; filename=" & n
  response.binarywrite(s.Read(s.size))
end if
end function

call dl("012922501.gif","t1.gif")
%>


19. 检查一段字符串是否全由数字组成
<script language="Javascript"><!--
function checkNum(str){return !/\D/.test(str)}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
// --></script>

20. 获得一个窗口的大小
document.body.clientWidth,document.body.clientHeight
document.body.offsetWidth,document.body.offsetHeight
有时还需要知道window.screenTop,window.screenLeft

21. 怎么判断是否含有汉字
if (escape(str).indexOf("%u")!=-1) alert("含有汉字");
else alert("全是字符");

22.TEXTAREA自适应文字行数的多少
IE 5.5+ 可以用 overflow-y:visible
<textarea rows=1 name=s1 cols=27 style="overflow-y:visible">
</textarea>

23. 日期减去天数等于第二个日期
<script language=Javascript>
function cc(dd,dadd)
{
//可以加上错误处理
var d = new Date(dd.replace("-","/"))
d.setDate(d.getDate()+dadd)
alert(d.getFullYear() + "年" + (d.getMonth() + 1) + "月" + d.getDate() + "日")
}
cc("2002-2-28",2)
</script>

- 作者: guanjinhai 2005年06月11日, 星期六 19:35  回复(0) |  引用(1) 加入博采