Archive for 05月, 2005
网络安全技术纵览
21世纪全世界的计算机都将通过Internet联到一起,随着Internet的发展,网络丰富的信息资源给用户带来了极大的方便,但同时也给上网用户带来了安全问题。由于Internet的开放性和超越组织与国界等特点,使它在安全性上存在一些隐患。而且信息安全的内涵也发生了根本的变化。它不仅从一般性的防卫变成了一种非常普通的防范,而且还从一种专门的领域变成了无处不在。
一、网络安全的概念
国际标准化组织(ISO)对计算机系统安全的定义是:为数据处理系统建立和采用的技术和管理的安全保护,保护计算机硬件、软件和数据不因偶然和恶意的原因遭到破坏、更改和泄露。由此可以将计算机网络的安全理解为:通过采用各种技术和管理措施,使网络系统正常运行,从而确保网络数据的可用性、完整性和保密性。所以,建立网络安全保护措施的目的是确保经过网络传输和交换的数据不会发生增加、修改、丢失和泄露等。
二、Internet上存在的主要安全隐患
Internet的安全隐患主要体现在下列几方面:
1. Internet是一个开放的、无控制机构的网络,黑客(Hacker)经常会侵入网络中的计算机系统,或窃取机密数据和盗用特权,或破坏重要数据,或使系统功能得不到充分发挥直至瘫痪。
2. Internet的数据传输是基于TCP/IP通信协议进行的,这些协议缺乏使传输过程中的信息不被窃取的安全措施。
3. Internet上的通信业务多数使用Unix操作系统来支持,Unix操作系统中明显存在的安全脆弱性问题会直接影响安全服务。
4.在计算机上存储、传输和处理的电子信息,还没有像传统的邮件通信那样进行信封保护和签字盖章。信息的来源和去向是否真实,内容是否被改动,以及是否泄露等,在应用层支持的服务协议中是凭着君子协定来维系的。
5.电子邮件存在着被拆看、误投和伪造的可能性。使用电子邮件来传输重要机密信息会存在着很大的危险。
6.计算机病毒通过Internet的传播给上网用户带来极大的危害,病毒可以使计算机和计算机网络系统瘫痪、数据和文件丢失。在网络上传播病毒可以通过公共匿名FTP文件传送、也可以通过邮件和邮件的附加文件传播。
三、网络安全防范的内容
一个安全的计算机网络应该具有可靠性、可用性、完整性、保密性和真实性等特点。计算机网络不仅要保护计算机网络设备安全和计算机网络系统安全,还要保护数据安全等。因此针对计算机网络本身可能存在的安全问题,实施网络安全保护方案以确保计算机网络自身的安全性是每一个计算机网络都要认真对待的一个重要问题。网络安全防范的重点主要有两个方面:一是计算机病毒,二是黑客犯罪。
计算机病毒是我们大家都比较熟悉的一种危害计算机系统和网络安全的破坏性程序。黑客犯罪是指个别人利用计算机高科技手段,盗取密码侵入他人计算机网络,非法获得信息、盗用特权等,如非法转移银行资金、盗用他人银行帐号购物等。随着网络经济的发展和电子商务的展开,严防黑客入侵、切实保障网络交易的安全,不仅关系到个人的资金安全、商家的货物安全,还关系到国家的经济安全、国家经济秩序的稳定问题,因此各级组织和部门必须给予高度重视。
四、确保网络安全的主要技术
1,防火墙技术
网络防火墙技术是一种用来加强网络之间访问控制,防止外部网络用户以非法手段通过外部网络进入内部网络,访问内部网络资源,保护内部网络操作环境的特殊网络互联设备。它对两个或多个网络之间传输的数据包如链接方式按照一定的安全策略来实施检查,以决定网络之间的通信是否被允许,并监视网络运行状态。
目前的防火墙产品主要有堡垒主机、包过滤路由器、应用层网关(代理服务器)以及电路层网关、屏蔽主机防火墙、双宿主机等类型。
防火墙处于5层网络安全体系中的最底层,属于网络层安全技术范畴。负责网络间的安全认证与传输,但随着网络安全技术的整体发展和网络应用的不断变化,现代防火墙技术已经逐步走向网络层之外的其他安全层次,不仅要完成传统防火墙的过滤任务,同时还能为各种网络应用提供相应的安全服务。另外还有多种防火墙产品正朝着数据安全与用户认证、防止病毒与黑客侵入等方向发展。
根据防火墙所采用的技术不同,我们可以将它分为四种基本类型:包过滤型、网络地址转换-NAT、代理型和监测型。具体如下:
(1)包过滤型
包过滤型产品是防火墙的初级产品,其技术依据是网络中的分包传输技术。网络上的数据都是以"包"为单位进行传输的,数据被分割成为一定大小的数据包,每一个数据包中都会包含一些特定信息,如数据的源地址、目标地址、TCP/UDP源端口和目标端口等。防火墙通过读取数据包中的地址信息来判断这些"包"是否来自可信任的安全站点,一旦发现来自危险站点的数据包,防火墙便会将这些数据拒之门外。系统管理员也可以根据实际情况灵活制订判断规则。
包过滤技术的优点是简单实用,实现成本较低,在应用环境比较简单的情况下,能够以较小的代价在一定程度上保证系统的安全。
但包过滤技术的缺陷也是明显的。包过滤技术是一种完全基于网络层的安全技术,只能根据数据包的来源、目标和端口等网络信息进行判断,无法识别基于应用层的恶意侵入,如恶意的Java小程序以及电子邮件中附带的病毒。有经验的黑客很容易伪造IP地址,骗过包过滤型防火墙。
(2)网络地址转化-NAT
网络地址转换是一种用于把IP地址转换成临时的、外部的、注册的IP地址标准。它允许具有私有IP地址的内部网络访问因特网。它还意味着用户不许要为其网络中每一台机器取得注册的IP地址。
NAT的工作过程是:在内部网络通过安全网卡访问外部网络时,将产生一个映射记录。系统将外出的源地址和源端口映射为一个伪装的地址和端口,让这个伪装的地址和端口通过非安全网卡与外部网络连接,这样对外就隐藏了真实的内部网络地址。在外部网络通过非安全网卡访问内部网络时,它并不知道内部网络的连接情况,而只是通过一个开放的IP地址和端口来请求访问。OLM防火墙根据预先定义好的映射规则来判断这个访问是否安全。当符合规则时,防火墙认为访问是安全的,可以接受访问请求,也可以将连接请求映射到不同的内部计算机中。当不符合规则时,防火墙认为该访问是不安全的,不能被接受,防火墙将屏蔽外部的连接请求。网络地址转换的过程对于用户来说是透明的,不需要用户进行设置,用户只要进行常规操作即可。
(3)代理型
代理型防火墙也可以被称为代理服务器,它的安全性要高于包过滤型产品,并已经开始向应用层发展。代理服务器位于客户机与服务器之间,完全阻挡了二者间的数据交流。从客户机来看,代理服务器相当于一台真正的服务器;而从服务器来看,代理服务器又是一台真正的客户机。当客户机需要使用服务器上的数据时,首先将数据请求发给代理服务器,代理服务器再根据这一请求向服务器索取数据,然后再由代理服务器将数据传输给客户机。由于外部系统与内部服务器之间没有直接的数据通道,外部的恶意侵害也就很难伤害到企业内部网络系统。
代理型防火墙的优点是安全性较高,可以针对应用层进行侦测和扫描,对付基于应用层的侵入和病毒都十分有效。其缺点是对系统的整体性能有较大的影响,而且代理服务器必须针对客户机可能产生的所有应用类型逐一进行设置,大大增加了系统管理的复杂性。
(4)监测型
监测型防火墙是新一代的产品,这一技术实际已经超越了最初的防火墙定义。监测型防火墙能够对各层的数据进行主动的、实时的监测,在对这些数据加以分析的基础上,监测型防火墙能够有效地判断出各层中的非法侵入。同时,这种检测型防火墙产品一般还带有分布式探测器,这些探测器安置在各种应用服务器和其他网络的节点之中,不仅能够检测来自网络外部的攻击,同时对来自内部的恶意破坏也有极强的防范作用。据权威机构统计,在针对网络系统的攻击中,有相当比例的攻击来自网络内部。因此,监测型防火墙不仅超越了传统防火墙的定义,而且在安全性上也超越了前两代产品。
虽然监测型防火墙安全性上已超越了包过滤型和代理服务器型防火墙,但由于监测型防火墙技术的实现成本较高,也不易管理,所以目前在实用中的防火墙产品仍然以第二代代理型产品为主,但在某些方面也已经开始使用监测型防火墙。基于对系统成本与安全技术成本的综合考虑,用户可以选择性地使用某些监测型技术。这样既能够保证网络系统的安全性需求,同时也能有效地控制安全系统的总拥有成本。
虽然防火墙是目前保护网络免遭黑客袭击的有效手段,但也有明显不足:无法防范通过防火墙以外的其它途径的攻击,不能防止来自内部变节者和不经心的用户们带来的威胁,也不能完全防止传送已感染病毒的软件或文件,以及无法防范数据驱动型的攻击。
2.加密技术
信息交换加密技术分为两类:即对称加密和非对称加密。具体如下:
(1)对称加密技术
在对称加密技术中,对信息的加密和解密都使用相同的钥,也就是说一把钥匙开一把锁。这种加密方法可简化加密处理过程,信息交换双方都不必彼此研究和交换专用的加密算法。如果在交换阶段私有密钥未曾泄露,那么机密性和报文完整性就可以得以保证。对称加密技术也存在一些不足,如果交换一方有N个交换对象,那么他就要维护N个私有密钥,对称加密存在的另一个问题是双方共享一把私有密钥,交换双方的任何信息都是通过这把密钥加密后传送给对方的。
(2)非对称加密技术
在非对称加密体系中,密钥被分解为一对(即公开密钥和私有密钥)。这对密钥中任何一把都可以作为公开密钥(加密密钥)通过非保密方式向他人公开,而另一把作为私有密钥(解密密钥)加以保存。公开密钥用于加密,私有密钥用于解密,私有密钥只能有生成密钥的交换方掌握,公开密钥可广泛公布,但它只对应于生成密钥的交换方。非对称加密方式可以使通信双方无须事先交换密钥就可以建立安全通信,广泛应用于身份认证、数字签名等信息交换领域。非对称加密体系一般是建立在某些已知的数学难题之上,是计算机复杂性理论发展的必然结果。最具有代表性是RSA公钥密码体制。
RSA算法是Rivest、Shamir和Adleman于1977年提出的第一个完善的公钥密码体制,其安全性是基于分解大整数的困难性。在RSA体制中使用了这样一个基本事实:到目前为止,无法找到一个有效的算法来分解两大素数之积。RSA算法的描述如下:
公开密钥:n=pq(p、q分别为两个互异的大素数,p、q必须保密)
e与(p-1)(q-1)互素
私有密钥:d=e-1 {mod(p-1)(q-1)}
加密:c=me(mod n),其中m为明文,c为密文。
解密:m=cd(mod n)
利用目前已经掌握的知识和理论,分解2048bit的大整数已经超过了64位计算机的运算能力,因此在目前和预见的将来,它是足够安全的。
4.虚拟专用网技术
虚拟专用网(Virtual Private Network,VPN)是近年来随着Internet的发展而迅速发展起来的一种技术。现代企业越来越多地利用Internet资源来进行促销、销售、售后服务,乃至培训、合作等活动。许多企业趋向于利用Internet来替代它们私有数据网络。这种利用Internet来传输私有信息而形成的逻辑网络就称为虚拟专用网。
虚拟专用网实际上就是将Internet看作一种公有数据网,这种公有网和PSTN网在数据传输上没有本质的区别,从用户观点来看,数据都被正确传送到了目的地。相对地,企业在这种公共数据网上建立的用以传输企业内部信息的网络被称为私有网。
目前VPN主要采用四项技术来保证安全,这四项技术分别是隧道技术(Tunneling)、加解密技术(Encryption & Decryption)、密钥管理技术(Key Management)、使用者与设备身份认证技术(Authentication)。
(1)隧道技术
隧道技术是一种通过使用互联网络的基础设施在网络之间传递数据的方式。使用隧道传递的数据(或负载)可以是不同协议的数据帧或包。隧道协议将这些其它协议的数据帧或包重新封装在新的包头中发送。新的包头提供了路由信息,从而使封装的负载数据能够通过互联网络传递。
被封装的数据包在隧道的两个端点之间通过公共互联网络进行路由。被封装的数据包在公共互联网络上传递时所经过的逻辑路径称为隧道。一旦到达网络终点,数据将被解包并转发到最终目的地。注意隧道技术是指包括数据封装,传输和解包在内的全过程。
(2)加解密技术
对通过公共互联网络传递的数据必须经过加密,确保网络其他未授权的用户无法读取该信息。加解密技术是数据通信中一项较成熟的技术,VPN可直接利用现有技术。
(3)密钥管理技术
密钥管理技术的主要任务是如何在公用数据网上安全地传递密钥而不被窃取。现行密钥管理技术又分为SKIP与ISAKMP/OAKLEY两种。SKIP主要是利用Diffie-Hellman的演算法则,在网络上传输密钥;在ISAKMP中,双方都有两把密钥,分别用于公用、私用。
(4)使用者与设备身份认证技术
VPN方案必须能够验证用户身份并严格控制只有授权用户才能访问VPN。另外,方案还必须能够提供审计和记费功能,显示何人在何时访问了何种信息。身份认证技术最常用的是使用者名称与密码或卡片式认证等方式。
VPN整合了范围广泛的用户,从家庭的拨号上网用户到办公室连网的工作站,直到ISP的Web服务器。用户类型、传输方法,以及由VPN使用的服务的混合性,增加了VPN设计的复杂性,同时也增加了网络安全的复杂性。如果能有效地采用VPN技术,是可以防止欺诈、增强访问控制和系统控制、加强保密和认证的。选择一个合适的VPN解决方案可以有效地防范网络黑客的恶意攻击。
5.安全隔离
网络的安全威胁和风险主要存在于三个方面:物理层、协议层和应用层。网络线路被恶意切断或过高电压导致通信中断,属于物理层的威胁;网络地址伪装、Teardrop碎片攻击、SYNFlood等则属于协议层的威胁;非法URL提交、网页恶意代码、邮件病毒等均属于应用层的攻击。从安全风险来看,基于物理层的攻击较少,基于网络层的攻击较多,而基于应用层的攻击最多,并且复杂多样,难以防范。
面对新型网络攻击手段的不断出现和高安全网络的特殊需求,全新安全防护理念–"安全隔离技术"应运而生。它的目标是,在确保把有害攻击隔离在可信网络之外,并保证可信网络内部信息不外泄的前提下,完成网间信息的安全交换。
隔离概念的出现,是为了保护高安全度网络环境,隔离产品发展至今共经历了五代。
第一代隔离技术,完全的隔离。采用完全独立的设备、存储和线路来访问不同的网络,做到了完全的物理隔离,但需要多套网络和系统,建设和维护成本较高。
第二代隔离技术,硬件卡隔离。通过硬件卡控制独立存储和分时共享设备与线路来实现对不同网络的访问,它仍然存在使用不便、可用性差等问题,有的设计上还存在较大的安全隐患。
第三代隔离技术,数据转播隔离。利用转播系统分时复制文件的途径来实现隔离,切换时间较长,甚至需要手工完成,不仅大大降低了访问速度,更不支持常见的网络应用,只能完成特定的基于文件的数据交换。
第四代隔离技术,空气开关隔离。该技术是通过使用单刀双掷开关,通过内外部网络分时访问临时缓存器来完成数据交换的,但存在支持网络应用少、传输速度慢和硬件故障率高等问题,往往成为网络的瓶颈。
第五代隔离技术,安全通道隔离。此技术通过专用通信硬件和专有交换协议等安全机制,来实现网络间的隔离和数据交换,不仅解决了以往隔离技术存在的问题,并且在网络隔离的同时实现高效的内外网数据的安全交换,它透明地支持多种网络应用,成为当前隔离技术的发展方向。
ASP生成随机密码的又一种方法
ASP生成随机密码的又一种方法
dim char_array(35)
char_array(0) = ‘0′
char_array(1) = ‘1′
char_array(2) = ‘2′
char_array(3) = ‘3′
char_array(4) = ‘4′
char_array(5) = ‘5′
char_array(6) = ‘6′
char_array(7) = ‘7′
char_array(8) = ‘8′
char_array(9) = ‘9′
char_array(10) = ‘A’
char_array(11) = ‘B’
char_array(12) = ‘C’
char_array(13) = ‘D’
char_array(14) = ‘E’
char_array(15) = ‘F’
char_array(16) = ‘G’
char_array(17) = ‘H’
char_array(18) = ‘I’
char_array(19) = ‘J’
char_array(20) = ‘K’
char_array(21) = ‘L’
char_array(22) = ‘M’
char_array(23) = ‘N’
char_array(24) = ‘O’
char_array(25) = ‘P’
char_array(26) = ‘Q’
char_array(27) = ‘R’
char_array(28) = ‘S’
char_array(29) = ‘T’
char_array(30) = ‘U’
char_array(31) = ‘V’
char_array(32) = ‘W’
char_array(33) = ‘X’
char_array(34) = ‘Y’
char_array(35) = ‘Z’
randomize
do while len(output) num = char_array(Int(35 * Rnd + 0))
output = output + num
loop
gen_key = output
End Function
response.write ‘随机密码是:’ & gen_key(10)
这是一个生成随机数的通用函数,我们首先将所有可能的字符保存在数组内,这里的例子是0-9及26个英文字符,共36个字符。注意数组下标是从0开始的,所以dim char_array(35),其实表示有36个字符。注意:本例没有专门区分字母的大小写,如果你还要加上“大小写敏感/区分大小写”特性的话,修改数组大小为char_array(50),然后在后面列出所有可能的小写字符。例如:
char_array(36) = ‘a’
char_array(37) = ‘b’
……………类推
注意这是一个可以通用的函数,gen_key(digits)它传进一个参数digits,代表要生成的随机密码位数。今后要生成20为密码就用gen_key(20)即可打印出密码,或者将它保存在数据库内。
浅谈ASP中Web页面间的数据传递
浅谈ASP中Web页面间的数据传递
【简 介】
基于Web的动态网页设计必会涉及到页面间的数据传递,文章探讨了ASP设计中常用的Web页面间的数据传递方式,分析各种数据传递方式的使用方法、使用场合及优缺点,其都是设计阶段选择数据传递方式考虑的关键
往往使用动态网页技术制作ASP应用程序时一般至少拥有二个或二个以上的Web页面,这时就得考虑在多个Web页面间传递数据的处理工作。而ASP应用程序的各个页面类似于Windows应用程序的form窗体,Windows应用程序各form间数据传递可以通过定义全局变量等方法来实现。网页间的数据传递有多种不同的可使用方式,而Web页面间的数据传递方式选择是否恰当对系统设计及运行的合理性与安全性起到举足轻重的作用。
1、URL方式
URL方式是实现Web间数据传递最基本的方法,操作简单,可很方便地实现不同Web页面间的数据传递,但其安全性比较差。将要传递的数据附加在网页地址(URL)后面进行传递。如:http://www.cstvu.com/testweb?username=liming,其中?后面所跟着的字符串便是传递的数据,=前的是变量名,=后面是数值,可以使用request对象来获取传递的数据。如:request(“username”)。这种方法在传递数据过程中其数据内容在URL栏中是显示的,用户能看到提交的内容。
2、form方式
通过在网页上制作表单交互区域,用户在浏览器端输入数据,然后通过form提交到服务器,在提交后的接受form数据的页面里就可以接收到相应数据,即form的action页面中可以使用request对象来接收所传递的数据。
如:
发送页面:
<form name=“formtest” action=“targetweb.asp”>
<input name=“testtext” type=“text” value=“”>
<input name=“testbutton” type =“submit”value =“提交”>
</form>
接收页面:request(“testtext”)
利用form页面的文本框来接收用户数据的输入,通过submit按钮提交后在targetweb页面中使用request来接收数据。
3、cookie方式
cookie是在浏览页面时Web服务器在浏览器端所写入的一些小文件,cookie是存放在浏览器端本机磁盘上,而不是存放在服务端的。可以在发送数据时写入cookie,接收时读取cookie完成数据在Web页面间的传送。
如:
发送页面:response.cookies(“cookiename”)(“username”)=“liming”
接收页面:request.cookie(“cookiename”)(“username”)
在发送页面中对cookie变量赋值,接收页面中取cookie变量的值就是所传递的数据。
4、application对象
application对象是用来记录整个网站信息的,是记录不同浏览器端共享的变量,无论有几个浏览者同时存取网页,都只会产生一个application对象实例。用户可以通过定义application整站共享变量来实现网页间的数据传递。其定义方法是:application(“变量名”)=数值
如:application(“usrname”)=liming
application对象所定义的变量对于所有浏览端都是可见的,所以其使用场合是所有浏览端共享的全局数据传递。
5、session对象
session对象是用来记录浏览器端的变量,是个别浏览器端专用的变量,对于每一个浏览器访问时都会自动产生一个seseion对象,该对象提供一个存储场所,用来存储仅仅对该访问者在会话的活动期间打开的网页可用的变量和对象。这样就用可以用来在Web间传递专对单个浏览器端使用的数据。其定义方法:session(“变量名”)=数值
如:session(“usename”)=liming
session对象所定义的变量只是浏览器端的专用变量,所以适用于局部会话间的网页数据传递。
6、结束语
上述介绍的是网页间数据传递的常用方法,各有千秋。其中URL方式和form方式实现方法简单,可实现网页间的简单数据传递,一般为字符串类型,其特点是安全性差,而且必须是连续访问两页面间数据传递。Cookie只能存放string类型的数据,如果想要存放更为复杂的数据类型,那么必须先将其转换为string类型。Application对象和Session对象操作相对复杂些,浏览量非常大的网页使用时应适量,而且使用结束后尽量清除,否则大量使用有可能会导致服务器的瘫痪。Session变量的安全性较高,可传递专用浏览端数据。具体应用决定了数据传递方式的选择,合理数据传递方式选择是Web页面的设计中的关键考虑因素。
ASP小偷(远程数据获取)程序的入门教程
ASP小偷(远程数据获取)程序的入门教程
这里所说的“小偷”指的是在ASP中运用XML中的XMLHTTP组件提供的强大功能,把远程网站上的数据(图片,网页及其他文件)抓取到本地,经过各种处理后显示到页面上或者存储进数据库的一类程序。你可以通过这种小偷程序,完成过去一些似乎完全不可能实现的任务,比如说把某个站的页面偷梁换柱后变成自己的页面,或者把某个站的一些数据(文章,图片)保存到本地数据库中加以利用。“小偷”的优点有:无须维护网站,因为小偷程序中的数据来自其他网站,它将随着该网站的更新而更新;可以节省大量的服务器资源,一般小偷程序就几个文件,所有网页内容都是来自其他网站。缺点在于:不稳定,如果目标网站出错,程序也会出错,而且,如果目标网站进行升级维护,那么小偷程序也要进行相应修改;速度,因为是远程调用,速度和在本地服务器上读取数据比起来,肯定要慢一些。怎么样,听起来很神奇吧?我们现在就开始来学习一些“小偷”程序的入门知识吧!
我们拿个简单点的东西来研究一下吧,QQ网站上的天气预报程序
代码如下:
<%
On Error Resume Next
Server.ScriptTimeOut=9999999
Function getHTTPPage(Path)
t = GetBody(Path)
getHTTPPage=BytesToBstr(t,"GB2312")
End function
’首先,进行小偷程序的一些初始化设置,以上代码的作用分别是忽略掉所有非致命性错误,把小偷程序的运行超时时间设置得很长(这样不会出现运行超时的错误),转换原来默认的UTF-8编码转换成GB2312编码,否则直接用XMLHTTP组件调用有中文字符的网页得到的将是乱码。
Function GetBody(url)
on error resume next
Set Retrieval = CreateObject("Microsoft.XMLHTTP")
With Retrieval
.Open "Get", url, False, "", ""
.Send
GetBody = .ResponseBody
End With
Set Retrieval = Nothing
End Function
’然后调用XMLHTTP组件创建一个对象并进行初始化设置。
Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.CreateObject("adodb.stream")
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function
Function Newstring(wstr,strng)
Newstring=Instr(lcase(wstr),lcase(strng))
if Newstring<=0 then Newstring=Len(wstr)
End Function
’处理抓取回来的数据需要调用adodb.stream组件并进行初始化设置。%>
’以下即为页面显示部分
<%
Dim wstr,str,url,start,over,city
’定义一些需要使用到的变量
city = Request.QueryString("id")
’程序传回的ID变量(即用户选择的城市)赋给id
url="http://appnews.qq.com/cgi-bin/news_qq_search?city="&city&""
’这里设置需要抓取的页面地址,当然你也可以直接指定某个地址而不使用变量
wstr=getHTTPPage(url)
’获取指定页面的全部数据
start=Newstring(wstr," <html>")
’这里设置需要处理的数据的头部,这个变量应视不同情况而设置,具体内容可以通过查看需要抓取的页面的源代码来确定。因为在这个程序里我们需要抓取整个页面,所以设置为页面全部抓取。注意,设置的内容必须是页面内容唯一的,不可以重复。
over=Newstring(wstr," </HTML>")
’和start相对应的就是需要处理的数据的尾部,同样的,设置的内容必须是页面中唯一的。
body=mid(wstr,start,over-start)
’设置显示页面的范围
’下面就是动用乾坤挪移+++的时候了,通过replace可以用一些字符替换掉数据中指定的字符。
body = replace(body,"skin1","天气预报 – 斯克网络")
body = replace(body,"http://appnews.qq.com/cgi-bin/news_qq_search?city","tianqi.asp?id")
’本程序中已经完成了替换的工作,如果有其他需要的话可以继续进行类似的替换操作。
response.write body
%>
替换完需要修改的内容后,就可以把修改的内容显示在页面上了。至此程序结束
程序使用方法及结果:把上述代码去掉说明部分后保存为tianqi.asp,上传到支持ASP和XML的空间下,在浏览器中运行即可。你可以在在这个程序的基础上进行进一步的界面美化或者程序优化。
以上只是一些关于XMLHTTP组件的初级应用,实际上它还能实现的功能还有很多,比如说保存远程图片到本地服务器上,配合adodb.stream组件可以把获取来的数据保存进数据库。小偷的作用和使用范围都很广。但是不可以拿来做违法的事哦!
也许还有人要问了,这种“小偷”程序难道只是ASP的专利吗?非也,PHP通过fopen函数一样可以实现同样的效果,由于PHP本身的各种特点,写出来的小偷程序和ASP相比,在体积和执行效率上都有者明显的优势,但限于篇幅,这里就不一一说明了。
1小时ASP入门,非常简单
1小时ASP入门,非常简单
<%
语句
……
%>
<2>定义变量dim语句
<%
dim a,b
a=10
b=”ok!”
%>
注意:定义的变量可以是数值型,也可以是字符或者其他类型的
<3>简单的控制流程语句
1. If 条件1 then
语句1
elseif 条件2 then
语句2
else
语句3
endif
2.while 条件
语句
wend
3.for count=1 to n step m
语句1
exit for
语句2
next
二.ASP数据库简单性作教程
<1>.数据库连接(用来单独编制连接文件conn.asp)
<%
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("\bbs\db1\user.mdb")
%>
(用来连接bbs\db1\目录下的user.mdb数据库)
<2>显示数据库记录
原理:将数据库中的记录一一显示到客户端浏览器,依次读出数据库中的每一条记录
如果是从头到尾:用循环并判断指针是否到末 使用: not rs.eof
如果是从尾到头:用循环并判断指针是否到开始 使用:not rs.bof
<!–#include file=conn.asp–> (包含conn.asp用来打开bbs\db1\目录下的user.mdb数据库)
<%
set rs=server.CreateObject("adodb.recordset") (建立recordset对象)
sqlstr="select * from message" —->(message为数据库中的一个数据表,即你要显示的数据所存放的数据表)
rs.open sqlstr,conn,1,3 —->(表示打开数据库的方式)
rs.movefirst —->(将指针移到第一条记录)
while not rs.eof —->(判断指针是否到末尾)
response.write(rs("name")) —->(显示数据表message中的name字段)
rs.movenext —->(将指针移动到下一条记录)
wend —->(循环结束)
——————————————————
rs.close
conn.close 这几句是用来关闭数据库
set rs=nothing
set conn=nothing
——————————————————-
%>
其中response对象是服务器向客户端浏览器发送的信息
<3>增加数据库记录
增加数据库记录用到rs.addnew,rs.update两个函数
<!–#include file=conn.asp–> (包含conn.asp用来打开bbs\db1\目录下的user.mdb数据库)
<%
set rs=server.CreateObject("adodb.recordset") (建立recordset对象)
sqlstr="select * from message" —->(message为数据库中的一个数据表,即你要显示的数据所存放的数据表)
rs.open sqlstr,conn,1,3 —->(表示打开数据库的方式)
rs.addnew 新增加一条记录
rs("name")="xx" 将xx的值传给name字段
rs.update 刷新数据库
——————————————————
rs.close
conn.close 这几句是用来关闭数据库
set rs=nothing
set conn=nothing
——————————————————-
%>
<4>删除一条记录
删除数据库记录主要用到rs.delete,rs.update
<!–#include file=conn.asp–> (包含conn.asp用来打开bbs\db1\目录下的user.mdb数据库)
<%
dim name
name="xx"
set rs=server.CreateObject("adodb.recordset") (建立recordset对象)
sqlstr="select * from message" —->(message为数据库中的一个数据表,即你要显示的数据所存放的数据表)
rs.open sqlstr,conn,1,3 —->(表示打开数据库的方式)
——————————————————-
while not rs.eof
if rs.("name")=name then
rs.delete
rs.update 查询数据表中的name字段的值是否等于变量name的值"xx",如果符合就执行删除,
else 否则继续查询,直到指针到末尾为止
rs.movenext
emd if
wend
——————————————————
——————————————————
rs.close
conn.close 这几句是用来关闭数据库
set rs=nothing
set conn=nothing
——————————————————-
%>
<5>关于数据库的查询
(a) 查询字段为字符型
<%
dim user,pass,qq,mail,message
user=request.Form("user")
pass=request.Form("pass")
qq=request.Form("qq")
mail=request.Form("mail")
message=request.Form("message")
if trim(user)&"x"="x" or trim(pass)&"x"="x" then (检测user值和pass值是否为空,可以检测到空格)
response.write("注册信息不能为空")
else
set rs=server.CreateObject("adodb.recordset")
sqlstr="select * from user where user=’"&user&"’" (查询user数据表中的user字段其中user字段为字符型)
rs.open sqlstr,conn,1,3
if rs.eof then
rs.addnew
rs("user")=user
rs("pass")=pass
rs("qq")=qq
rs("mail")=mail
rs("message")=message
rs.update
rs.close
conn.close
set rs=nothing
set conn=nothing
response.write("注册成功")
end if
rs.close
conn.close
set rs=nothing
set conn=nothing
response.write("注册重名")
%>
(b)查询字段为数字型
<%
dim num
num=request.Form("num")
set rs=server.CreateObject("adodb.recordset")
sqlstr="select * from message where id="&num (查询message数据表中id字段的值是否与num相等,其中id为数字型)
rs.open sqlstr,conn,1,3
if not rs.eof then
rs.delete
rs.update
rs.close
conn.close
set rs=nothing
set conn=nothing
response.write("删除成功")
end if
rs.close
conn.close
set rs=nothing
set conn=nothing
response.write("删除失败")
%>
<6>几个简单的asp对象的讲解
response对象:服务器端向客户端发送的信息对象,包括直接发送信息给浏览器,重新定向URL,或设置cookie值
request对象:客户端向服务器提出的请求
session对象:作为一个全局变量,在整个站点都生效
server对象:提供对服务器上方法和属性的访问
(a) response对象的一般使用方法
比如:
<%
resposne.write("hello, welcome to asp!")
%>
在客户端浏览器就会看到 hello, welcome to asp! 这一段文字
<%
response.Redirect("www.sohu.com")
%>
如果执行这一段,则浏览器就会自动连接到 “搜狐” 的网址
关于response对象的用法还有很多,大家可以研究研究
request对象的一般使用方法
比如客户端向服务器提出的请求就是通过request对象来传递的
列如 :你在申请邮箱的所填写的个人信息就是通过该对象来将
你所填写的信息传递给服务器的
比如:这是一段表单的代码,这是提供给客户填写信息的,填写完了按
“提交”传递给request.asp文件处理后再存入服务器数据库
<form name="form1" method="post" action="request.asp">
<p>
<input type="text" name="user">
</p>
<p>
<input type="text" name="pass">
</p>
<p>
<input type="submit" name="Submit" value="提交">
</p>
</form>
那么request.asp该如何将其中的信息读入,在写入数据库,在这里就要用到
request对象了,下面我们就来分析request.asp的写法
<%
dim name,password (定义user和password两个变量)
name=request.form(“user”) (将表单中的user信息传给变量name)
password=request.form(“pass”) (将表单中的pass信息传给变量password)
%>
通过以上的几句代码我们就将表单中的数据读进来了,接下来我们要做的就是将
信息写入数据库了,写入数据库的方法上面都介绍了,这里就不一一复述了。
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"> 可以在收藏夹中显示出你的图标
如何制作将本站设为首页
你可能已经注意到,现在许多网站的首页上都有这么一个链接"按这里将本站设为首页"(这里的首页指的是浏览器的起始页)。
不但大的ISP,ICP这么做,一些个人主页也推出这一"服务"以招揽网友,具体是如何实现这个功能的呢?我来帮你剖析一下:
点击那个超链接会显示下载一个名为lspace.reg的文件,下载后双击它,便会修改你的注册表,然后当你再打开浏览器的时候,起始页就发生了变化。(一听到修改注册表,许多网友就比较"怵",会不会把windows给弄坏了。)
别怕,我们来打开lspace.reg看看(用最普通的notepad记事本就可以打开),发现内容如下:
REGEDIT4
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main]
"Start Page" = "http://www.aygame.com/";
[HKEY_CURRENT_USER\Software\Netscape\Netscape Navigator\Main]"Home Page" = "http://www.aygame.com/";
原来就两条,第一条设置IE的star page;第二条设置NC的home page(没什么花头噢:)。后面跟的URL就是你主页的网址!
7. <input style="ime-modeisabled"> 关闭输入法
8. 永远都会带着框架
<script language="****"><!–
if (window == top)top.location.href = "frames.htm"; //frames.htm为框架网页
// –></script>
9. 防止被人frame
<SCRIPT LANGUAGE=****><!–
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. 取得控件的绝对位置
//****
<script language="****">
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="****">
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")
****:
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="****"><!–
function checkNum(str){return str.match(/\D/)==null}
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 (/[^\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=****>
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=****>
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(){
document.write("<form name=autof>")
for(var i=1;i<autourl.length;i++)
document.write("<input type=text name=txt"+i+" size=10 value=测试中……> =》<input type=text name=url"+i+" size=40> =》<input type=button value=GO onclick=window.open(this.form.url"+i+".value)><br/>")
document.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++)document.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
30.本地无缓存,每次自动刷新
response.expires=0
response.addHeader "pragma" , "no-cache"
response.addHeader "cache-control" , "private"
31.修改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")
%>
32. 检查一段字符串是否全由数字组成
<script language="****"><!–
function checkNum(str){return !/\D/.test(str)}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
// –></script>
值得收藏的一些代码
值得收藏的一些代码
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")
javascript :
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(){
document.write("<form name=autof>")
for(var i=1;i<autourl.length;i++)
document.write("<input type=text name=txt"+i+" size=10 value=测试中……> =》<input type=text name=url"+i+" size=40> =》<input type=button value=GO onclick=window.open(this.form.url"+i+".value)><br/>")
document.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++)document.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
ASP与数据库应用
ASP与数据库应用
一般来说,一个真正的、完整的站点是离不开数据库的,因为实际应用中,需要保存的数据很多,而且这些数据之间往往还有关联,利用数据库来管理这些数据,可以很方便的查询和更新。数据库有很多种,如:Fox 数据库(.dbf)、Access 数据库(.mdb)、Informix、Oracle 和 SQL Server 等等,在这里,我将以 Microsoft Access 数据库为例来说明ASP是如何访问数据库的。
常用数据库语句
1.SELECT 语句:命令数据库引擎从数据库里返回信息,作为一组记录。
2.INSERT INTO 语句:添加一个或多个记录至一个表。
3.UPDATE 语句:创建更新查询来改变基于特定准则的指定表中的字段值。
4.DELETE 语句:创建一个删除查询把记录从 FROM 子句列出并符合 WHERE 子句的一个或更多的表中清除。
5.EXECUTE 语句:用于激活 PROCEDURE(过程)
用 ASP 来做一个自己的通讯录练练手吧……
一、建立数据库:
用 Microsoft Access 建立一个名为 data.mdb 的空数据库,使用设计器创建一个新表。输入以下几个字段:
字段名称 数据类型 说明 其它
ID 自动编号 数据标识 字段大小:长整型 新值:递增 索引:有(无重复)
username 文本 姓名 缺省值
usermail 文本 E-mail 缺省值
view 数字 查看次数 字段大小:长整型 默认值:0 索引:无
indate 时间日期 加入时间 缺省值
保存为 data.mdb 文件,为了便于说明,只是做了一个比较简单的库。
二、连接数据库
方法1:
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")
方法2:
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("data.mdb")
注意:一个页面中,只要连接一次就可以了,数据库使用完后要及时关闭连接。
conn.Close
Set conn = Nothing
三、添加新记录到数据库
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")
username = "风云突变"
usermail = "fytb@163.com"
indate = Now()
sql = "insert into data (username,usermail,indata) values(‘"&username&"’,'"&usermail&"’,'"&indate&"’)"
conn.Execute(sql)
conn.Close
Set conn = Nothing
说明:建立数据库连接;通过表单获取姓名、E-mail 字符串,Now()获取当前时间日期;使用 insert into 语句添加新记录;conn.Execute 来执行;最后关闭。
四、选择数据库里的记录
1.选择所有记录的字段(按记录倒序排序):sql = "select * from data order by ID desc"
2.选择所有记录的姓名和E-mail字段(不排序):sql = "select username,usermail from data"
3.选择姓名为“风云突变”的所有记录:sql = "select * from data where username=’"风云突变"’"
4.选择使用 163 信箱的所有记录(按查看次数排序):sql = "select * from data where usermail like ‘%"@163.com"%’ order by view desc"
5.选择最新的10个记录:sql = "select top 10 * from data order by ID desc"
SQL 语句已经知道了,不过在Web应用时,还得创建一个 RecordSet 对象得到记录集,才能把从数据库里取出的值应用在网页上,如果现在将所有的记录显示在网页上就这样:
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")
sql = "select * from data"
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.Open sql,conn,1,1
Do While Not rs.Eof
Response.Write "<p>姓名:"& rs("username") &" E-mail:"& rs("usermail") &" 查看:"& rs("view") &"次 "& rs("indate") &"加入</p>"
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
说明:建立数据库连接;创建 rs 得到记录集;循环显示记录,rs.Eof 表示记录末,rs.MoveNext 表示移到下一个记录;最后关闭。
五、修改(更新)数据库记录
修改记录的E-mail:
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")
ID = 1
usermail = "fytb@163.com"
sql = "update data set usermail=’"&usermail&"’ where ID="&CInt(ID)
conn.Execute(sql)
conn.Close
Set conn = Nothing
说明:建立数据库连接;获取记录ID、新 E-mail 字符串;使用 update 语句修改记录;conn.Execute 来执行;最后关闭。
如果使记录的查看值加1,则:sql = "update data set view=view+1 where ID="&CInt(ID)
六、删除数据库记录
删除某一条记录:
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")
ID = 1
sql = "delete from data where ID="&CInt(ID)
conn.Execute(sql)
conn.Close
Set conn = Nothing
说明:建立数据库连接;获取记录ID;使用 delete 语句删除记录;conn.Execute 来执行;最后关闭。
删除多条记录为:sql = "delete from data where ID in (ID1,ID2,ID3)"
删除所有记录为:sql = "delete from data"
总结:
以上教程是针对ASP的初学者而写的,只是介绍了一些基本的用法,在了解之后可以自己去试试,重要的在于能举一反三、综合运用。更多的语法和参数请参阅 Microsoft Access 帮助中的 Microsoft Jet SQL 参考
用ASP连接各种数据库的方法
用ASP连接各种数据库的方法
一、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")
有许多初学者在遇到数据库连接时总是会出问题,然而使用上面的驱动程序只要你的数据库路径选对了就不会出问题了。
ASP与数据库应用(初学者)
一般来说,一个真正的、完整的站点是离不开数据库的,因为实际应用中,需要保存的数据很多,而且这些数据之间往往还有关联,利用数据库来管理这些数据,可以很方便的查询和更新。数据库有很多种,如:Fox 数据库(.dbf)、Access 数据库(.mdb)、Informix、Oracle 和 SQL Server 等等,在这里,我将以 Microsoft Access 数据库为例来说明ASP是如何访问数据库的。 SQL 语句已经知道了,不过在Web应用时,还得创建一个 RecordSet 对象得到记录集,才能把从数据库里取出的值应用在网页上,如果现在将所有的记录显示在网页上就这样: 姓名:"& rs("username") &" E-mail:"& rs("usermail") &" 查看:"& rs("view") &"次 "& rs("indate") &"加入 "
常用数据库语句
1.SELECT 语句:命令数据库引擎从数据库里返回信息,作为一组记录。
2.INSERT INTO 语句:添加一个或多个记录至一个表。
3.UPDATE 语句:创建更新查询来改变基于特定准则的指定表中的字段值。
4.DELETE 语句:创建一个删除查询把记录从 FROM 子句列出并符合 WHERE 子句的一个或更多的表中清除。
5.EXECUTE 语句:用于激活 PROCEDURE(过程)
用 ASP 来做一个自己的通讯录练练手吧……
一、建立数据库:
用 Microsoft Access 建立一个名为 data.mdb 的空数据库,使用设计器创建一个新表。输入以下几个字段:
字段名称 数据类型 说明 其它
ID 自动编号 数据标识 字段大小:长整型 新值:递增 索引:有(无重复)
username 文本 姓名 缺省值
usermail 文本 E-mail 缺省值
view 数字 查看次数 字段大小:长整型 默认值:0 索引:无
indate 时间日期 加入时间 缺省值
保存为 data.mdb 文件,为了便于说明,只是做了一个比较简单的库。
二、连接数据库
方法1:
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")
方法2:
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("data.mdb")
注意:一个页面中,只要连接一次就可以了,数据库使用完后要及时关闭连接。
conn.Close
Set conn = Nothing
三、添加新记录到数据库
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")
username = "风云突变"
usermail = "fytb@163.com"
indate = Now()
sql = "insert into data (username,usermail,indata) values(‘"&username&"’,'"&usermail&"’,'"&indate&"’)"
conn.Execute(sql)
conn.Close
Set conn = Nothing
说明:建立数据库连接;通过表单获取姓名、E-mail 字符串,Now()获取当前时间日期;使用 insert into 语句添加新记录;conn.Execute 来执行;最后关闭。
四、选择数据库里的记录
1.选择所有记录的字段(按记录倒序排序):sql = "select * from data order by ID desc"
2.选择所有记录的姓名和E-mail字段(不排序):sql = "select username,usermail from data"
3.选择姓名为“风云突变”的所有记录:sql = "select * from data where username=’"风云突变"’"
4.选择使用 163 信箱的所有记录(按查看次数排序):sql = "select * from data where usermail like ‘%"@163.com"%’ order by view desc"
5.选择最新的10个记录:sql = "select top 10 * from data order by ID desc"
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")
sql = "select * from data"
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.Open sql,conn,1,1
Do While Not rs.Eof
Response.Write "
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
说明:建立数据库连接;创建 rs 得到记录集;循环显示记录,rs.Eof 表示记录末,rs.MoveNext 表示移到下一个记录;最后关闭。
五、修改(更新)数据库记录
修改记录的E-mail:
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")
ID = 1
usermail = "fytb@163.com"
sql = "update data set usermail=’"&usermail&"’ where ID="&CInt(ID)
conn.Execute(sql)
conn.Close
Set conn = Nothing
说明:建立数据库连接;获取记录ID、新 E-mail 字符串;使用 update 语句修改记录;conn.Execute 来执行;最后关闭。
如果使记录的查看值加1,则:sql = "update data set view=view+1 where ID="&CInt(ID)
六、删除数据库记录
删除某一条记录:
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")
ID = 1
sql = "delete from data where ID="&CInt(ID)
conn.Execute(sql)
conn.Close
Set conn = Nothing
说明:建立数据库连接;获取记录ID;使用 delete 语句删除记录;conn.Execute 来执行;最后关闭。
删除多条记录为:sql = "delete from data where ID in (ID1,ID2,ID3)"
删除所有记录为:sql = "delete from data"
总结:
以上教程是针对ASP的初学者而写的,只是介绍了一些基本的用法,在了解之后可以自己去试试,重要的在于能举一反三、综合运用。更多的语法和参数请参阅 Microsoft Access 帮助中的 Microsoft Jet SQL 参考