﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-wǒ小Ъц傻-随笔分类-asp</title><link>http://www.blogjava.net/litianyi520/category/17877.html</link><description>“我有一天长大了，希望做一个夏天卖冰棒，冬天卖烤红薯的街头小贩，因为这种职业
不但可以呼吸新鲜空气，又可以大街小巷的游走玩耍，更重要的是，一面做生意，一面可以
顺便看看，沿街的垃圾箱里，有没有被人丢弃的好东西，这……”
</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 18:45:44 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 18:45:44 GMT</pubDate><ttl>60</ttl><item><title> asp防注入的语句 </title><link>http://www.blogjava.net/litianyi520/archive/2006/09/23/71497.html</link><dc:creator>小傻</dc:creator><author>小傻</author><pubDate>Sat, 23 Sep 2006 15:14:00 GMT</pubDate><guid>http://www.blogjava.net/litianyi520/archive/2006/09/23/71497.html</guid><wfw:comment>http://www.blogjava.net/litianyi520/comments/71497.html</wfw:comment><comments>http://www.blogjava.net/litianyi520/archive/2006/09/23/71497.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/litianyi520/comments/commentRss/71497.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/litianyi520/services/trackbacks/71497.html</trackback:ping><description><![CDATA[在做安全配置前，我们先了解一下入侵者的攻击手法。现在很流行注入攻击，所谓注入攻击，就是利用提交特殊地址将ASP中引用的正常SQL语句和入侵者所需要的SQL语句一并执行，使入侵者达到入侵的目的。现在更是有一些脚本注入工具发布，使菜鸟也可以轻松完成对ASP的注入攻击。那么我们先来了解一下这些工具是怎样注入的。<br />首先，入侵者会对一个网站确定可不可以进行注入，假设一篇文章的地址为：http://www.scccn.com/news.asp?id=1一般会以提交两个地址来测试，如：<br />http://www.scccn.com/news.asp?id=1 and 1=1<br />http://www.scccn.com/news.asp?id=1 and 1=2<br />第一个地址后面加了 and 1=1，构成的SQL语句也就变为了：Select * from 表单名 where id=1 and 1=1这句话要成立就必须and前后语句都成立。那么前面的文章地址是可以访问的，后面的1=1也是客观成立的，那么第一个地址就可以正常显示；相反1=2是显然不成立的，关键就看这步了，如果提交and 1=2页面还是正常显示说明他并没有将and 1=2写入SQL语句，此站也就不存在注入漏洞；但如果提交and 1=2之后返回了错误页面则说明此站点将后面的语句带入了SQL语句并执行了，也就说明他可以进行SQL注入。（注：如果地址后面跟的是news.asp?id='1'就得变为news.asp?id=1' and '1'='1来补全引号了）<br />    那么，知道可以注入后入侵者可以做什么呢？<br />    这里就简单的说一下，比如提交这样的地址：<br />http://www.scccn.com/news.asp?id=1 and exists (select * from 表名 where 列名=数据)<br />根据返回的正确或错误页面来判断猜的表名和列名是否正确，具体实现时是先猜表名再猜列名。当猜出表名和列名之后还可以用ASC和MID函数来猜出各列的数据。MID函数的格式为：mid(变量名,第几个字符开始读取,读取几个字符)，比如：mid(pwd,1,2)就可以从变量pwd中的第一位开始读取两位的字符。ASC函数的格式为：ASC（"字符串"），如：asc("a")就可以读出字母a的ASCII码了。那么实际应用的时候就可以写为：asc(mid(pwd,1,1))这样读取的就是pwd列的第一个字符的ASCII码，提交： asc(mid(pwd,1,1))&gt;97以返回的页面是否为正确页面来判断pwd列的第一个字符的ASCII码是否大于97（a的ASCII码），如果正确就再试是否小于122（z的ASCII码）……这样慢慢缩小字符的ASCII码的范围，猜到真实的ASCII码也只是时间的问题。一位一位的猜就可以得到数据库中的用户名和密码了。还有一种ASP验证缺陷——就是用户名和密码都输'or '1'='1，构造SQL语句Select * form 表单名 where username='' or '1'='1' and pwd='' or '1'='1'就可以达到绕过密码验证的目的。<br />    说了那么多，其实防范的方法很简单，我们把特殊字符（如and、or、'、"）都禁止提交就可以防止注入了。ASP传输数据分为get和post两种，    get是通过将数据添加到URL后提交的方式，post则是利用邮寄信息数据字段将数据传送到服务器。<br />那么，我们先来看看如何将get方式提交数据中的特殊字符过滤。首先要知道，IIS是以字符串的形式将get请求传给asp.dll的，在将数据传递给Request.QueryString之后，asp解析器会解析出Request.QueryString的信息，然后跟据"&amp;"来分出各个数组内的数据。现在我们要让get方式不能提交以下字符：<br />'、and、exec、insert、select、delete、update、count、*、%、chr、mid、master、truncate、char、declare<br />那么，防止get方式注入的代码就如下：<br />&lt;%<br />dim sql_leach,sql_leach_0,Sql_DATA<br />sql_leach = "',and,exec,insert,select,delete,update,count,*,%,chr,mid,master,truncate,char,declare"<br />sql_leach_0 = split(sql_leach,",")<br /><br />If Request.QueryString&lt;&gt;"" Then<br />For Each SQL_Get In Request.QueryString<br />For SQL_Data=0 To Ubound(sql_leach_0)<br />if instr(Request.QueryString(SQL_Get),sql_leach_0(Sql_DATA))&gt;0 Then<br />Response.Write "请不要尝试进行SQL注入！"<br />Response.end<br />end if<br />next<br />Next<br />End If<br />%&gt;<br />其中，变量sql_leach中的字符串就是指定过滤的字符，以","隔开。<br />    接着过滤post提交方式的注入，我们可以看到，request.form也是以数组形式存在的，只要对它再进行一次循环判断就可以了。防止以post方式注入的ASP代码如下：<br />&lt;%<br />If Request.Form&lt;&gt;"" Then<br />For Each Sql_Post In Request.Form<br />For SQL_Data=0 To Ubound(sql_leach_0)<br />if instr(Request.Form(Sql_Post),sql_leach_0(Sql_DATA))&gt;0 Then<br />Response.Write "请不要尝试进行SQL注入！"<br />Response.end<br />end if<br />next<br />next<br />end if<br />%&gt;<br />    这样，get和post注入都被禁止了。<br />    另外就是数据库的问题，首先现在很流行的用*.asp命名数据库已经没什么意义了，因为可以用下载软件来下载；在数据库名前加#的作用也不大，虽然访问时浏览器只访问#前面的内容，但是如果将#用其unicode表达法（%23）替换掉就可以访问了。既然这样，那么我们禁止入侵者暴库就可以了。一般暴数据库的方法，是将读取数据库的文件名（如conn.asp）前的"/"替换为"%5c"（"\"的unicode表达法）这样就可以使ASP将%5c解释为访问网站根目录，而实际是数据库不在指定位置，找不到数据库，再将IE设置为"显示友好的HTTP错误信息"的情况下自然就暴出了数据库的路径。<br />    防范的方法也比较简单，就是让ASP程序即使在出错的情况下也不报错直接执行下一步就可以了。在ASP的conn文件中加这么一句：on error resume next就OK了。<br />还有几点要注意的：<br />1.数据库命名长些并尽量放在网站根目录下，数据库的表名和字段名尽量不合常规；2.保存敏感信息（如用户和密码）的数据库尽量和在前台页面引用的数据库分开（如果用新的暴库方法由前台页面暴出了数据库，那么入侵者也得不到有价值的信息）；3.后台的目录名和登陆页面的名字要改的不寻常些，千万不可出现admin或者login之类的字符，以免被注入软件扫描到后台。4.如果前台或后台有上传文件的功能，切记不能有任何其他功能直接的或间接的拥有更改文件名的权限。这样的多重保障就更加安全些了。<br /><img src ="http://www.blogjava.net/litianyi520/aggbug/71497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/litianyi520/" target="_blank">小傻</a> 2006-09-23 23:14 <a href="http://www.blogjava.net/litianyi520/archive/2006/09/23/71497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>滚动代码加入数据库调用</title><link>http://www.blogjava.net/litianyi520/archive/2006/09/20/70664.html</link><dc:creator>小傻</dc:creator><author>小傻</author><pubDate>Tue, 19 Sep 2006 23:39:00 GMT</pubDate><guid>http://www.blogjava.net/litianyi520/archive/2006/09/20/70664.html</guid><wfw:comment>http://www.blogjava.net/litianyi520/comments/70664.html</wfw:comment><comments>http://www.blogjava.net/litianyi520/archive/2006/09/20/70664.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/litianyi520/comments/commentRss/70664.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/litianyi520/services/trackbacks/70664.html</trackback:ping><description><![CDATA[
		<font face="Arial">纵向：   <br />  &lt;%   <br />  sql="select   top   5   *   from   release   where   pid="&amp;shengid&amp;"   and   showflag=1   order   by   id   desc   "   <br />  set   getnews=server.createobject("adodb.recordset")   <br />  getnews.open   sql,strconn,3   <br />  %&gt;   <br />  &lt;table   width=98%   cellspacing=0     cellpadding=4   height=160     class=&lt;%=getcss("p1c3table")%&gt;1     bordercolor=&lt;%=getcss("p1c3tablecolor")%&gt;&gt;   <br />  &lt;tr&gt;   <br />  &lt;td&gt;   <br />  &lt;marquee   name='mymarquee'     height=160   behavior=scroll   direction=up       scrollamount=2   scrolldelay=120   onmouseover='this.stop()'   onmouseout='this.start()'&gt;   <br />  &lt;%   <br />  do   while   not   getnews.eof   %&gt;   <br />  &lt;p&gt;   <br />  &lt;img   src=images/1.gif&gt;   <br />  &lt;a   href=page3.asp?id=&lt;%=getnews("id")%&gt;&amp;menustyle=release&amp;ctype=1&amp;sname=&lt;%=request("sname")%&gt;     target=_blank   &gt;   <br />  &lt;font   color=black&gt;&lt;%=getnews("title")%&gt;&lt;/font&gt;&lt;font   color=gray&gt;(&lt;%=ymd(getnews("pubtime"))%&gt;)&lt;/font&gt;   <br />  &lt;/a&gt;   <br />  &lt;/p&gt;   <br />  &lt;%getnews.movenext     <br />      loop   <br />      set   getnews=nothing   <br />  %&gt;   <br />  &lt;/marquee&gt;   <br />  &lt;/td&gt;   <br />  &lt;/tr&gt;   <br />  &lt;/table&gt;     <br />    <br />  横向（如新浪的新闻,动态的。）：   <br />  &lt;table&gt;   <br />  &lt;tr   &gt;&lt;td&gt;   <br />  &lt;marquee   name='mymarquee'   behavior=scroll   direction=left   height=10     scrollamount=2     scrolldelay=120   onmouseover='this.stop()'   onmouseout='this.start()'&gt;   <br />  &lt;font   color=&lt;%=getcss("marqueeword")%&gt;&gt;&lt;%=date%&gt;&amp;nbsp;&amp;nbsp;&lt;%   =   Session("UserName")   %&gt;&amp;nbsp;&amp;nbsp;您好！&lt;/font&gt;   <br />  &lt;%   do   while   not   getm.eof   %&gt;   <br />    <br />  &lt;a   href=page3.asp?menustyle=release&amp;id=&lt;%=getm("id")%&gt;&amp;sname=&lt;%=request("sname")%&gt;     target=_blank&gt;   <br />  &lt;font   color=&lt;%=getcss("marqueeword")%&gt;&gt;&lt;%=getm("title")%&gt;&lt;/font&gt;   <br />  &lt;/a&gt;   <br />  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   <br />  &lt;%   <br />  getm.movenext   <br />  loop   <br />  set   getm=nothing   <br />  %&gt;   <br />  &lt;/marquee&gt;   <br />  &lt;/td&gt;   <br />  &lt;/tr&gt;   <br />  &lt;/table&gt; <br /></font>
