<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>asp教程 &#8211; 蓝灵之翼</title>
	<atom:link href="https://lanlingyi.com/archives/tag/asp%E6%95%99%E7%A8%8B/feed" rel="self" type="application/rss+xml" />
	<link>https://lanlingyi.com</link>
	<description>梦不停，总有一天可以飞翔~</description>
	<lastBuildDate>Sun, 29 Nov 2009 10:50:00 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.2</generator>
	<item>
		<title>ASP内置对象 Request对象 详解</title>
		<link>https://lanlingyi.com/archives/179</link>
		
		<dc:creator><![CDATA[lanling]]></dc:creator>
		<pubDate>Sun, 29 Nov 2009 10:50:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[asp教程]]></category>
		<guid isPermaLink="false">http://lanlingyi.com/?p=179</guid>

					<description><![CDATA[重新阅读基础吧. Request对象用于接受所有从浏览器发往你的服务器的请求内的所有信息。 集合 Reques [&#8230;]]]></description>
										<content:encoded><![CDATA[</p>
<p>重新阅读基础吧.</p>
<p>Request对象用于接受所有从浏览器发往你的服务器的请求内的所有信息。 </p>
<p>集合 </p>
<p>Request.ClientCertificate(key[SubField]) </p>
<p>所有客户证书的信息的集合。对于Key，该集合具有如下的关键字： </p>
<p>Subject <br />证书的主题。包含所有关于证书收据的信息。能和所有的子域后缀一起使用。 </p>
<p>Issuer <br />证书的发行人。包含所有关于证书验证的信息。除了CN外，能和所有的子域后缀一起使用。 </p>
<p>VadidFrom <br />证书发行的日期。使用VBScript格式。 </p>
<p>ValidUntil <br />该证书不在有效的时间。 </p>
<p>SerialNumber <br />包含该证书的序列号。 </p>
<p>Certificate <br />包含整个证书内容的二进制流，使用ASN.1格式。 </p>
<p>对于SubField，Subject和Issuer关键字可以具有如下的子域后缀：（比如：SubjectOU或IssuerL） </p>
<p>C <br />起源国家。 </p>
<p>O <br />公司或组织名称。 </p>
<p>OU <br />组织单元。 </p>
<p>CN <br />用户的常规名称。 </p>
<p>L <br />局部。 </p>
<p>S <br />州（或省）。 </p>
<p>T <br />个人或公司的标题。 </p>
<p>GN <br />给定名称。 </p>
<p>I <br />初始。 </p>
<p>当文件cervbs.inc(VBScript使用)或cerjavas.inc(Jscript使用)通过使用#INCLUDE导向包含在你的Active Server Page里时，下面两个标志可以使用： </p>
<p>ceCertPresent <br />指明客户证书是否存在，其值为TRUE或FALSE。 </p>
<p>ceUnrecongnizedIssure <br />指明在该链表中的最后的证书的发行者是否未知，其值为TRUE或FALSE。 </p>
<p>Request.Cookies(Cookie[(key).Attribute]) </p>
<p>Cookie的集合。允许获得浏览器的Cookie。Cookie指明返回那一个Cookie。Key用于从Cookie字典中返回具有某一关键字的Cookie值。对于Attribute，你能使用属性HasKeys来确定某一Cookie是否具有子关键字。HasKeys的值为TRUE或FALSE。 </p>
<p>Request.Form(Parameter)[(Index).Count] </p>
<p>填写在HTML的表单中所有的数据的集合。Parameter是在HTML表单中某一元素的名称。当某一参数具有不止一个值（比如，当在&lt;SELECT&gt;中使用MULTIPLE属性时）时，使用Index。当某一参数具有多值时，Count指明多值个数。 </p>
<p>Request.QueryString(Varible)[(Index).Count] </p>
<p>查询字符串的所有值的集合。Varible是在查询字符串某一变量的名称。当某一变量具有多于一个值时，使用Index。当某一参数具有多值时，Count指明值的个数。 </p>
<p>Request.ServerVaribles(Server Environment Variable) </p>
<p>环境变量的集合。允许读取HTTP头。你可以通过使用HTTP_前缀来读取任何头信息。比如，HTTP_USER_AGENT接受客户代理HTTP头（浏览器类型）。除此外，你可以使用下表所示的变量获得任何环境信息。 </p>
<p>ALL_HTTP <br />客户端发送的所有HTTP标头，他的结果都有前缀HTTP_。 </p>
<p>ALL_RAW <br />客户端发送的所有HTTP标头,其结果和客户端发送时一样，没有前缀HTTP_ </p>
<p>APPL_MD_PATH <br />应用程序的元数据库路径。 </p>
<p>APPL_PHYSICAL_PATH <br />与应用程序元数据库路径相应的物理路径。 </p>
<p>AUTH_PASSWORD <br />当使用基本验证模式时，客户在密码对话框中输入的密码。 </p>
<p>AUTH_TYPE <br />这是用户访问受保护的脚本时，服务器用于检验用户的验证方法。 </p>
<p>AUTH_USER <br />代验证的用户名。 </p>
<p>CERT_COOKIE <br />唯一的客户证书ID号。 </p>
<p>CERT_FLAG <br />客户证书标志，如有客户端证书，则bit0为0。如果客户端证书验证无效，bit1被设置为1。 </p>
<p>CERT_ISSUER <br />用户证书中的发行者字段。 </p>
<p>CERT_KEYSIZE <br />安全套接字层连接关键字的位数，如128。 </p>
<p>CERT_SECRETKEYSIZE <br />服务器验证私人关键字的位数。如1024。 </p>
<p>CERT_SERIALNUMBER <br />客户证书的序列号字段。 </p>
<p>CERT_SERVER_ISSUER <br />服务器证书的发行者字段 </p>
<p>CERT_SERVER_SUBJECT <br />服务器证书的主题字段。 </p>
<p>CERT_SUBJECT <br />客户端证书的主题字段。 </p>
<p>CONTENT_LENGTH <br />客户端发出内容的长度。 </p>
<p>CONTENT_TYPE <br />客户发送的form内容或HTTP PUT的数据类型。 </p>
<p>GATEWAY_INTERFACE <br />服务器使用的网关界面。 </p>
<p>HTTPS <br />如果请求穿过安全通道（SSL），则返回ON。如果请求来自非安全通道，则返回OFF。 </p>
<p>HTTPS_KEYSIZE <br />安全套接字层连接关键字的位数，如128。 </p>
<p>HTTPS_SECRETKEYSIZE <br />服务器验证私人关键字的位数。如1024。 </p>
<p>HTTPS_SERVER_ISSUER <br />服务器证书的发行者字段。 </p>
<p>HTTPS_SERVER_SUBJECT <br />服务器证书的主题字段。 </p>
<p>INSTANCE_ID <br />IIS实例的ID号。 </p>
<p>INSTANCE_META_PATH <br />响应请求的IIS实例的元数据库路径。 </p>
<p>LOCAL_ADDR <br />返回接受请求的服务器地址。 </p>
<p>LOGON_USER <br />用户登录Windows NT的帐号 </p>
<p>PATH_INFO <br />客户端提供的路径信息。 </p>
<p>PATH_TRANSLATED <br />通过由虚拟至物理的映射后得到的路径。 </p>
<p>QUERY_STRING <br />查询字符串内容。 </p>
<p>REMOTE_ADDR <br />发出请求的远程主机的IP地址。 </p>
<p>REMOTE_HOST <br />发出请求的远程主机名称。 </p>
<p>REQUEST_METHOD <br />提出请求的方法。比如GET、HEAD、POST等等。 </p>
<p>SCRIPT_NAME <br />执行脚本的名称。 </p>
<p>SERVER_NAME <br />服务器的主机名、DNS地址或IP地址。 </p>
<p>SERVER_PORT <br />接受请求的服务器端口号。 </p>
<p>SERVER_PORT_SECURE <br />如果接受请求的服务器端口为安全端口时，则为1，否则为0。 </p>
<p>SERVER_PROTOCOL <br />服务器使用的协议的名称和版本。 </p>
<p>SERVER_SOFTWARE <br />应答请求并运行网关的服务器软件的名称和版本。 </p>
<p>URL <br />提供URL的基本部分。 </p>
<p>方法 </p>
<p>Request.BinaryRead(Count) </p>
<p>接收一个HTML表单的未经过处理的内容。当调用此方法时，Count指明要接收多少字节。在调用此方法后，Count指明实际上接收到多少个字节。 </p>
<p>属性 </p>
<p>Request.TotalBytes </p>
<p>查询体的长度，以字节为单位。 <strong><br /></strong></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Asp实现Access数据库的建立和压缩</title>
		<link>https://lanlingyi.com/archives/180</link>
		
		<dc:creator><![CDATA[lanling]]></dc:creator>
		<pubDate>Sun, 29 Nov 2009 10:48:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[asp教程]]></category>
		<guid isPermaLink="false">http://lanlingyi.com/?p=180</guid>

					<description><![CDATA[&#60;% '#######以下是一个类文件，下面的注解是调用类的方 法################### [&#8230;]]]></description>
										<content:encoded><![CDATA[<p> &lt;% <br />'#######以下是一个类文件，下面的注解是调用类的方 法################################################ <br />'# 注意：如果系统不支持建立Scripting.FileSystemObject对象，那么数据库压缩功能将无法使用 <br />'# Access 数据库类 <br />'# CreateDbFile 建立一个Access 数据库文件 <br />'# CompactDatabase 压缩一个Access 数据库文件 <br />'# 建立对象方法: <br />'# Set a = New DatabaseTools <br />'# by (萧寒雪) s.f. <br />'######################################################################################### </p>
<p>Class DatabaseTools </p>
<p>Public function CreateDBfile(byVal dbFileName,byVal DbVer,byVal SavePath) <br />'建立数据库文件 <br />'If DbVer is 0 Then Create Access97 dbFile <br />'If DbVer is 1 Then Create Access2000 dbFile <br />On error resume Next <br />If Right(SavePath,1)&lt;&gt;&quot;\&quot; or Right(SavePath,1)&lt;&gt;&quot;/&quot; Then SavePath = Trim(SavePath) &amp; &quot;\&quot; <br />If Left(dbFileName,1)=&quot;\&quot; or Left(dbFileName,1)=&quot;/&quot; Then dbFileName = Trim(Mid(dbFileName,2,Len(dbFileName))) <br />If DbExists(SavePath &amp; dbFileName) Then <br />Response.Write (&quot;对不起，该数据库已经存在!&quot;) <br />CreateDBfile = False <br />Else <br />Dim Ca <br />Set Ca = Server.CreateObject(&quot;ADOX.Catalog&quot;) <br />If Err.number&lt;&gt;0 Then <br />Response.Write (&quot;无法建立，请检查错误信息 <br />&quot; &amp; Err.number &amp; &quot; <br />&quot; &amp; Err.Description) <br />Err.Clear <br />Exit function <br />End If <br />If DbVer=0 Then <br />call Ca.Create(&quot;Provider=Microsoft.Jet.OLEDB.3.51;Data Source=&quot; &amp; SavePath &amp; dbFileName) <br />Else <br />call Ca.Create(&quot;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&quot; &amp; SavePath &amp; dbFileName) <br />End If <br />Set Ca = Nothing <br />CreateDBfile = True <br />End If <br />End function </p>
<p>Public function CompactDatabase(byVal dbFileName,byVal DbVer,byVal SavePath) <br />'压缩数据库文件 <br />'0 为access 97 <br />'1 为access 2000 <br />On Error resume next <br />If Right(SavePath,1)&lt;&gt;&quot;\&quot; or Right(SavePath,1)&lt;&gt;&quot;/&quot; Then SavePath = Trim(SavePath) &amp; &quot;\&quot; <br />If Left(dbFileName,1)=&quot;\&quot; or Left(dbFileName,1)=&quot;/&quot; Then dbFileName = Trim(Mid(dbFileName,2,Len(dbFileName))) <br />If DbExists(SavePath &amp; dbFileName) Then <br />Response.Write (&quot;对不起，该数据库已经存在!&quot;) <br />CompactDatabase = False <br />Else <br />Dim Cd <br />Set Cd =Server.CreateObject(&quot;JRO.JetEngine&quot;) <br />If Err.number&lt;&gt;0 Then <br />Response.Write (&quot;无法压缩，请检查错误信息 <br />&quot; &amp; Err.number &amp; &quot; <br />&quot; &amp; Err.Description) <br />Err.Clear <br />Exit function <br />End If <br />If DbVer=0 Then <br />call Cd.CompactDatabase(&quot;Provider=Microsoft.Jet.OLEDB.3.51;Data Source=&quot; &amp; SavePath &amp; dbFileName,&quot;Provider=Microsoft.Jet.OLEDB.3.51;Data <br />Source=&quot; &amp; SavePath &amp; dbFileName &amp; &quot;.bak.mdb;Jet OLEDB;Encrypt Database=True&quot;) <br />Else <br />call Cd.CompactDatabase(&quot;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&quot; &amp; <br />SavePath &amp; dbFileName,&quot;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&quot; &amp; <br />SavePath &amp; dbFileName &amp; &quot;.bak.mdb;Jet OLEDB;Encrypt Database=True&quot;) <br />End If <br />'删除旧的数据库文件 <br />call DeleteFile(SavePath &amp; dbFileName) <br />'将压缩后的数据库文件还原 <br />call RenameFile(SavePath &amp; dbFileName &amp; &quot;.bak.mdb&quot;,SavePath &amp; dbFileName) <br />Set Cd = False <br />CompactDatabase = True <br />End If <br />end function </p>
<p>Public function DbExists(byVal dbPath) <br />'查找数据库文件是否存在 <br />On Error resume Next <br />Dim c <br />Set c = Server.CreateObject(&quot;ADODB.Connection&quot;) <br />c.Open &quot;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&quot; &amp; dbPath <br />If Err.number&lt;&gt;0 Then <br />Err.Clear <br />DbExists = false <br />else <br />DbExists = True <br />End If <br />set c = nothing <br />End function </p>
<p>Public function AppPath() <br />'取当前真实路径 <br />AppPath = Server.MapPath(&quot;./&quot;) <br />End function </p>
<p>Public function AppName() <br />'取当前程序名称 <br />AppName = Mid(Request.ServerVariables(&quot;SCRIPT_NAME&quot;),(InStrRev(Request.ServerVariables(&quot;SCRIPT_NAME&quot;) ,&quot;/&quot;,-1,1))+1,Len(Request.ServerVariables(&quot;SCRIPT_NAME&quot;))) <br />End Function </p>
<p>Public function DeleteFile(filespec) <br />'删除一个文件 <br />Dim fso <br />Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;) <br />If Err.number&lt;&gt;0 Then <br />Response.Write(&quot;删除文件发生错误!请查看错误信息 <br />&quot; &amp; Err.number &amp; &quot; <br />&quot; &amp; Err.Description) <br />Err.Clear <br />DeleteFile = False <br />End If <br />call fso.DeleteFile(filespec) <br />Set fso = Nothing <br />DeleteFile = True <br />End function </p>
<p>Public function RenameFile(filespec1,filespec2) <br />'修改一个文件 <br />Dim fso <br />Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;) <br />If Err.number&lt;&gt;0 Then <br />Response.Write(&quot;修改文件名时发生错误!请查看错误信息 <br />&quot; &amp; Err.number &amp; &quot; <br />&quot; &amp; Err.Description) <br />Err.Clear <br />RenameFile = False <br />End If <br />call fso.CopyFile(filespec1,filespec2,True) <br />call fso.DeleteFile(filespec1) <br />Set fso = Nothing <br />RenameFile = True <br />End function </p>
<p>End Class <br /> %&gt;  </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>解析cookie欺骗实现过程</title>
		<link>https://lanlingyi.com/archives/181</link>
		
		<dc:creator><![CDATA[lanling]]></dc:creator>
		<pubDate>Sun, 29 Nov 2009 10:46:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[asp教程]]></category>
		<guid isPermaLink="false">http://lanlingyi.com/?p=181</guid>

					<description><![CDATA[正如我们所知道的，在网络词汇中，cookie是一个特殊的信息，虽然只是服务器存于用户计算机上的一个文本文件，但 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p> <strong>正如我们所知道的，在网络词汇中，cookie是一个特殊的信息，虽然只是服务器存于用户计算机上的一个文本文件，但由于其内容的不寻常性(与服务器有一定的互交性，且常会存储用户名，甚至口令，或是其它一些敏感信息，例如在江湖或是一些社区中，常会用cookie来保存用户集分，等级等等)。因而成为一些高手关注的对像，借此来取得特殊权限，甚至攻克整个网站。本人出些拙作，以java script中对cookie的应用，来说初步说明cookie欺骗的实现过程及具体应用。 <br />　　 <br />　　一、cookie的建立 <br />　　 <br />　　在讲如何建立cookie之前，我们先来了解一下cookie的基本格式： <br />　　 <br />　　cookiename+cookievalue;expire=expirationdategmt;path=urlpath;domain=sitedomain <br />　　 <br />　　其中各项以;分开，首先是指定cookie的名称，并为其赋值。接下来分别是cookie的有效期，url路径以及域名，在这几项中，除了第一项以外，其它部分均为可先项。 </p>
<p>　　下面我们来看一段代码，了解一下cookie究竟是怎样建立的： <br />　　 <br />　　&lt;HTML&gt; <br />　　&lt;HEAD&gt; <br />　　&lt;TITLE&gt;Set a cookie based on a form&lt;/TITLE&gt; <br />　　&lt;SCRIPT LANGUAGE=&quot;java script&quot; TYPE=&quot;TEXT/java script&quot;&gt; <br />　　&lt;!-- Hide script from older browsers <br />　　 <br />　　expireDate = new Date <br />　　expireDate.setMonth(expireDate.getMonth()+6) <br />　　 <br />　　userName = &quot;&quot; <br />　　if (documents .cookie != &quot;&quot;) { <br />　　userName = documents .cookie.split(&quot;=&quot;)[1] <br />　　} <br />　　 <br />　　function setCookie() { <br />　　userName = document.myform.nameField.value <br />　　documents .cookie = &quot;userName=&quot;+userName+&quot;;expires=&quot; + expireDate.toGMTString() <br />　　} <br />　　 <br />　　// End hiding script --&gt; <br />　　&lt;/SCRIPT&gt; <br />　　&lt;/HEAD&gt; <br />　　&lt;BODY BGCOLOR=&quot;WHITE&quot; onLoad=&quot;document.myform.nameField.value = userName&quot;&gt; <br />　　&lt;form NAME=&quot;myform&quot;&gt; <br />　　&lt;H1&gt;Enter your name:&lt;INPUT TYPE=&quot;TEXT&quot; NAME=&quot;nameField&quot; onBlur=&quot;setCookie()&quot;&gt;&lt;/H1&gt; <br />　　&lt;/form&gt; <br />　　&lt;/BODY&gt; <br />　　&lt;/HTML&gt; </p>
<p>　　这是一锻简单的建立cookie的脚本。 <br />　　 <br />　　1，&lt;SCRIPT LANGUAGE=&quot;java script&quot; TYPE=&quot;TEXT/java script&quot;&gt; <br />　　 <br />　　脚本开始的标记，由此一句告诉浏览器以下将是java script. <br />　　 <br />　　2,&lt;!-- Hide script from older browsers <br />　　 <br />　　为了防止浏览器不能识别脚本，而让浏览器误以为是HTML注释而忽略它。 <br />　　 <br />　　3，expireDate = new Date <br />　　 <br />　　获取当前日期，并存入变量expireDate中。 <br />　　 <br />　　4，expireDate.setMonth(expireDate.getMonth()+6) <br />　　 <br />　　获取当前月份值，将其加6后设置为expireDate的月份总值部分。这意味着本cookie的有效期为6个月。 <br />　　 <br />　　5，if (documents .cookie != &quot;&quot;) <br />　　 <br />　　如果document的值不为空，相当于检查用户硬盘上是否已经有了cookie。 <br />　　 <br />　　6，userName = documents .cookie.split(&quot;=&quot;)[1] <br />　　 <br />　　此处用到了split(&quot;=&quot;)函数，它的功能是把cookie记录分割为数组，cookie的名为cookie[0],值为cookie[1],以此累推。所以此处documents .cookie.split(&quot;=&quot;)[1]返回的值是此cookie的值。在此句中将值赋给了变量username。 <br />　　 <br />　　7，function setCookie() <br />　　 <br />　　设置名为setCookie的函数。 <br />　　 <br />　　8，documents .cookie = &quot;userName=&quot;+userName+&quot;;expires=&quot; + expireDate.toGMTString() <br />　　 <br />　　此句是将设置好的cookie写入用户硬盘。expireDate.toGMTString()把expireDate中的值转换为文本字符串，这样才能写入cookie中。 <br />　　 <br />　　9，onLoad=&quot;document.myform.nameField.value = userName&quot; <br />　　 <br />　　当页面载入时，把username的值写入文本框(如果有的话)。 <br />　　 <br />　　10，onBlur=&quot;setCookie()&quot; <br />　　 <br />　　当用户离开文本框时，onBlur调用函数setCookie。 <br />　　 <br />　　结合上面的注释，读那段代码相信不成问题吧!既然我们可以建立cookie，那么读取也不是什么难事，请接着往下看! </p>
<p>　　二、读取和显示cookie <br />　　 <br />　　一般来说，cookie的作者并不希望cookie被显示出来，这是当然的!天知道里面写了些什么!？然而这也是我们想要读出它的原因!~~~:D <br />　　 <br />　　&lt;HTML&gt; <br />　　&lt;HEAD&gt; <br />　　&lt;TITLE&gt;Cookie Check&lt;/TITLE&gt; <br />　　&lt;/HEAD&gt; <br />　　&lt;BODY BGCOLOR=&quot;WHITE&quot;&gt; <br />　　&lt;H2&gt; <br />　　&lt;SCRIPT LANGUAGE=&quot;java script&quot; TYPE=&quot;TEXT/java script&quot;&gt; <br />　　&lt;!-- Hide script from older browsers <br />　　 <br />　　if (documents .cookie == &quot;&quot;) { <br />　　document.write(&quot;There are no cookies here&quot;) <br />　　} <br />　　else { <br />　　thisCookie = documents .cookie.split(&quot;; &quot;) <br />　　 <br />　　for (i=0; i&lt;thisCookie.length; i++) { <br />　　document.write(&quot;Cookie name is ’&quot;+thisCookie.split(&quot;=&quot;)[0]) <br />　　document.write(&quot;’, and the value is ’&quot;+thisCookie.split(&quot;=&quot;)[1]+&quot;’&lt;BR&gt;&quot;) <br />　　} <br />　　} <br />　　 <br />　　// End hiding script --&gt; <br />　　&lt;/SCRIPT&gt; <br />　　&lt;/H2&gt; <br />　　&lt;/BODY&gt; <br />　　&lt;/HTML&gt; <br />　　 <br />　　以上的便是一段读取cookie的名字和值的脚本。上文中解释过的语句在此不多赘述，且看有什么新的语法： <br />　　 <br />　　1，thisCookie = documents .cookie.split(&quot;; &quot;)[注意：并非前文中出现过的split(&quot;=&quot;)。 <br />　　 <br />　　split(&quot;; &quot;)可以产生数组的结果，本句中，由documents .cookie.split(&quot;; &quot;)来获取cookie的值，并将这个数组赋值缎带变量：thisCookie。 <br />　　 <br />　　2，for (i=0; i&lt;thisCookie.length; i++) <br />　　 <br />　　设置计算器变量i的值为0，如果其值小于thisCookie.length(thisCookie中值的个数)，将i的值加1。 <br />　　 <br />　　3，document.write(&quot;Cookie name is ’&quot;+thisCookie.split(&quot;=&quot;)[0]) <br />　　 <br />　　此句中thisCookie.split(&quot;=&quot;)[0]较难理解，上面的脚本中，thiscookie已经被赋值为一个数组的值，那么thisCookie是指数组中第i个值，也就是第i个cookie，而由上文可知split(&quot;=&quot;)[0]是指cookie的名字。 </p>
<p>　　这样thisCookie.split(&quot;=&quot;)[0]便是第i的cookie中cookie的名字! <br />　　 <br />　　4,document.write(&quot;’, and the value is ’&quot;+thisCookie.split(&quot;=&quot;)[1] <br />　　 <br />　　跟3极为相似，即是第i个cookie中 cookie的值。 <br />　　 <br />　　到此，我们已经熟悉了如何建立cookie以及它的读取。这些也正是cookie欺骗也需要的主要技术! </p>
<p>　　三、cookie欺骗的实现 <br />　　 <br />　　要做到cookie欺骗，最重要的是理解目标cookie中的储值情况，并设法改变它。由上面的学习我们知道，基于cookie的格式所限，一般来说，只有在Cookie.split(&quot;=&quot;)[0]和Cookie.split(&quot;=&quot;)[1]中的值对我们才是有用的。也就是说只需改变这两处或是处的值即可达到我们的目的。 </p>
<p>　　而在实际操作中，还得先解决另一个问题。由于受浏览器的内部cookie机制所限，每个cookie只能被它的原服务器所访问!可我们总不能跑到人家服务器上操作吧!这里就需要一个小技巧了。 </p>
<p>　　在上面我们提到过cookie的格式，最后两项中分别是它的url路径和域名。不难想到，服务器对cookie的识别靠的就是这个! </p>
<p>　　而在平时，我们要浏览一个网站时，输入的url便是它的域名，需要经过域名管理系统dns将其转化为IP地址后进行连接的。这其中就有一个空当。如果能在dns上做手脚，把目标域名的IP地址对应到其它站点上，我们便可以非法访问目标站点的cookie了! </p>
<p>　　做到这一点并不难，当然我不并不是要去操纵dns，而且那也是不可能的事情。在win9下的安装目录下，有一 名为hosts.sam的文件，以文本方式打开后会看到这样的格式： </p>
<p>　　127.0.0.1 lockhost #注释 </p>
<p>　　利用它，我们便可以实现域名解析的本地化!而且其优先权高于网络中的dns! </p>
<p>　　具体使用时，只需将IP和域名依上面的格式添加，并另存为hosts即可!(注意：此文件无后赘名，并非hosts.sam 文件本身!) <br />　　 <br />　　到此，cookie欺骗所需的所以知识已经齐备。下面以一个“假”的例子，演示一下如何进入实战.(不便给出真实地址，以免引起犯罪!~~~:P) <br />　　假设目标站点是 www.xxx.com <br />　　www.self.com是自己的站点。(可以用来存放欺骗目标所需的文件，用来读取和修改对方的cookie.) </p>
<p>　　首先ping出www.self.com的IP地址： </p>
<p>　　ping www.self.com <br />　　 <br />　　Reply from 12.34.56.78: bytes=32 time=20ms TTL=244 <br />　　 <br />　　然后修改hosts.sam文件如下： <br />　　 <br />　　12.34.56.78 www.xxx.com <br />　　并保存为hosts。 <br />　　 <br />　　将用来读取cookie的页面传至www.self.com(脚本如二所示)。 <br />　　此时连上www.xxx.com。由于我们已经对hosts动过手脚，这时来到的并不是www.xxx.com，而是www.self.com </p>
<p>　　www.xxx.com设在本地的cookie便可被读出!~~:D </p>
<p>　　然后根据具体情况修改一的脚本，用同样的方法，向此cookie中写入数据。修改完毕后，删掉hosts文件，再重新进入www.xxx.com，此时已经大功告成，可享受你的hack成果了!~~~:) <br />　　 <br />　　编后 </p>
<p>　　cookie欺骗是一种发现较早，且较难使用的hack手法，除了java script 可以控制以外，asp等也可以用来对其进进设置。所以在此声明，未必能对所有站点有较。但技术真实，无须置疑! <br />　　 <br />　　补充：在win2000中hosts文件的建立与win98不同，需要c:\winnt\system32\drivers\etc文件夹中创建! <br /></strong> </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ASP应用程序与会话</title>
		<link>https://lanlingyi.com/archives/182</link>
		
		<dc:creator><![CDATA[lanling]]></dc:creator>
		<pubDate>Sun, 29 Nov 2009 10:45:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[asp教程]]></category>
		<guid isPermaLink="false">http://lanlingyi.com/?p=182</guid>

					<description><![CDATA[本章将讨论ASP的另两个对象。就是Application和 Session对象。这两个对象不是直接地与请求和响 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p> 本章将讨论ASP的另两个对象。就是Application和 Session对象。这两个对象不是直接地与请求和响应的管理有关，而是更多地与ASP网页运行环境的管理相关。<br />与建立Web站点或Web应用程序有关的共同问题之一，是使用HTTP协议时没有状态。状态提供了与一个指定用户有关的变量值、对象和其他资源，并且应用程序中的任意例程都能使用它；以一种像VB或C++这样的程序设计语言编写一般的基于客户的应用程序时，使用状态可以完成一些相应的工作。然而，Web并不提供这种能力。在本章中，读者将看到为什么和如何避免这个问题。<br />本章还涉及到一些术语和技术问题。它迄今为止，本书中已经简单地讨论了“Web应用程序”，但没有真正确切地理解或准确定义它们到底是什么。本书也涉及到了“用户会话”，也没有相应的比较完全的描述。前面有意地省略这方面的内容，因为它们与ASP的应用程序和会话密切相关。下面将介绍ASP的Application和Session对象。<br />本章研究的主要内容：<br />&middot; Web应用程序是什么，以及它们如何与ASP Application对象相联系。<br />&middot; ASP如何自动地创建和管理应用程序和会话。<br />&middot; Application和Session对象提供的功能。<br />&middot; 如何把Application和Seesion对象放入ASP网页中。<br />首先研究整个内容的核心问题：状态。</p>
<p>3.1 Web上的状态管理<br /> 许多开发人员把应用程序传送到Web之前从来没考虑状态的概念。正如前面说过的，Web是一个无状态的环境。因此应该探讨一下状态是什么，了解能够避免产生问题的方法。</p>
<p>3.1.1状态的准确定义<br /> 在单用户程序中，创建一个可执行的应用程序时，例如使用VB建立一个.exe文件，可以声明一个全局（或Public）变量，然后在代码中任何地方可对其进行访问。在应用程序运行的所有时刻，时刻值一直是有效，并且是可访问的。<br /> 对于一个传统的客户机/服务器解决方案，例如一个基于客户机的应用程序对一个基于服务器的数据库引擎进行访问的系统，每个客户端建立了一个与服务器和数据库应用程序的连接。这种连接通常是通过验证用户的方法来建立的。<br /> 验证过程是典型的识别用户身份的过程，通过一个用户名和口令组合来证明是否为合法的用户。<br /> 一旦通过验证，在客户端和基于服务器的应用程序之间就建立了连接，该连接在用户使用该应用程序的所有时间内一直保持有效。当用户注册到酵Windows 2000服务器上时，这一切便会发生。无论何时，管理员使用 “Active Directory Users and Computers”实用程序（单击“Start”菜单的“Administrative Tools”选项中的 “Directory Management”项）都可以观察到活动的用户连接。这个过程在许多系统中都相同，例如Microsoft SQL Server。<br /> 这种永久的连接意味着：当用户发送指令或请求到服务器上时，服务器会很容易地识别每个用户。同样服务器的响应或任何其他用户的信息也能直接返回用户。要进一步指出的是服务器可以比较容易地存储与每个客户相关的值和信息，并在需要的时候提供给相应的客户。当然，服务器应用程序能够拥有主全局变量，以便于用户在需要的时候进行访问。<br /> 这种识别每个客户端的请求并在内存中保存相关用户的值的能力构成状态。可以认为状态代表应用程序的值、环境以及用户的内部变量，并贯穿于应用程序和用户连接的整个过程。</p>
<p>3.1.2 状态的重要性<br /> 如果打算创建与用户进行交互的基于Web站点的应用程序，而不是仅显示独立页面的Web网站，必须能够为每个用户提供独立的状态。这可能只是记住他们的名字，也可能要为每个用户存储对象引用或不同的记录集。如果不能这样做，ASP网页就不能做更多的事情，因为该页面执行完成时，页面中的变量和其他相关资料都破坏了。录用户请求下一个页面时，这个页面提供的所有信息将全部失去。<br /> 因此，需要找到一种方法，保存每个访问者的状态。能够存储对所有用户而言的全局值是非常重要。例如，一个Web风格的访问或页面点击计数器，它不为每个用户提供自己的计数器，用户们通常想要看到访问者的总数，而不仅仅是他们自己访问的次数。访问者的数目需要与应用程序级状态一起存储，而不是与用户级状态一起存储。 <br /> 这不是一个刚出现的问题，自从商用站点占据了Web，就已经存在，甚至更早些。所以已有许多在Web上存储状态的传统的解决方案。Web站点管理员想要了解访问者以前是否曾访问过他们的网站，如果访问过，访问过多少次？还定期访问其他什么网站等。这样可以更好地制定其广告目标。所有这些都要求一种方法来存储有关用户在访问时所产生的网页请求或每次访问间的信息。</p>
<p>3.1.3在Web上创建状态<br /> 在页面请求和站点访问之间提供状态常用的方法是通过cookie。我们在前面的章节中已经看到，如何在客户端的计算机中存放相应的值，这些值与每个页面请求一起发送给对此cookie有效的域。通过用ASP检查和更新cookie，在某种程度上能够保持一个状态。可以使用所包含的信息来识别用户，然后把用户连接到一个已存储相应值的集合。<br /> 例如，可以检测一个用户请求是否包含一个站点指定的cookie。如果不包含，则为该用户分配一个某种类型的标识，指明一个数量，并存储在带有一个长有效期的cookie中。以后该用户对这个站点的每一次访问，都能够检测到cookie并更新所包含的信息。同时可以收集有关访问的次数和持续时间的数据，并存储在服务器上，以备将来使用。<br /> 但是，如果用户转移到另一个计算机，或删除了cookie，或者他们的浏览器拒绝接收发送给他们的cookie，会发生什么事情呢？在这种情况下，不能维持状态，因为下一次不能识别他们现在，Web上有许多cookie，大多数人会接受它们，而不加理会。如果打开浏览器中的“Warn before accepting cookies”选项，接着漫游几个大的站点，你就会明白其中的含意。<br />1． 匿名访问者与授权的访问者<br />如果认为cookie是一个有点草率的解决方案，可以使用更直接的方法。许多站点采用的一种方法是，在访问者点击一个站点时，或者点击一个要求验证身份的页面时，弹出一个进行登录的对话框。访问者首先必须进行注册，获得一个某种类型的用户名/口令的组合，才能允许访问相应的站点或页面。<br />为了证实访问者是一个已知的并且合法的用户，在访问者的计算机上放置的一个cookie，它或者保存注册的详细数据，或者是一把表明已验证过身份的“钥匙（key）”。同时，访问者的详细数据永久地保存在服务器上，准备再次访问时使用。如果访问者的浏览器中有了这样一个cookie，他就可以自由地访问该网站，因为已经验证过了。<br />如果cookie没有有效期限（Expires），cookie的值在关闭浏览器时自动消失，在下一次访问时必须重新注册和再次验证。当然，如果拒绝接收cookie或删除了cookie，就只能再次得到注册对话框。这样的话，如果不被识别，就不能访问该站点。<br />通过强制用户就像注册到自己的网络一样注册到Web服务器，Windows 2000整体安全性能为IIS提供更强和更安全的验证功能。但是，这只能与Internet Explorer 3.0和之上版本的浏览器一起工作。IIS也可以使用BASIC验证允许非Microsoft浏览器注册Web服务器。<br />2． 不再有匿名访问者<br />在IIS Web服务器上使用ASP时，除非用户离开该站点到另一个网站或者关闭了浏览器，否则能在当前会话中跟踪用户。在本章的后面，将看到如何使用这个功能来标识一个访问者、存储用户的本地信息和提供状态。下面与已经讨论过的解决方案相比较，讨论其工作方式。<br />ASP和IIS共同提出了一个用户会话的概念，通过ASP Session对象进行交互。在每个访问者第一次访问服务器上的一个ASP 网页时，为他创建一个新的并且独立的会话对象，分配给该会话一个会话标识号，并把包含会话标识符的特殊加密版本的一个cookie发送给客户。<br />cookie的路径（参看前面的章节有关cookie属性的描述）设置为运行在服务器上的ASP应用程序的根路径。这很可能上缺省的Web网站的根目录（即“/”），但也可能会是另外一个值（稍后会看到）。在cookie中没有提供Expires值，所以当浏览器关闭时，cookie值也就消失。<br />每当这个用户访问这个ASP网页，ASP都会查找这个cookie。命名为ASPSESSIONIDxxxxxxxx，其中每个x是一个字母字符。从第2章图2-7所示的ServerVariables集合，能够在HTTP报头中看到它。这里高亮地显示ASP cookie，如图3-1所示：</p>
<p>图3-1 显示的cookie值<br />但是，这个cookie不会出现在 Request.Cookies或Response.Cookies集合中，ASP把它隐藏起来，但仍保存在浏览器上。对于每个ASP网页请求，ASP都要查看该值。这个cookie包含的值，指明了这个用户的会话。因此，相应的Session对象（该对象在内存中已被处理，并且一直包含所有在前一页面请求过程中进行操作的值）的内容可以移交给ASP网页中的脚本。<br />当然，如前所述，如果客户浏览器不接收或不支持这些cookie，这个处理将失败。在这种情况下，不能创建ASP会话，对这个访问者的状态也不进行自动维护。</p>
<p>3.2 Web应用程序的定义<br /> 前面的章节中已经多次使用过Web应用程序（Web Application）术语，所指的既不是一个真正意义上的Web网站，又不是一个传统的应用程序。换句话说，而是认为它是一些Web网页和用来完成某些任务的其他资源的一个集合。它隐含这样一层意思：有一个预定义的路线贯穿于网页之中，用户可做出选择或提供信息使任务能够完成。 <br /> 例如，一个在线商店，你为了购买货物，进行反复的观察和选择，浏览一系列网页，收集所需要的信息，支付相应的费用，最后发出定单。也可能是一个“软件升级向导”，指导用户完成下载和安装新软件的过程，或者可能是一个基于Intranet的报价单或销售报告的生成工具。<br /> 所有这些不同于“标准”的Web网站，一般的Web站点使用一系列菜单或导航栏以预先未定义的路径漫游该站点。但是一个Web应用程序远不只是受控制的导航器。自由地漫游于一个Web网站时，可以进行无状态的和匿名的访问，但Web应用程序一般不接受。</p>
<p>3.2.1 ASP应用程序的定义<br /> 上述内容可以认为是术语“Web应用程序”的一个合理的一般定义，但遗憾的是，在谈论有关 “ASP应用”时，仅这些还不够。回答什么是“Web应用”可以是主观的，而回答什么是“ASP应用”则需要从技术上的解释。在ASP中术语“应用程序”有自己特定的含义，在讨论如何实现之前，弄懂这个概念至关重要。<br /> ASP应用程序与两个主要的内容有关：<br /> &middot; 全局范围的规定，具有一个全局可访问的变量存储区域。<br /> &middot; 通过COM+与IIS的集成，可更好地管理组件。<br /> 下面讨论这些内容。第二个内容涉及到其他ASP对象，其覆盖范围相应广泛。在下一章研究ASP Server对象时，将对这部分内容进行详细地讨论。<br />1. 提供Web应用程序的全局范围<br />ASP提供一个Application对象，基本上与前面讨论的Session对象相当。但是，这是在应用程序层而不是在用户层。换句话说，该对象是全局的，不是对单独用户的，而是对应用程序的所有用户，其作用域不限制为单独用户的访问。这与在一个正常的可执行应用程序中的全局（或Public）变量相同。Application对象可用于在全局环境中存储变量和信息（即状态），该应用程序内的任何ASP网页中运行的脚本都可访问这些值，而不管是哪个访问者发出的请求。<br />但是，这没有回答主要问题：什么是一个ASP应用程序？为此，需要研究ASP内部的一些情况。<br />当用户请求一个ASP网页时，IIS通过实例化asp.dll（用来实现ASP）创建一个环境（如第1章所述）。将该页面解释为服务器端脚本，相应的脚本引擎的实例用来执行该脚本。<br />实例化的asp.dll初如事件启动一个ASP应用程序，创建一个Application对象。然后，为这个用户启动一个会话，并创建单独的Session对象。当更多的会话启动时，这个Application对象保留在作用域中（即已经实例化和可用）。一旦最后保持活动的会话结束，该应用程序就结束，并取消相应的Application对象。<br />(1) 缺省的ASP应用<br />Windows 2000在安装IIS和ASP时，创建一个缺省的Web站点。它被配置成一个ASP应用程序，涉及到在Properties对话框中针对站点根目录文件夹（缺省为C:\Inetpub\WWWRoot）的一些设置。图3-2所示是缺省Web站点的Properties对话框的屏幕。</p>
<p>图3-2 缺省Web网站的Properties对话框<br />涉及到ASP应用程序的文件之一是global.asa。这个文件用于定制应用程序行为的方式。放置在应用程序的根目录下，可用于该目录下的所有子目录。因此，如果它放置在整个Web站点的根目录下，则定义整个网站作为缺省的ASP应用程序的一部分。<br />在本章后面有关应用程序和会话事件的部分中，将看到这个文件及其使用方法。<br />(2) ASP虚拟应用程序<br />如同在设置过程中创建缺省的应用程序一样，可以在该Web网站的任何子目录中创建属于自己的ASP虚拟应用程序。这个应用程序包含作为“应用程序目录”而定义的目录中所有的子目录。并且，这个目录和子文件夹也都是缺省应用程序的一部分，共享由缺省的Application对象创建的全局空间。<br />事实上，在缺省的应用程序中存储的所有变量在子目录中的应用程序中也都是可用的。然而，如果该子目录应用程序中的一个ASP网页把一个值写入Application对象，而Application对象与缺省（根）应用程序中已存在的一个值有相同的名字，那么，原先的值在子目录应用程序中就不能再用。但是在其他的应用程序或ASP网页中，将保留原有的值，因为根目录的应用程序不能访问子目录应用中的值。<br />从一个子程序或函数的变量的角度考虑这个问题。如果定义一个变量intMyvalue为Public或全局的变量，可以从任何的子程序或函数内部访问该变量。但是，如果又声明一个具有相同名字的局部变量，并在该子程序或函数内对该变量进行引用，则得到此变量的局部值。不能再访问原先的值。当子程序或函数结束，局部值被撤消，全局变量原有的值仍然保留着：<br />Public intMyvalue = 42<br />Function DoSomething()<br /> Response.Write intMyvalue ‘Gives 42 from global variable<br /> Dim intMyvalue<br /> IntMyvalue = 17<br /> Response.Write intMyvalue ‘Gives 17 from new local variable,but<br /> ; ‘the global value of Myvalue is still 42<br />End Function </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>asp创建对象</title>
		<link>https://lanlingyi.com/archives/183</link>
		
		<dc:creator><![CDATA[lanling]]></dc:creator>
		<pubDate>Sun, 29 Nov 2009 10:44:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[asp教程]]></category>
		<guid isPermaLink="false">http://lanlingyi.com/?p=183</guid>

					<description><![CDATA[当我们使用服务器组件创建对象时，一般有两种方法。比较常用的方法是用SERVER对象的CreateObject( [&#8230;]]]></description>
										<content:encoded><![CDATA[<p> 当我们使用服务器组件创建对象时，一般有两种方法。比较常用的方法是用SERVER对象的CreateObject() 方法，象这样: <br /> 　　SET NextLink = Server.CreateObject(&quot;MSWC.NextLink&quot;) </p>
<p> 　　这种方法很好用，但是还有一种方法更节省系统资源。 </p>
<p> 　　当你用Server.CreateObject()方法创建对象时，对象立即被加载，同时系统为这个对象分配好内存和其它资源。 </p>
<p> 　　第二种创建对象的方法是利用HTML的&lt; OBJECT &gt;标记，语法是这样的： <br /> 　　&lt; OBJECT Runat=Sever ID=NextLink ProgID=&quot;MSWC.NextLink&quot; &gt;&lt; /OBJECT &gt; </p>
<p> 　　利用&lt; OBJECT &gt;标记创建对象时，你要创建的对象不被马上加载，而是等到这个对象的方法或属性第一次被引用时才加载。这样，我们就会节省一些资源。虽然不是很多，但是当你的系统每天要承受近百万次的点击时，这对节省服务器资源就很有帮助了 </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ASP对象 速查表</title>
		<link>https://lanlingyi.com/archives/184</link>
		
		<dc:creator><![CDATA[lanling]]></dc:creator>
		<pubDate>Sun, 29 Nov 2009 10:43:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[asp教程]]></category>
		<guid isPermaLink="false">http://lanlingyi.com/?p=184</guid>

					<description><![CDATA[不全,老文. 　　一、Request 　　Request对象把客户信息保存在几个集合中，供ASP应用使用。通用 [&#8230;]]]></description>
										<content:encoded><![CDATA[</p>
<p><strong>不全,老文.</strong></p>
<p><strong>　　一、Request <br />　　Request对象把客户信息保存在几个集合中，供ASP应用使用。通用的访问方法为：Request.Collection(&quot;membername&quot;) <br />　　当你不指定集合名时，以(1)QueryString,(2)Form,(3)Cookie和(4)ServerVariable <br />的顺序搜索所有集合，当发现第一个匹配的变量时，就认定他是要引用的成员。当然，为了提高效率，你最好显式指定是那个集合中的成员。 <br />　　QueryString集合 <br />　　当HTML表单使用GET方法向ASP文件传递数据时，数据被保存在集合QueryString中。其成员可以具有与之相关的多个值，也就是说，同一个表单中，多个元素可以有相同的名字，下面的代码访问这些数据： <br />&lt;%For each item in Request.QueryString(&quot;Name&quot;) <br />Response.write Item &amp;&quot;&lt;br&gt;&quot; <br />Next %&gt; <br />　　Form集合 <br />　　当表单用POST方法时，数据被保存在Form集合中。 <br />　　ServerVariable集合 <br />　　保存了随HTTP请求一起传送HTTP头的信息，可以通过他获取有关浏览器的信息，主要成员有： <br />REMOTE_ADDR 远程主机IP地址 <br />REMOTE_HOST 远程主机名称 <br />REMOTE_USER 客户名称 <br />REQUEST_METHOD 请求方法（如POST，GET，HEAD） <br />SERVER_NAME 服务器名 <br />SERVER_PROTOCOL 服务器版本号（如HTTP/1。0） </p>
<p>　　二、Response对象 <br />　　用来控制向客户返回的HTML的内容，有若干属性和方法。下面介绍我认为重要的： <br />　　Buffer属性 <br />　　如果为True,则Response的内容要写入缓冲区，当脚本处理完时再发给客户。 <br />　　Status属性 <br />传递HTTP Response报文的状态。服务器返回的状态代码由三位数字组成，可以用于测试阶段和转换控制到其他站点（即Forward） <br />　　Write方法 <br />　　向客户输出HTML，可以是任何合法的HTML脚本。 <br />　　Redirect方法 <br />　　使浏览器重新定向到另外一个URL上，如： <br />&lt;%browsetype=Request.ServerVariables(&quot;HTTP_USER_AGENT&quot;) <br />IF Left(browsetype,11)=&quot;Mozilla/2.0&quot; then <br />Response.Redirect &quot;FancyStart.asp&quot; <br />Else <br />Response.Redirect &quot;OldStart.asp&quot; <br />End if%&gt; <br />　　Clear方法 <br />　　如果设Buffer属性为True，则Clear方法清楚所有缓冲区内容。 <br />　　Flush方法 <br />　　将缓冲内容立即发送给客户。 <br />　　End方法 <br />　　当Active Server遇到该方法时，立即停止处理ASP文件，如果有缓冲，立即发送内容到客户。 <br />　　BinaryWrite方法 <br />　　输出二进制数据 </p>
<p>　　三、Request对象和Response对象的Cookies集合 <br />　　1.写入Cookies <br />　　Response.Cookies(&quot;Cookie名称&quot;)[(&quot;键名称&quot;).属性]=值 <br />　　如果该Cookie已经存在，则值被新值替代，否则，创建该cookie <br />　　例如： <br />&lt;% Response.Cookies(&quot;NewCookie&quot;)=&quot;New Cookie Value&quot; %&gt; <br />　　2.读取Cookies <br />　　如： <br />&lt;%=Request.Cookies(&quot;NewCookie&quot;)%&gt; <br />　　Cookie还有一些属性，请参见有关资料。 </p>
<p>　　四、Application对象 <br />　　Active Server应用程序是虚拟目录及其子目录下的所有文件，即一个WEB。可以使用Application对象在应用软件的所有用户中共享信息，并可以在服务器运行期间持久地保存数据。他有一些控制访问应用层数据的方法和事件。 <br />　　Application本身没有内置属性，可以有用户定义：Application(&quot;属性名&quot;)=值 <br />　　保存在Application对象中的数据可以被Application的所有用户读取。如用来做访问记数：Application(&quot;aVisits&quot;)=Application(&quot;aVisits&quot;)+1 <br />　　方法有两个： <br />　　Lock: <br />　　当用户调用Lock时，只有当前用户能够编辑或增加Application对象的属性。 <br />　　Unlock: <br />　　一定要记住，调用了Lock，完成时一定要调用Unlock. <br />　　事件也有两个： <br />　　Application_OnStart事件：应用程序启动时调用。 <br />　　Application_OnStart事件：应用程序终止时调用。 <br />　　这两个事件再加上Session的两个事件的处理程序都放在文件Global.asp中，一个Web应用只有一个Global.asa文件，且放在该应用的根目录下。一个Global.asp文件的例子如下： <br />&lt;Script Language=&quot;VBScript&quot; Runat=&quot;Server&quot;&gt; <br />Sub Application_OnStart <br />Dim laChats(15) <br />Application(&quot;gaChats&quot;)=maChats <br />Application(&quot;giCounter&quot;)=0 <br />End Sub </p>
<p>　　五、Session对象 <br />Active Server使用会话设置为使用应用程序的单个用户持久保持数据。当用户请求Active Server应用程序中ASP文件的URL时，要启动Session。在缺省情况下，如果没有用户请求，则服务器只保留Session20分钟。用户也可以通过设Session的属性TimeOut来改变。或显示地调用Session.Abandon方法来释放Session对象。 <br />　　SessionID属性 <br />　　唯一标识一个会话的标识符。 <br />　　TimeOut属性 <br />　　定义Session保留的时限，单位为分钟，如Session.TimeOut=10 <br />　　像Application一样，Session也可由用户来定义属性。 <br />　　Session的唯一方法是Abandon,用来取消用户的Session对象，并释放其占用的服务器资源。如：&lt;%Session.Abandon%&gt; <br />　　事件有Session_OnStart和Session_OnEnd,其处理程序应放在文件Glabal.asa中。 </p>
<p>　　六、Server对象 <br />　　1.HTMLEncode方法 <br />　　对特定的字符串进行HTML编码，如你本来要显示下列内容： <br />The Underline tag(&lt;u&gt;&lt;/u&gt;) is used to underline the surrounded text. <br />　　但很可能实际显示成： <br />The Underline tag() is used to underline the surrounded text. <br />　　为了避免这种情况，可以调用Server对象的HTMLEncode方法，如： <br />&lt;% <br />Response.Write Server.HTMLEncode(&quot;The Underline tag(&lt;U&gt;&lt;/U&gt;) is used to underline the surrounded text.&quot;) <br />%&gt; <br />　　2.URLEncode方法 <br />　　根据URL规则对字符串进行编码。当字符串数据以URL格式传递到服务器时，串中间不能有空格，不能有特殊字符，这时，你就必须用URL编码。 <br />　　3.CreateObject方法 <br />　　用于创建已注册到服务器机器上的ActiveX组件例程，这恐怕是最重要的一个方法了: <br />　　句法如下： <br />Server.CreateObject(&quot;ComponentName&quot;) <br />　　可以作为例程启动的组件可以是ActiveX能够使用的所有内置组件，实际上是存在于服务器上的任何ActiveX组件。比如，要使用金融计算，步骤如下： <br />　　1.创建对象 <br />&lt;% <br />set x=server.createobject(&quot;extend.financial&quot;); <br />%&gt; <br />　　2.调用对象的方法 <br />&lt;% <br />set x=server.createobject(&quot;extend.financial&quot;) <br />response.write Format(x.futval(.07/12,200,-500),&quot;###,###,##0.00&quot;) <br />%&gt; <br />　　3.释放例程 <br />&lt;% <br />set x=Nothing <br />%&gt; </p>
<p>　　七、FileSystem和TextStream对象 <br />　　FileSystem和TextStream对象可用于建立对文件系统的访问，并提供顺序访问文件的机制。FileSystem没有属性，只有两个方法，第一个方法是CreateTextFile方法，可以在宿主机上创建新的文本文件，并返回TextStream对象以提供对新创建文件的访问机制。第二个是OpenTextFile方法，用于打开文本文件供顺序访问并返回一个TextStream对象。如： </p>
<p>&lt;% <br />set fsFilesys=CreateObject(&quot;Scripting.FileSystemObject&quot;) <br />set tsCoffee=fsFilesys.CreateTextFile(&quot;c:\coffe.txt&quot;,True) <br />tsCoffee.WriteLine(&quot;Man,I Could use some coffee.&quot;) <br />tsCoffee.Close <br />%&gt; <br />　　TextStream对象的使用有： <br />　　AtEndOfLine:如果文件当前字符处在行的末尾则返回true <br />　　AtEndOfScreen:如果当前字符在文件的末尾则返回true <br />　　Column:返回当前字符的列号 <br />　　Line:返回当前字符的行号 <br />　　TextStream对象的方法为： <br />　　Close:关闭并释放TextStream对象 <br />　　Read:从一个文件中读取给定个数的字符到一个变量中 <br />　　ReadAll:读取文件的全部内容到一个变量中 <br />　　ReadLine:读取给定行号的内容到一个变量中 <br />　　Skip:跳过给定个数的字符 <br />　　SkipLine:跳过给顶的行书 <br />　　Write:写如字符串 <br />　　WriteLine:写入以换行结束的字符串 <br />　　WriteBlankLines:写入给顶数量的空格 </strong></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ASP访问SQL Server内置对象</title>
		<link>https://lanlingyi.com/archives/185</link>
		
		<dc:creator><![CDATA[lanling]]></dc:creator>
		<pubDate>Sun, 29 Nov 2009 10:42:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[asp教程]]></category>
		<guid isPermaLink="false">http://lanlingyi.com/?p=185</guid>

					<description><![CDATA[平常我们只听说过ADO等一类ASP对象，但在ASP中还有个鲜为人知的专门SQL Server的ASP访问对象, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p> <strong>平常我们只听说过ADO等一类ASP对象，但在ASP中还有个鲜为人知的专门SQL Server的ASP访问对象,它就是SQLOLE.SQLServer对象。SQLOLE.SQLServer可以直接访问SQL Server的系统属性。以Set oSQLServer = CreateObject (&quot;SQLOLE.SQLServer&quot;)语句将产生一个SQL Server服务器对象。 </p>
<p>---- 若要查看此服务器中数据库的集合，可用语句： </p>
<p>For Each SQLDB In oSQLServer.Databases <br />Response.Write SQLDB.Name ‘将列出所有的数据库，如Pubs等 <br />Next </p>
<p>---- 若要查看某数据库中(如PUBS数据库)数据表的集合，可用语句： </p>
<p>pubDatabase=oSQLServer.Databases(“pubs”) <br />’oSQLServer是前面创建的SQL Server服务器对象 <br />For Each DBTable In pubDatabase.Tables <br />Response.Write DBTable.Name <br />Next </p>
<p>---- 下面的语句将列出数据库中(PUBS数据库)数据视图 </p>
<p>pubDatabase =oSQLServer.Databases(“pubs”) <br />’oSQLServer是前面创建的SQL Server服务器对象 <br />For Each DBView In pubDatabase.Views <br />Response.Write DBView.Text <br />Next </p>
<p>---- 以下语句将列出数据库中(PUBS数据库)存贮过程 </p>
<p>pubDatabase =oSQLServer.Databases(“pubs”) <br />’oSQLServer是前面创建的SQL Server服务器对象 <br />For Each DBSP In pubDatabase.StoredProcedures <br />Response.Write DBSP.Text <br />Next </p>
<p>---- 程序运行的结果（取数据表名）： </p>
<p>---- 取存贮过程的结果： </p>
<p>---- 一个完整的小例子源码附后（其它功能读者可加入）。 </p>
<p>&lt; %@ LANGUAGE = VBScript % &gt; </p>
<p>&lt; HTML &gt; <br />&lt; HEAD &gt; <br />&lt; META NAME=&quot;GENERATOR&quot; Content= <br />&quot;Microsoft Developer Studio&quot; &gt; <br />&lt; META HTTP-EQUIV=&quot;Content-Type&quot; <br />content=&quot;text/html; charset=gb2312&quot; &gt; </p>
<p>&lt; TITLE &gt;&lt; /TITLE &gt; <br />&lt; /HEAD &gt; </p>
<p>&lt; % <br />On Error Resume Next <br />Dim oSQLServer <br />Set oSQLServer = CreateObject (&quot;SQLOLE.SQLServer&quot;) </p>
<p>strServer = &quot;dep&quot; <br />strLogin = &quot;sa&quot; <br />strPwd = &quot;&quot; </p>
<p>oSQLServer.Connect strServer,strLogin,strPwd </p>
<p>% &gt; </p>
<p>&lt; BODY BGCOLOR=#ffffff &gt; <br />数据库列表 <br />&lt; SELECT NAME=&quot;Database&quot; &gt; <br />&lt; % <br />For Each SQLDB In oSQLServer.Databases <br />If Not SQLDB.SystemObject Then <br />Response.Write &quot;&lt; OPTION VALUE= <br />&quot;&quot;&quot; &amp; SQLDB.Name &amp; &quot;&quot;&quot; &gt;&quot; &amp; SQLDB.Name </p>
<p>&amp; &quot; &quot; <br />End If <br />Next <br />Set oSQLServer = Nothing <br />% &gt; <br />&lt; /SELECT &gt; <br />&lt; /BODY &gt; <br />&lt; /HTML &gt; </p>
<p></strong> </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>转化ip地址为长整型数字</title>
		<link>https://lanlingyi.com/archives/186</link>
		
		<dc:creator><![CDATA[lanling]]></dc:creator>
		<pubDate>Sun, 29 Nov 2009 10:40:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[asp教程]]></category>
		<guid isPermaLink="false">http://lanlingyi.com/?p=186</guid>

					<description><![CDATA[将ip地址转换为长整型 &#60;% Function CLngIP(ByVal asNewIP) Dim ln [&#8230;]]]></description>
										<content:encoded><![CDATA[</p>
<p><strong>将ip地址转换为长整型</strong></p>
<p><strong>&lt;% <br />Function CLngIP(ByVal asNewIP) <br />Dim lnResults <br />Dim lnIndex <br />Dim lnIpAry <br />lnIpAry = Split(asNewIP, &quot;.&quot;, 4) <br />For lnIndex = 0 To 3 <br />If Not lnIndex = 3 Then <br />lnIpAry(lnIndex) = lnIpAry(lnIndex) * (256 ^ (3 - lnIndex)) <br />End If <br />lnResults = lnResults + lnIpAry(lnIndex) <br />Next <br />CLngIP = lnResults <br />End Function <br />%&gt;</strong></p>
</p>
<p><strong></strong> </p>
<p><strong>逆函数</strong></p>
<p><strong>&lt;% <br />Function CStrIP(ByVal anNewIP) <br />Dim lsResults <br />Dim lnTemp <br />Dim lnIndex <br />For lnIndex = 3 To 0 Step -1 <br />lnTemp = Int(anNewIP / (256 ^ lnIndex)) <br />lsResults = lsResults &amp; lnTemp &amp; &quot;.&quot; <br />anNewIP = anNewIP - (lnTemp * (256 ^ lnIndex)) <br />Next <br />lsResults = Left(lsResults, Len(lsResults) - 1) <br />CStrIP = lsResults <br />End Function <br />%&gt;</strong></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>asp获取文件md5值</title>
		<link>https://lanlingyi.com/archives/187</link>
		
		<dc:creator><![CDATA[lanling]]></dc:creator>
		<pubDate>Sun, 29 Nov 2009 10:38:00 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[asp教程]]></category>
		<guid isPermaLink="false">http://lanlingyi.com/?p=187</guid>

					<description><![CDATA[网上asp加密字符的MD5很多，也很普遍，因为受到asp语言本身的限制，对文件进行md5介绍的文章很少，本文通 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p> 网上asp加密字符的MD5很多，也很普遍，因为受到asp语言本身的限制，对文件进行md5介绍的文章很少，本文通过2种方式来谈谈如何通过asp获取文件的md5值。 </p>
<p>网上asp加密字符的MD5很多，也很普遍，但是对文件进行md5的确很少，因为受到asp语言本身的限制。我们知道字符串的md5可以对明文进行不可逆的加密，从而保证数据储存或者传送的安全性。同样的，对文件进行md5加密也是为了保证在网络传送时不被修改和校验，另外还有一个用途就是在个人站点里面的应用:可以保证上传的图片或文件具有唯一性。原理是,上传到服务器之后,同时在数据库中记录该上传文件的md5值，这样在下次传同样文件的时候，可以通过查询数据库是否是相同的文件，md5值相同，我们就认为它是相同的文件，md5值就是文件的“身份证”，其实百度也有这方面的应用，在百度搜索图片，点开图片后，有时候会出现“您还可以点击以下链接查看到这张图片：XXX网址”，原理也是一样，对文件进行md5。 <br />废话少说，开始正文。 <br />一、asp通过xml交互方式调用.Net程序实现文件md5 <br />asp由于本身语言的限制，无法实现文件的md5，但是.net确可以，那是不是可以通过.net对文件进行md5,然后发送信息给asp接收，这样就可以做到asp的md5了呢，答案是肯定的。这里涉及到asp与.net程序间的交互，我以前写过一个asp的类：《asp处理xml数据的发送、接收类》，可以上我的百度空间看：http://hi.baidu.com/manbutianmi/blog/item/dec182fc6db36587b801a0f6.html，讲的是asp处理xml数据的发送与接收，可用于各种异构系统之间API接口间通讯。本文正好是这个类的一个应用。代码如下： <br />asp端代码 <br />xmlcls.asp <br />&lt;% <br />Rem 处理xml数据的发送、接收类 <br />'-------------------------------------------------- <br />'转载的时候必须保留此版权信息 <br />'作者:walkman <br />'网址:手机主题网:http://www.shouji138.com <br />'版本:ver1.0 <br />'-------------------------------------------------- <br />Class XmlClass </p>
<p>Rem 变量定义 <br />Private XmlDoc,XmlHttp <br />Private MessageCode,SysKey,XmlPath <br />Private m_GetXmlDoc,m_url <br />Private m_XmlDocAccept <br />Rem 初始化 <br />Private Sub Class_Initialize() <br />On Error Resume Next <br />MessageCode = &quot;&quot; <br />XmlPath = &quot;&quot; <br />Set XmlDoc = Server.CreateObject(&quot;msxml2.FreeThreadedDOMDocument.3.0&quot;) <br />XmlDoc.ASYNC = False <br />End Sub </p>
<p>Rem 销毁对象 <br />Private Sub Class_Terminate() <br />If IsObject(XmlDoc) Then Set XmlDoc = Nothing <br />If IsObject(m_XmlDocAccept) Then Set m_XmlDocAccept = Nothing <br />If IsObject(m_GetXmlDoc) Then Set m_GetXmlDoc = Nothing <br />End Sub </p>
<p>'公共属性定义开始-------------------------- <br />Rem 错误信息 <br />Public Property Get Message() <br />Message = MessageCode <br />End Property </p>
<p>Rem 发送xml的地址 <br />Public Property Let URL(str) <br />m_url = str <br />End Property <br />'公共属性定义结束-------------------------- </p>
<p>'私有过程、方法开始-------------------------- <br />Rem 加载xml <br />Private Sub LoadXmlData() <br />If XmlPath &lt;&gt; &quot;&quot; Then <br />If Not XmlDoc.Load(XmlPath) Then <br />XmlDoc.LoadXml &quot;&lt;?xml version=&quot;&quot;1.0&quot;&quot; encoding=&quot;&quot;gb2312&quot;&quot;?&gt;&lt;root/&gt;&quot; <br />End If <br />Else <br />XmlDoc.LoadXml &quot;&lt;?xml version=&quot;&quot;1.0&quot;&quot; encoding=&quot;&quot;gb2312&quot;&quot;?&gt;&lt;root/&gt;&quot; <br />End If <br />End Sub <br />Rem 字符转化 <br />Private Function AnsiToUnicode(ByVal str) <br />Dim i, j, c, i1, i2, u, fs, f, p <br />AnsiToUnicode = &quot;&quot; <br />p = &quot;&quot; <br />For i = 1 To Len(str) <br />c = Mid(str, i, 1) <br />j = AscW(c) <br />If j &lt; 0 Then <br />j = j + 65536 <br />End If <br />If j &gt;= 0 And j &lt;= 128 Then <br />If p = &quot;c&quot; Then <br />AnsiToUnicode = &quot; &quot; &amp; AnsiToUnicode <br />p = &quot;e&quot; <br />End If <br />AnsiToUnicode = AnsiToUnicode &amp; c <br />Else <br />If p = &quot;e&quot; Then <br />AnsiToUnicode = AnsiToUnicode &amp; &quot; &quot; <br />p = &quot;c&quot; <br />End If <br />AnsiToUnicode = AnsiToUnicode &amp; (&quot;&amp;#&quot; &amp; j &amp; &quot;;&quot;) <br />End If <br />Next <br />End Function </p>
<p>Rem 字符转化 <br />Private Function strAnsi2Unicode(asContents) <br />Dim len1,i,varchar,varasc <br />strAnsi2Unicode = &quot;&quot; <br />len1=LenB(asContents) <br />If len1=0 Then Exit Function <br />For i=1 to len1 <br />varchar=MidB(asContents,i,1) <br />varasc=AscB(varchar) <br />If varasc &gt; 127 Then <br />If MidB(asContents,i+1,1)&lt;&gt;&quot;&quot; Then <br />strAnsi2Unicode = strAnsi2Unicode &amp; chr(ascw(midb(asContents,i+1,1) &amp; varchar)) <br />End If <br />i=i+1 <br />Else <br />strAnsi2Unicode = strAnsi2Unicode &amp; Chr(varasc) <br />End If <br />Next <br />End Function </p>
<p>Rem 往文件中追加字符 <br />Private Sub WriteStringToFile(filename,str) <br />On Error Resume Next <br />Dim fs,ts <br />Set fs= createobject(&quot;scripting.filesystemobject&quot;) <br />If Not IsObject(fs) Then Exit Sub <br />Set ts=fs.OpenTextFile(Server.MapPath(filename),8,True) <br />ts.writeline(str) <br />ts.close <br />Set ts=Nothing <br />Set fs=Nothing <br />End Sub <br />'私有过程、方法结束-------------------------- </p>
<p>'公共方法开始-------------------------- </p>
<p>'''''''''''发送xml部分开始 <br />Rem 从外部xml文件填充XmlDoc对象 <br />Public Sub LoadXmlFromFile(path) <br />XmlPath = Server.MapPath(path) <br />LoadXmlData() <br />End Sub </p>
<p>Rem 用字符串填充XmlDoc对象 <br />Public Sub LoadXmlFromString(str) <br />XmlDoc.LoadXml str <br />End Sub </p>
<p>Rem 设置node的参数 如 NodeValue &quot;appID&quot;,AppID,1,False <br />'-------------------------------------------------- <br />'参数 ： <br />'NodeName 节点名 <br />'NodeText 值 <br />'NodeType 保存类型 [text=0,cdata=1] <br />'blnEncode 是否编码 [true,false] <br />'-------------------------------------------------- <br />Public Sub NodeValue(Byval NodeName,Byval NodeText,Byval NodeType ,Byval blnEncode) <br />Dim ChildNode,CreateCDATASection <br />NodeName = Lcase(NodeName) <br />If XmlDoc.documentElement.selectSingleNode(NodeName) is nothing Then <br />Set ChildNode = XmlDoc.documentElement.appendChild(XmlDoc.createNode(1,NodeName,&quot;&quot;)) <br />Else <br />Set ChildNode = XmlDoc.documentElement.selectSingleNode(NodeName) <br />End If <br />If blnEncode = True Then <br />NodeText = AnsiToUnicode(NodeText) <br />End If <br />If NodeType = 1 Then <br />ChildNode.Text = &quot;&quot; <br />Set CreateCDATASection = XmlDoc.createCDATASection(Replace(NodeText,&quot;]]&gt;&quot;,&quot;]]&amp;gt;&quot;)) <br />ChildNode.appendChild(createCDATASection) <br />Else <br />ChildNode.Text = NodeText <br />End If <br />End Sub </p>
<p>'-------------------------------------------------- <br />'获取发送包XML中节点的值 <br />'参数 ： <br />'Str 节点名 <br />'-------------------------------------------------- <br />Public Property Get XmlNode(Byval Str) <br />If XmlDoc.documentElement.selectSingleNode(Str) is Nothing Then <br />XmlNode = &quot;Null&quot; <br />Else <br />XmlNode = XmlDoc.documentElement.selectSingleNode(Str).text <br />End If <br />End Property <br />'-------------------------------------------------- <br />'获取返回XML数据对象 <br />'例： <br />'当GetXmlData不为NULL时，GetXmlData为XML对象 <br />'-------------------------------------------------- <br />Public Property Get GetXmlData() <br />Set GetXmlData = m_GetXmlDoc <br />End Property </p>
<p>'-------------------------------------------------- <br />'发送xml包 <br />'-------------------------------------------------- <br />Public Sub SendHttpData() <br />Dim i,GetXmlDoc,LoadAppid <br />Set Xmlhttp = Server.CreateObject(&quot;MSXML2.ServerXMLHTTP.3.0&quot;) <br />Set GetXmlDoc = Server.CreateObject(&quot;msxml2.FreeThreadedDOMDocument.3.0&quot;) ' 返回xml包 <br />XmlHttp.Open &quot;POST&quot;, m_url, false <br />XmlHttp.SetRequestHeader &quot;content-type&quot;, &quot;text/xml&quot; <br />XmlHttp.Send XmlDoc <br />'Response.Write strAnsi2Unicode(xmlhttp.responseBody) <br />If GetXmlDoc.load(XmlHttp.responseXML) Then <br />Set m_GetXmlDoc = GetXmlDoc <br />Else <br />MessageCode = &quot;请求数据错误！&quot; <br />Exit Sub <br />End If <br />Set GetXmlDoc = Nothing <br />Set XmlHttp = Nothing <br />End Sub </p>
<p>'-------------------------------------------------- <br />'打印发送请求XML数据 <br />'-------------------------------------------------- <br />Public Sub PrintSendXmlData() <br />Response.Clear <br />Response.ContentType = &quot;text/xml&quot; <br />Response.CharSet = &quot;gb2312&quot; <br />Response.Expires = 0 <br />Response.Write &quot;&lt;?xml version=&quot;&quot;1.0&quot;&quot; encoding=&quot;&quot;gb2312&quot;&quot;?&gt;&quot;&amp;vbNewLine <br />Response.Write XmlDoc.documentElement.XML <br />End Sub </p>
<p>'-------------------------------------------------- <br />'打印返回XML数据 <br />'-------------------------------------------------- <br />Public Sub PrintGetXmlData() </p>
<p>Response.Clear <br />Response.ContentType = &quot;text/xml&quot; <br />Response.CharSet = &quot;gb2312&quot; <br />Response.Expires = 0 <br />If IsObject(m_GetXmlDoc) Then <br />Response.Write &quot;&lt;?xml version=&quot;&quot;1.0&quot;&quot; encoding=&quot;&quot;gb2312&quot;&quot;?&gt;&quot;&amp;vbNewLine <br />Response.Write m_GetXmlDoc.documentElement.XML <br />Else <br />Response.Write &quot;&lt;?xml version=&quot;&quot;1.0&quot;&quot; encoding=&quot;&quot;gb2312&quot;&quot;?&gt;&lt;root&gt;&lt;/root&gt;&quot; <br />End If <br />End Sub </p>
<p>Rem 保存发送请求xml数据到文件，文件名为sendxml_日期.txt <br />Public Sub SaveSendXmlDataToFile() <br />Dim filename,str <br />filename = &quot;sendxml_&quot; &amp; DateValue(now) &amp; &quot;.txt&quot; <br />str = &quot;&quot; <br />str = str &amp; &quot;&quot;&amp; Now() &amp; vbNewLine <br />str = str &amp; &quot;---------------------------------------------&quot;&amp; vbNewLine <br />str = str &amp; &quot;&lt;?xml version=&quot;&quot;1.0&quot;&quot; encoding=&quot;&quot;gb2312&quot;&quot;?&gt;&quot; &amp; vbNewLine <br />str = str &amp; XmlDoc.documentElement.XML &amp; vbNewLine <br />str = str &amp; &quot;---------------------------------------------&quot;&amp; vbNewLine <br />str = str &amp; vbNewLine &amp; vbNewLine &amp; vbNewLine <br />WriteStringToFile filename,str <br />End Sub </p>
<p>Rem 保存返回XML数据到文件，文件名为getxml_日期.txt <br />Public Sub SaveGetXmlDataToFile() <br />Dim filename,str <br />filename = &quot;getxml_&quot; &amp; DateValue(now) &amp; &quot;.txt&quot; <br />str = &quot;&quot; <br />str = str &amp; &quot;&quot;&amp; Now() &amp; vbNewLine <br />str = str &amp; &quot;---------------------------------------------&quot;&amp; vbNewLine <br />If IsObject(m_GetXmlDoc) Then <br />str = str &amp; &quot;&lt;?xml version=&quot;&quot;1.0&quot;&quot; encoding=&quot;&quot;gb2312&quot;&quot;?&gt;&quot; &amp; vbNewLine <br />str = str &amp; m_GetXmlDoc.documentElement.XML <br />Else <br />str = str &amp; &quot;&lt;?xml version=&quot;&quot;1.0&quot;&quot; encoding=&quot;&quot;gb2312&quot;&quot;?&gt;&quot; &amp; vbNewLine &amp; &quot;&lt;root&gt;&quot; &amp; vbNewLine &amp; &quot;&lt;/root&gt;&quot; <br />End If <br />str = str &amp; vbNewLine <br />str = str &amp; &quot;---------------------------------------------&quot;&amp; vbNewLine <br />str = str &amp; vbNewLine &amp; vbNewLine &amp; vbNewLine <br />WriteStringToFile filename,str <br />End Sub </p>
<p>'-------------------------------------------------- <br />'获取返回xml的节点信息 <br />'XmlClassObj.GetSingleNode(&quot;//msg&quot;) <br />'-------------------------------------------------- <br />Public Function GetSingleNode(nodestring) <br />If IsObject(m_GetXmlDoc) Then <br />GetSingleNode = m_GetXmlDoc.documentElement.selectSingleNode(nodestring).text <br />Else <br />GetSingleNode = &quot;&quot; <br />End If <br />End Function <br />''''''''''''''''''发送xml部分结束 </p>
<p>''''''''''''''''''接收xml部分开始 <br />'-------------------------------------------------- <br />'接收XML包，错误信息通过Message对象获取 <br />'-------------------------------------------------- <br />Public Function AcceptHttpData() <br />Dim XMLdom <br />Set XMLdom = Server.CreateObject(&quot;Microsoft.XMLDOM&quot;) <br />XMLdom.Async = False <br />XMLdom.Load(Request) <br />If XMLdom.parseError.errorCode &lt;&gt; 0 Then <br />MessageCode = &quot;不能正确接收数据&quot; &amp; &quot;Description: &quot; &amp; XMLdom.parseError.reason &amp; &quot;&lt;br&gt;Line: &quot; &amp; XMLdom.parseError.Line <br />Set m_XmlDocAccept = Null <br />Else <br />Set m_XmlDocAccept = XMLdom <br />End If <br />End Function <br />'-------------------------------------------------- <br />'返回接收XML包节点信息 <br />'XmlClassObj.GetSingleNode(&quot;//msg&quot;) <br />'-------------------------------------------------- <br />Public Function AcceptSingleNode(nodestring) <br />If IsObject(m_XmlDocAccept) Then <br />AcceptSingleNode = m_XmlDocAccept.documentElement.selectSingleNode(nodestring).text <br />Else <br />AcceptSingleNode = &quot;&quot; <br />End If <br />End Function </p>
<p>'-------------------------------------------------- <br />'打印接收端接收到的XML数据 <br />'-------------------------------------------------- <br />Public Sub PrintAcceptXmlData() <br />Response.Clear <br />Response.ContentType = &quot;text/xml&quot; <br />Response.CharSet = &quot;gb2312&quot; <br />Response.Expires = 0 <br />If IsObject(m_XmlDocAccept) Then <br />Response.Write &quot;&lt;?xml version=&quot;&quot;1.0&quot;&quot; encoding=&quot;&quot;gb2312&quot;&quot;?&gt;&quot;&amp;vbNewLine <br />Response.Write m_XmlDocAccept.documentElement.XML <br />Else <br />Response.Write &quot;&lt;?xml version=&quot;&quot;1.0&quot;&quot; encoding=&quot;&quot;gb2312&quot;&quot;?&gt;&lt;root&gt;&lt;/root&gt;&quot; <br />End If <br />End Sub </p>
<p>Rem 保存接收的XML包数据到文件，文件名为acceptxml_日期.txt <br />Public Sub SaveAcceptXmlDataToFile() <br />Dim filename,str <br />filename = &quot;acceptxml_&quot; &amp; DateValue(now) &amp; &quot;.txt&quot; <br />str = &quot;&quot; <br />str = str &amp; &quot;&quot;&amp; Now() &amp; vbNewLine <br />str = str &amp; &quot;---------------------------------------------&quot;&amp; vbNewLine <br />If IsObject(m_XmlDocAccept) Then <br />str = str &amp; &quot;&lt;?xml version=&quot;&quot;1.0&quot;&quot; encoding=&quot;&quot;gb2312&quot;&quot;?&gt;&quot; &amp; vbNewLine <br />str = str &amp; m_XmlDocAccept.documentElement.XML <br />Else <br />str = str &amp; &quot;&lt;?xml version=&quot;&quot;1.0&quot;&quot; encoding=&quot;&quot;gb2312&quot;&quot;?&gt;&quot; &amp; vbNewLine &amp; &quot;&lt;root&gt;&quot; &amp; vbNewLine &amp; &quot;&lt;/root&gt;&quot; <br />End If <br />str = str &amp; vbNewLine <br />str = str &amp; &quot;---------------------------------------------&quot;&amp; vbNewLine <br />str = str &amp; vbNewLine &amp; vbNewLine &amp; vbNewLine <br />WriteStringToFile filename,str <br />End Sub </p>
<p>''''''''''''''''''接收xml部分结束 <br />Rem 保存调试数据到文件，文件名为debugnote_日期.txt <br />Public Sub SaveDebugStringToFile(debugstr) <br />Dim filename,str <br />filename = &quot;debugnote_&quot; &amp; DateValue(now) &amp; &quot;.txt&quot; <br />str = &quot;&quot; <br />str = str &amp; &quot;&quot;&amp; Now() &amp; vbNewLine <br />str = str &amp; &quot;---------------------------------------------&quot;&amp; vbNewLine <br />str = str &amp; debugstr &amp; vbNewLine <br />str = str &amp; &quot;---------------------------------------------&quot; <br />str = str &amp; vbNewLine &amp; vbNewLine &amp; vbNewLine <br />WriteStringToFile filename,str <br />End Sub <br />'公共方法结束-------------------------- </p>
<p>End Class <br />%&gt; <br />filemd5fun.asp <br />&lt;!--#Include File=&quot;xmlcls.asp&quot;--&gt; <br />&lt;% <br />Rem 取得文件的md5，参数为文件名 <br />Function GetFileMD5(filename) <br />Const Apisysno = &quot;k8n6g2b0m1a6b0f6e8&quot; '接口的Key值，防止被非法适用 接口应该保持一致 <br />Dim XmlClassObj <br />Set XmlClassObj = new XmlClass '创建对象 <br />XmlClassObj.LoadXmlFromString(&quot;&lt;?xml version=&quot;&quot;1.0&quot;&quot; encoding=&quot;&quot;gb2312&quot;&quot;?&gt;&lt;root/&gt;&quot;) '用xml字符填充XMLDOC对象，用来发送xml <br />XmlClassObj.URL = &quot;http://www.shouji138.com/aspnet2/FileMD5.aspx&quot; '设置响应的url，这里应该改成你的网址 </p>
<p>Rem xml格式 <br />Rem &quot;&lt;?xml version=&quot;1.0&quot; encoding=&quot;gb2312&quot;?&gt; <br />Rem &lt;root&gt; <br />Rem &lt;sysno&gt;&lt;/sysno&gt; <br />Rem &lt;apiaction&gt;&lt;/apiaction&gt; <br />Rem &lt;filename&gt;&lt;/filename&gt; <br />Rem &lt;/root&gt; </p>
<p>XmlClassObj.NodeValue &quot;sysno&quot;,Apisysno,0,False '接口的Key值，防止被非法适用 <br />XmlClassObj.NodeValue &quot;apiaction&quot;,&quot;createfilemd5&quot;,0,False '接口的响应动作，用于定义一个接口用于多种用途 <br />XmlClassObj.NodeValue &quot;filename&quot;,filename,0,False '文件路径和文件名，用相对路径 <br />'XmlClassObj.SaveSendXmlDataToFile() '将发送的xml数据库包存入txt文件，用于调试之用 <br />XmlClassObj.SendHttpData() '发送xml数据 <br />'XmlClassObj.SaveGetXmlDataToFile() '保存接收到的xml数据 </p>
<p>Rem 处理结果 <br />Dim message,status <br />status = XmlClassObj.GetSingleNode(&quot;//status&quot;) '显示状态，如果为OK则表示成功，否则有错误发生 <br />message = XmlClassObj.GetSingleNode(&quot;//message&quot;) '显示取到的MD5值，如果status不为OK，则message为错误信息 <br />Set XmlClassObj = Nothing <br />If status = &quot;OK&quot; Then <br />GetFileMD5 = message <br />Else <br />GetFileMD5 = &quot;&quot; <br />End If <br />End Function <br />%&gt; <br />test.asp <br />&lt;!--#Include File=&quot;filemd5fun.asp&quot;--&gt; <br />&lt;% <br />Response.Write &quot;web.config的md5值是:&quot; &amp; GetFileMD5(&quot;web.config&quot;) &amp; &quot;&lt;br /&gt;&quot; <br />Response.Write &quot;files/logo-yy.gif的md5值是:&quot; &amp; GetFileMD5(&quot;files/logo-yy.gif&quot;) &amp; &quot;&lt;br /&gt;&quot; <br />Response.Write &quot;xmlcls.asp的md5值是:&quot; &amp; GetFileMD5(&quot;xmlcls.asp&quot;) &amp; &quot;&lt;br /&gt;&quot; <br />%&gt; </p>
<p>.net端代码： <br />MD5.cs <br />using System; <br />using System.Collections.Generic; <br />using System.Text; <br />using System.IO; <br />namespace Winsteps.FileMD5 <br />{ <br />public class MD5 <br />{ <br />public static string md5_hash(string path) <br />{ <br />try <br />{ <br />FileStream get_file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); <br />System.Security.Cryptography.MD5CryptoServiceProvider get_md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); <br />byte[] hash_byte = get_md5.ComputeHash(get_file); <br />string resule = System.BitConverter.ToString(hash_byte); <br />resule = resule.Replace(&quot;-&quot;, &quot;&quot;); <br />return resule; <br />} <br />catch (Exception e) <br />{ <br />return e.Message; <br />} <br />} <br />} <br />} <br />FileMD5.aspx <br />&lt;%@ Page Language=&quot;C#&quot; AutoEventWireup=&quot;true&quot; CodeBehind=&quot;FileMD5.aspx.cs&quot; Inherits=&quot;Winsteps.FileMD5.FileMD5&quot; %&gt; <br />&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt; <br />&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; &gt; <br />&lt;head runat=&quot;server&quot;&gt; <br />&lt;title&gt;手机主题网:http://www.shouji138.com&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;form id=&quot;form1&quot; runat=&quot;server&quot;&gt; <br />&lt;div&gt; </p>
<p>&lt;/div&gt; <br />&lt;/form&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br />FileMD5.aspx.cs <br />using System; <br />using System.Data; <br />using System.Configuration; <br />using System.Collections; <br />using System.Web; <br />using System.Web.Security; <br />using System.Web.UI; <br />using System.Web.UI.WebControls; <br />using System.Web.UI.WebControls.WebParts; <br />using System.Web.UI.HtmlControls; <br />using System.Xml; <br />using System.Configuration; <br />namespace Winsteps.FileMD5 <br />{ <br />public partial class FileMD5 : System.Web.UI.Page <br />{ <br />protected void Page_Load(object sender, EventArgs e) <br />{ <br />string sysno = &quot;11111&quot;; <br />string status = &quot;False&quot;; <br />string message = &quot;未指定的错误&quot;; <br />string net2sysno = ConfigurationManager.AppSettings[&quot;sysno&quot;]; <br />XmlDocument doc = new XmlDocument(); <br />try <br />{ </p>
<p>doc.Load(Request.InputStream); <br />sysno = doc.SelectSingleNode(&quot;//sysno&quot;).InnerText.Trim(); <br />if (net2sysno != sysno) <br />{ <br />message = &quot;非法适用！&quot;; <br />} <br />else <br />{ <br />string filename = Server.MapPath(doc.SelectSingleNode(&quot;//filename&quot;).InnerText.Trim()); <br />message = MD5.md5_hash(filename); <br />status = &quot;OK&quot;; <br />} <br />} <br />catch(Exception ex) <br />{ <br />message = ex.Message; <br />} <br />finally <br />{ <br />if (doc != null) <br />doc = null; <br />} <br />Response.Clear(); //清楚html字符 <br />Response.ContentType = &quot;text/xml&quot;; <br />Response.Charset = &quot;GB2312&quot;;//如果xml字符串中包含中文 <br />Response.Write(&quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;GB2312\&quot;?&gt;&quot;); <br />Response.Write(&quot;&lt;root&gt;&quot;); <br />Response.Write(&quot; &lt;status&gt;&quot; + status + &quot;&lt;/status&gt;&quot;); <br />Response.Write(&quot; &lt;message&gt;&quot; + message + &quot;&lt;/message&gt;&quot;); <br />Response.Write(&quot;&lt;/root&gt;&quot;); <br />Response.End(); <br />} <br />} <br />} </p>
<p>Web.config <br />&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; <br />&lt;configuration&gt; <br />&lt;appSettings&gt; <br />&lt;add key=&quot;sysno&quot; value=&quot;k8n6g2b0m1a6b0f6e8&quot;&gt;&lt;/add&gt; <br />&lt;/appSettings&gt; <br />&lt;system.web&gt; <br />&lt;httpRuntime executionTimeout=&quot;3600&quot; maxRequestLength=&quot;1048576&quot;/&gt; <br />&lt;compilation debug=&quot;true&quot; defaultLanguage=&quot;c#&quot; /&gt; <br />&lt;customErrors mode=&quot;Off&quot; /&gt; <br />&lt;identity impersonate=&quot;true&quot;/&gt; <br />&lt;authentication mode=&quot;Forms&quot;&gt; <br />&lt;forms name=&quot;forums&quot; path=&quot;/&quot; loginUrl=&quot;Login.aspx&quot; protection=&quot;All&quot; timeout=&quot;40&quot;&gt; <br />&lt;/forms&gt; <br />&lt;/authentication&gt; <br />&lt;pages validateRequest=&quot;false&quot;&gt;&lt;/pages&gt; <br />&lt;globalization requestEncoding=&quot;gb2312&quot; responseEncoding=&quot;gb2312&quot; culture=&quot;zh-CN&quot; uiCulture=&quot;zh-CN&quot;/&gt; <br />&lt;/system.web&gt; <br />&lt;/configuration&gt; </p>
<p>web.config的sysno要跟filemd5fun.asp里面的Apisysno保持一致，具体应用时应该要把这个key改成你自己的值来保证安全。 <br />演示地址:http://www.shouji138.com/aspnet2/filemd5.asp <br />代码虽然长，但是原理简单，asp发送xml数据给asp.net(xml中包含了要md5的文件名)-&gt;asp.net接收xml对文件进行md5-&gt;asp.net将结果通过xml返回给asp(xml中包含了获取到的md5值)-&gt;asp获取返回的xml，解析出md5值。 <br />应用范围： <br />1. 在两个系统之间传送文件时，可以在传送前进行文件md5，传送后进行文件md5，检查两值是否相等，如果相等则表示在传送过程中没有被修改。 <br />2. 做上传系统中，如果要求不能上传同文件的话，可以在上传之后的文件进行md5存入数据库中，这样下次上传同样文件，则md5会相同，拒绝上传。 <br />3. 在搜索引擎、迅雷本b2b软件中，对文件md5，具有相同md5的文件被认为是相同文件，而不管文件名是否相同，可以从多个源来分享文件。 <br />4. 其他应用。。。。。 </p>
<p>二、asp通过COM组件实现md5(需要在服务器上注册组件) <br />注册一个asp的文件md5组件，下载地址：http://www.shouji138.com/aspnet2/files/aspmd5.rar <br />然后将PARmf.dll文件拷贝到服务器的c:\WINDOWS\system32目录，运行regsvr32 parmf.dll进行注册，重启IIS。 <br />调用代码： <br />&lt;% <br />Set DelphiASPObj = Server.CreateObject(&quot;PARmf.md5file&quot;) <br />DelphiASPObj.in_path=Server.Mappath(&quot;Web.config&quot;) '文件路径 <br />Response.Write &quot;web.config的md5值是:&quot; &amp; DelphiASPObj.get_path_md5 &amp; &quot;&lt;br /&gt;&quot; <br />Set DelphiASPObj=nothing <br />%&gt; </p>
<p>三、两种方式获取文件md5的对比 </p>
<p>第一种方法通过与asp.net程序交互xml数据来得到文件的md5，需要服务器支持asp.net，一般的虚拟主机都提供asp.net环境，但是价格高点； <br />第二种方法通过注册COM组件实现，需要有服务器的权限，对于拥有服务器的比较合适。 <br />另外第一种方式的这种交互方法使得asp具有更大的灵活性，可以应用在2台不同的服务器上面进行数据交互，可广泛应用于各种异构平台。  </p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
