" "/>
在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不熟悉,所以不知道这两个东西会不会存在这个问题