<img src ="http://www.blogjava.net/litianyi520/aggbug/70664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/litianyi520/" target="_blank">小傻</a> 2006-09-20 07:39 <a href="http://www.blogjava.net/litianyi520/archive/2006/09/20/70664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两个表的双循环排列</title><link>http://www.blogjava.net/litianyi520/archive/2006/09/18/70279.html</link><dc:creator>小傻</dc:creator><author>小傻</author><pubDate>Mon, 18 Sep 2006 06:29:00 GMT</pubDate><guid>http://www.blogjava.net/litianyi520/archive/2006/09/18/70279.html</guid><wfw:comment>http://www.blogjava.net/litianyi520/comments/70279.html</wfw:comment><comments>http://www.blogjava.net/litianyi520/archive/2006/09/18/70279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/litianyi520/comments/commentRss/70279.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/litianyi520/services/trackbacks/70279.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Arial">&lt;TABLE &gt;<br /> &lt;% set rs=server.createobject("adodb.recordset")<br /> sql="select category.categoryid as id,category.categoryname as cname,classid,classname,classnumber from category,class where category.categoryid=class.categoryid order by category.sortnumber "<br />     rs.open sql,conn,1,1 <br />       i=0<br />     while not rs.eof <br />       if i mod 3=0 then%&gt;<br /> &lt;TR&gt;<br />          &lt;%end if<br />    id=rs("id")<br />    id1=rs("id") %&gt;<br />&lt;TD vAlign=top&gt;<br />&lt;TABLE &gt;<br />&lt;tr&gt;<br />&lt;Td &lt;%=trim(rs("cname"))%&gt;&lt;/A&gt;<br />&lt;/Td&gt;<br />&lt;/tr&gt;</font>
		</p>
		<p>
				<font face="Arial">&lt;tr&gt;<br />&lt;td&gt;<br />&lt;TABLE &gt;<br />&lt;%while not rs.eof and id1=id%&gt;  <br />&lt;TR&gt;<br />&lt;TD &gt;<br />&lt;%=rs("classname")%&gt;&lt;/TD&gt;       <br />    &lt;/TR&gt;  <br />      &lt;%  rs.movenext<br />                if not rs.eof then <br />                 id1=rs("id")<br />                end if<br />             wend%&gt;                            <br />&lt;/TABLE&gt;<br />&lt;/TD&gt;<br />&lt;/TR&gt; <br />&lt;/TABLE&gt;<br />&lt;/TD&gt;<br />    &lt;% i=i+1<br />    if i mod 3=0 then%&gt;<br /> &lt;/TR&gt;<br />   &lt;%end if<br />   wend%&gt;<br /></font>
		</p>
