"   "/>

asp编程中trim函数及漏洞破解与防护详解

2023-10-01 16:27

在asp编程中,我们经常使用trim(rtrim,ltrim)函数来去除一些数据开头和结尾的空格。作者最近写了一个asp聊天室,有如下一段代码:  

<% dim name,title 
name=trim(request.form(" name")) 
密码=trim(request.form("password")) 
if name=""或密码=""则 response.redirect "error.asp?error=name&name = Null"
Mydsn = dsn = 测试; uID = 测试; pwd = 测试" Set cn = Server.createObject("AdoDB.Connection")  
m.gsm-guard.net myDSN 
sql="插入 到 测试(名称,标题) 值(' "&名称&"','"&密码& " ')"  
cn.execute(sql) 
cn.close%> 

使用修剪函数删除前导和尾随空格。正常情况下,这个程序执行是正常的,但是后来我发现居然有人可以使用空格。这意味着用户的名字完全是空格,但是当他尝试使用空格时却无法通过(即被程序检测到),开头和结尾中的空格都被trim函数去掉了。即使中间有空格,如果需要,也可以使用函数删除中间的空格。由于使用了SQL数据库中记录的用户信息,我怀疑他使用了其他东西。系统看不到东西,于是我检查了记录用户信息的SQL数据库(我曾经用这个方法看到有换行符的用户),但我仍然看到数据库中用户的信息也有空格。这是否意味着用户有办法绕过对我的用户名和密码的监控? ? ?我实在找不到程序有什么漏洞,只能向这位用户请教。幸运的是,这位用户爽快地告诉我,原来是“Alt+255”,按住alt键,然后按小键盘上的“Center”。 2”、“5”、“5”会产生一个特殊的“空格”字符(这个概念作者不是很清楚,这是一个控制字符,在一些编辑器的word2000中可以看到,应该还有其他的控制字符)。该空格字符与按空格键生成的传统字符不同。它的asc码是255,而传统空格打空格的asc码是32,trim函数只能识别并去除asc码为32的代码,所以就出现了带有空格的用户的情况!针对这种情况,作者设计了如下两个函数来去除“空格”字符:
function xuankong(str) 
dim result 
d im j 
   j=len(str) 
   结果 =“” 
dim i
 i  =  1 到 j 
   选择 case mid(str,i,1) case “<” 
          结果=结果+" <" 
       案例 ">" 
          结果=结果+">" 
       案例 chr(34)   
          result=result+ """ 
       case "&" 
          result=result+"&"  '上面的代码转换了一些html标签 
       case chr( 255) '防止特殊空格 
          result=结果 
       case chr(13) '防止运输返回 
          result=结果+" " 
       case chr(10) '防止换行符 
          result=结果+"" 
      case else 
         结果=结果+mid(str,i,1) 
 结束 选择 
下一个  
玄空=结果U  Endnfunction 
然后在你的 ASP 程序中使用这个函数,如:  
name = xuankong(trim(request.form("name") ;  j 
j=len(trim(request.form("name"))) 
for i= 1 到   j 
如果  asc(mid(name,i,1))>122 或 asc(mid(name,i,1))<48 然后 响应..重定向“error.asp?
error=special" 
next
 
虽然目前还没有发现这种“空格”会引起会损坏程序的问题,但能引起麻烦,还是不错的防御,不过这种空间也有一个好处,如果是你的上网密码的话,呵呵... ...恐怕没有多少人能看到!我看到的一切都以为是空间,但是不是... ... 作者对php和jsp不熟悉,所以不知道这两个东西会不会存在这个问题