日期:2014-05-17  浏览次数:20988 次

加入过滤字符居然登陆不了了
1:过滤字符代码页safe_sql.asp
<%
function safe_sql(strGet)
strTemp=strGet
dim sqlstr(16)
sqlstr(0)="'" 
sqlstr(1)="""" 
sqlstr(2)="select" 
sqlstr(3)="insert" 
sqlstr(4)="delete"
sqlstr(5)="from" 
sqlstr(6)="drop" 
sqlstr(7)="truncate"
sqlstr(8)="asc" 
sqlstr(9)="char" 
sqlstr(10)="mid"
sqlstr(11)="count"
sqlstr(12)="net user" 
sqlstr(13)="xp_cmdshell" 
sqlstr(14)="/add" 
sqlstr(15)="exec%20master.dbo.xp_cmdshell" 
sqlstr(16)="net localgroup administrators" 
for i=1 to ubound(sqlstr)
if instr(strTemp,sqlstr(i)) then
response.codePage = 65001
  response.charset="UTF-8"
  response.write "<script language='javascript'>"
  response.write "alert('你输入的内容含有非法字符,请返回重试!');"
  response.write "history.go(-1);"
  response.write "</script>"
  response.end
end if
next
save_sql=strTemp
end function
%>
2:当我调用这个页面时候,能正确的过滤字符。但是输入正确的用户名和密码。居然登陆不了。只是刷新页面,下面是2句调用的代码,帮我看看错在哪里
<--#include file="safe_sql.asp"-->
MM_valusername=safe_sql(Cstr(request.form("用户名"))) ‘获取登陆用户名

------解决方案--------------------
strTemp=strGet

strTemp=strTemp.Replace("("," (")
时间太长不用,搞混了,这是应该用正则的替换方法。
改成用替换函数就行:
strTemp=Replace(strTemp,"("," (")
我这没环境测试。楼主试试吧。

过滤对防SQL注入当然有作用,从上面一些说明中你也能明白,过滤不是象你开始给出的代码中那样直接一来就可以,会误杀很多。所以不是必不得以也不会费事来做了。即使用其它方法能绕过去,但都是受限的,不如过滤之后就可以自由运用。

大家讨论时,常常只是针对这个个例来解决问题,在理论上找出问题并解决,但对于实际来说,其实有专门写好的SQL过滤函数,你可以自己搜搜看,别人给你搜了,就显得好像是转移话题搪塞问题一样了。
------解决方案--------------------
你这样做的用处不是很大,如果你想防止注入,那么只要把字request符串中的单引号"'"替换成两个单引号即可"''"。
VB code

function safe(str)
    safe = replace(str,"'","''")
end function
'使用
username = safe(request.form("username"))