<img src ="http://www.blogjava.net/litianyi520/aggbug/70279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/litianyi520/" target="_blank">小傻</a> 2006-09-18 14:29 <a href="http://www.blogjava.net/litianyi520/archive/2006/09/18/70279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一段分页代码</title><link>http://www.blogjava.net/litianyi520/archive/2006/09/14/69670.html</link><dc:creator>小傻</dc:creator><author>小傻</author><pubDate>Thu, 14 Sep 2006 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/litianyi520/archive/2006/09/14/69670.html</guid><wfw:comment>http://www.blogjava.net/litianyi520/comments/69670.html</wfw:comment><comments>http://www.blogjava.net/litianyi520/archive/2006/09/14/69670.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/litianyi520/comments/commentRss/69670.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/litianyi520/services/trackbacks/69670.html</trackback:ping><description><![CDATA[
		<font face="Arial">&lt;!-- #include file="conn.asp" --&gt;<br />&lt;%<br />dim strsql,rs<br />set rs=Server.CreateObject("ADODB.RecordSet")<br />strsql="select * from t_url "<br />rs.open strsql,conn,1,1<br />%&gt;<br />&lt;%<br />page=request.querystring("page")  <br />rs.PageSize = 15 <br />if Not IsEmpty(page) then <br />   if Not IsNumeric(page) then <br />      page=1<br />   else<br />   Page = cint(page)<br />   end if   <br />   if Page &gt; rs.PageCount then <br />       rs.AbsolutePage = rs.PageCount <br />   elseif Page &lt;= 0 then <br />       rs.AbsolutePage = 1 <br />   else<br />       rs.AbsolutePage = Page <br />   end if<br />else<br />rs.AbsolutePage=1<br />end if<br />%&gt;<br />&lt;% <br />For i = 1 to rs.PageSize <br />if rs.EOF then<br />Exit For <br />end if <br />%&gt;<br />&lt;tr&gt;<br />&lt;td&gt;<br />&lt;%=rs("id")%&gt;&lt;/td&gt;<br />&lt;td&gt;&lt;%=rs("c_name")%&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;%<br />rs.MoveNext<br />Next<br />%&gt;<br />&lt;form action="&lt;%=filepath%&gt;" method="get"&gt;<br />&lt;!--首先保证总页数不为1、不为0--&gt;<br />&lt;%if rs.pagecount&lt;&gt;1 and rs.pagecount&lt;&gt;0 then%&gt;<br />&lt;!--如果当前页数大于1，无论何时都应显示首页和上一页的连接--&gt;<br />&lt;%if page&gt;1 then%&gt;<br />   [&lt;a Href="&lt;%=filepath%&gt;?Page=&lt;% = 1%&gt;"&gt;首页&lt;/a&gt;]<br />   [&lt;a Href="&lt;%=filepath%&gt;?Page=&lt;% = page -1 %&gt;"&gt;上一页&lt;/a&gt;]<br />&lt;!--如果当前页数大于1并且小于总页面数时，显示出尾页和下一页的连接--&gt;<br />   &lt;%if page&lt;rs.pagecount then %&gt;<br />   [&lt;a Href="&lt;%=filepath%&gt;?Page=&lt;% = page + 1%&gt;"&gt;下一页&lt;/a&gt;]<br />   [&lt;a Href="&lt;%=filepath%&gt;?Page=&lt;% = rs.PageCount%&gt;"&gt;尾页&lt;/a&gt;]<br />&lt;!--如果当前页数大于1并且仍大于或等于总页面数时，不显示出尾页和下一页的连接--&gt; <br />   &lt;%else%&gt;<br />   [下一页] [尾页]<br />   &lt;%end if%&gt;<br />&lt;!--否则，当前页数不大于1，则只显示尾页和下一页的连接--&gt;<br />&lt;%else%&gt;<br />[首页] [上一页]<br />[&lt;a Href="&lt;%=filepath%&gt;?Page=&lt;% = page + 1%&gt;"&gt;下一页&lt;/a&gt;] <br />[&lt;a Href="&lt;%=filepath%&gt;?Page=&lt;% = rs.PageCount%&gt;"&gt;尾页&lt;/a&gt;]<br />&lt;%end if %&gt;<br />&lt;!--最终，总页数若为1、为0则没有任何连接--&gt;<br />&lt;%else%&gt;<br />[首页] [上一页] [下一页] [尾页]<br />&lt;%end if%&gt;<br />[页次:&lt;font color=red&gt;&lt;b&gt;&lt;%=page%&gt;&lt;/b&gt;&lt;/font&gt;/&lt;%=rs.PageCount%&gt;]<br />[共&lt;%=rs.RecordCount%&gt;篇 &lt;font color=red&gt;&lt;b&gt;&lt;%=rs.PageSize%&gt;&lt;/b&gt;&lt;/font&gt;篇/页]<br />转到&lt;input name="page" size=5 value="&lt;%=page%&gt;"&gt;页<br />&lt;input type="submit" value="Enter"&gt;<br />&lt;/form&gt;<br />&lt;%<br />rs.close <br />Set rs = Nothing<br />conn.close <br />set conn=Nothing<br />%&gt;</font>
<img src ="http://www.blogjava.net/litianyi520/aggbug/69670.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/litianyi520/" target="_blank">小傻</a> 2006-09-14 16:21 <a href="http://www.blogjava.net/litianyi520/archive/2006/09/14/69670.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>