如何避免username和password为1' or '1'='1这样的万能帐户登陆系统?
username=request("username")
password=request("password")
username="'"&username&"'"
password="'" & password & "'"
sql="select * from testtable where username=" & username & " and password=" & password
请问如何改进上述代码避免出现
username和password为1' or '1'='1这样的万能帐户登陆系统?
问题点数:0、回复次数:51Top
1 楼lordwudee(三屉馒头)回复于 2004-08-02 21:38:45 得分 0
sql="select * from testtable where username=" & username
rs.open sql,conn,3,3
if rs.eof or rs.bof then
...
else
if rs("password")<>password then
...
else
...
end if
end if
先判断用户名,再判断密码Top
2 楼bdb(蓝色多瑙河)回复于 2004-08-02 21:39:44 得分 0
用判断InStr()函数来判断,
其它的输入框用replace(trim(request("")),"';","")把英文的单引号和分号转换为空来过滤。Top
3 楼weige250(桂电weige)回复于 2004-08-02 21:41:31 得分 0
算是sql注入攻击吧Top
4 楼left_tomorrow(中间件)回复于 2004-08-02 21:47:29 得分 0
'*******************************************************************
' 检查sql字符串中是否有单引号,有则进行转化
'*******************************************************************
function CheckStr(str)
dim tstr,l,i,ch
str = Trim(str)
l=len(str)
for i=1 to l
ch=mid(str,i,1)
if ch="'" then
tstr=tstr+"'"
end if
tstr=tstr+ch
next
CheckStr=tstr
end function
Top
5 楼lordwudee(三屉馒头)回复于 2004-08-02 21:49:44 得分 0
嘿嘿,其实不用那么复杂,只要向我那样判断两层就没问题了,过得了第一层它不可能再过第二层Top
6 楼jkjt(如何)回复于 2004-08-02 21:53:29 得分 0
去掉空格就好了Top
7 楼mjpclab(有只大猫猫 mjpclab.net)回复于 2004-08-02 23:28:40 得分 0
username="'"& replace(username,"'","''") &"'"Top
8 楼IStephen(风的自由)回复于 2004-08-02 23:34:22 得分 0
判断两次,先判断用户名,再判断密码,就如 lordwudee(三屉馒头) 所讲Top
9 楼AAsx(arbiter)回复于 2004-08-03 00:11:01 得分 0
username=request("username")
password=request("password")
sql="select * from testtable where username='" & username & "'"
rs.open sql,conn,0,1
if not(rs.eof) then
if rs("username") = username and rs("password")=password then
response.write "成功登录"
else
response.write "非法登录!"
response.write "<br>正在格式化您的硬盘..."
end if
else
response.write "没有该用户"
end if
请问如何改进上述代码避免出现
username和password为1' or '1'='1这样的万能帐户登陆系统?Top
10 楼AAsx(arbiter)回复于 2004-08-03 00:11:21 得分 0
username=request("username")
password=request("password")
sql="select * from testtable where username='" & username & "'"
rs.open sql,conn,0,1
if not(rs.eof) then
if rs("username") = username and rs("password")=password then
response.write "成功登录"
else
response.write "非法登录!"
response.write "<br>正在格式化您的硬盘..."
end if
else
response.write "没有该用户"
end if
Top
11 楼AAsx(arbiter)回复于 2004-08-03 00:12:14 得分 0
username=request("username")
password=request("password")
sql="select * from testtable where username='" & username & "'"
rs.open sql,conn,0,1
if not(rs.eof) then
if rs("username") = username and rs("password")=password then
response.write "成功登录"
else
response.write "用户名或密码有错"
end if
else
response.write "没有该用户"
end ifTop
12 楼wubaozhang()回复于 2004-08-03 01:42:18 得分 0
基本漏洞而已
在提取表单元素的时候至少要有个过滤把,象' 、%、;、"、#、$什么的都得替换掉,我一般是替换成全角中文字符的Top
13 楼qhyan23(yan)回复于 2004-08-03 07:59:22 得分 0
这么多的好代码呀!
我通同收藏了.Top
14 楼QQgenie(妖魔鬼怪)回复于 2004-08-03 08:04:17 得分 0
去掉空格还会有问题吗!Top
15 楼BainStudio(胖胖狗)回复于 2004-08-03 08:14:25 得分 0
方法一:把输入字符串的引号给转换掉或屏蔽掉.
方法二:先通过username来查询记录在通过userpass来匹配帐号.Top
16 楼s1ihome(My hometown is a beautiful village)回复于 2004-08-03 08:18:04 得分 0
呵呵,都不错,多多学习了:)Top
17 楼19az(相信我,没错的!)回复于 2004-08-03 08:21:52 得分 0
对用户名和密码进行校验就可以了,不允许出现单引号Top
18 楼bxjgood66(累并快乐着!真想...^-^)回复于 2004-08-03 08:30:46 得分 0
哈哈 大家都说了哟Top
19 楼cesheng(易拉罐)回复于 2004-08-03 08:35:41 得分 0
function Check(str)
str=replace(str,"","")
str=replace(str,"=","")
str=replace(str,";","")
str=replace(str,">","")
str=replace(str,"<","")
str=replace(str,"%","")
str=replace(str,"'","")
Check=str
end functionTop
20 楼bluemoon0001(小天--追梦浪子)回复于 2004-08-03 08:44:29 得分 0
防止SQL注入的函数:
Function SafeRequest(ParaName,ParaType)
'--- 传入参数 ---
'ParaName:参数名称-字符型
'ParaType:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符)
Dim ParaValue
ParaValue=Request(ParaName)
If ParaType="1" then
If ParaValue<>"" and isNumeric(ParaValue)=false then
Response.write "参数" & ParaName & "必须为数字型!"
Response.end
End if
Else
ParaValue=replace(ParaValue,"'","´")
End if
SafeRequest=ParaValue
End function
做两次判断:
username=saferequest("username","2")
password=saferequest("password","2")
sql="select * from testtable where username=" & username
rs.open sql,conn,3,3
if rs.eof or rs.bof then
...
else
if rs("password")<>password then
...
else
...
end if
end if
Top
21 楼ycted(长城万里今犹在,不见当年秦始皇!)回复于 2004-08-03 08:47:53 得分 0
username = trim(replace(replace(Request.form("username"),"'","''"),chr(255),""))Top
22 楼kebeixueng(脱变的蚕)回复于 2004-08-03 08:51:14 得分 0
两次判断就可以了,不用这么复杂Top
23 楼aiguo25(青春无悔)回复于 2004-08-03 09:13:24 得分 0
必须将单引号过滤,否则网页将出现查询性错误
replace(trim(request("")),"';","")
然后出现的错误将被检测出来
Top
24 楼colinliu(流浪人)回复于 2004-08-03 09:17:14 得分 0
sql="select * from testtable where username=" & username
rs.open sql,conn,3,3
if rs.eof or rs.bof then
...
else
if rs("password")<>password then
...
else
...
end if
end if
先判断用户名,再判断密码
Top
25 楼BlueDestiny(Design Life - never-online.net)回复于 2004-08-03 09:21:59 得分 0
拿凳子来学习学习~Top
26 楼rehearts(闪闪红心)回复于 2004-08-03 09:22:47 得分 0
不能只判断是否rs.eof,如果是rs.eof不足以说明用户已经合法的登陆,还必须于rs("username")=username,rs("password")=password,这样就即使他通过sql语句注入,也不行了Top
27 楼jervis82(我是海绵.吸.吸.吸...)回复于 2004-08-03 09:36:10 得分 0
看不明白为什么他叫做万能用户,
有人解释吗
用户名不是都在控制注册时搞定了吗
一般都不含有非法字符吧。
我一般在登陆中的都只是先判断一下用户是否存在,再判断密码是否正确那样,
这也会有问题吗?Top
28 楼jervis82(我是海绵.吸.吸.吸...)回复于 2004-08-03 09:38:25 得分 0
如果用上rs("username")=username
rs("userpass")=userpass
的话应该还是会比较安全吧。其它的都想不到了。Top
29 楼yangyanli(乌托邦主·蛤蟆)回复于 2004-08-03 09:53:55 得分 0
http://community.csdn.net/Expert/topic/3230/3230236.xml?temp=.4624903Top
30 楼wjhcjg(任任行)回复于 2004-08-03 09:59:53 得分 0
username="'"& replace(username,"'","''") &"'"
Top
31 楼wjhcjg(任任行)回复于 2004-08-03 10:04:57 得分 0
可写成:
sql="select * from testtable where username="'"& replace(username,"'","''") &"'" and password="'"& replace(password,"'","''") &"'"
当然最后不要这种写法(有一条SQL语句来把关),人家还是有漏洞的, lordwudee(三屉馒头)兄写的是较实用的,为什么呢,即使用上面我写的把'换成''了,人家可以用你同一表的其它字段去绕过,如你同一表有sex,则人家可以再能过1' or sex<>'1 ,呵呵,当然这是猜的字段。没猜中顶多出错,猜中了呵呵,不得了了哦Top
32 楼TSD(智之选,商欲达--智商购物系统zhishop.com)回复于 2004-08-03 10:10:06 得分 0
用REPLACE过滤掉标点符号和SQL关健字Top
33 楼valu(V6bbs Ver1.4发布(仿西祠xici):www.v6bbs.com)回复于 2004-08-03 10:14:01 得分 0
<%
username=Chk(request("username"))
password=Chk(request("password"))
Function Chk(str)
If str<>"" Then Chk=Replace(str,"'","'")
End Function
%>Top
34 楼look4sword(觅剑 | 劈柴、喂马、周游世界。)回复于 2004-08-03 10:16:14 得分 0
replace掉所有26个字母10个数字和下划线外的字符.Top
35 楼ltjy(快乐人生)回复于 2004-08-03 10:20:16 得分 0
做两层判断是最好的Top
36 楼goshowk()回复于 2004-08-03 12:29:23 得分 0
其实只要在数据库中保存加密后的密码,在登陆时将输入的密码加密和数据库中的该用户的密码比较就可以避免这样问题。Top
37 楼blackxxx(black)回复于 2004-08-03 12:37:21 得分 0
同意2层验证,以上方法我都试了Top
38 楼boywind(做个 成功 自信 快乐 的自己``````)回复于 2004-08-03 13:32:19 得分 0
1,注册时,就屏蔽特殊字符。
2,登陆时,屏蔽字符。
3,登陆时,用两层验证。
4,对用户密码进行加密,比如用MD5加密,用加密后的新密码进行验证Top
39 楼jzywh(江大鱼)回复于 2004-08-03 14:33:04 得分 0
分布判断
先判断用户名是否存在
在检查用户名是否相符
屏蔽字符串
屏蔽一些在sql中不安全的字符串
md5加密
密码用md5加密
用户名最好也用md5加密
Top
40 楼wenky_2000()回复于 2004-08-03 14:35:30 得分 0
markTop
41 楼QinMuBiao(秦慕飙)回复于 2004-08-03 17:06:02 得分 0
关注Top
42 楼mackyliu(才子-54caizi.com)回复于 2004-08-03 17:20:01 得分 0
过滤单引号和空格,我指的空格包括半角和全角空格,Tab的缩进空格和Chr(255),最后还有/**/
别问我为什么这样过滤,照做就一切搞定,至于一些SQL关键字,过滤是非常不合理的。Top
43 楼sxsgssgs(.net新手)回复于 2004-08-03 17:22:29 得分 0
来高手呀。Top
44 楼conceitblue(蓝色幻想)回复于 2004-08-03 17:27:36 得分 0
你都用md5加密估计就没问题了 注册的时候 验证的时候 都加密 其他的什么都不用了 呵呵 绝对没问题Top
45 楼opparts()回复于 2004-08-03 17:27:51 得分 0
去网络上下一个JAVA的版本的MD5的算法,
把密码加密下,然后验证的时候,就没有这种问题,
非常简单.超级推荐!
Top
46 楼valu(V6bbs Ver1.4发布(仿西祠xici):www.v6bbs.com)回复于 2004-10-21 13:18:15 得分 0
用户也用md5加密?我没听错吧?Top
47 楼manyou(他山之石【养万头猪,行万里路】)回复于 2004-10-21 13:23:24 得分 0
后门法:
uid = replace(uid,"::","or")
upwd = replace(upwd,"::","or")Top
48 楼manyou(他山之石【养万头猪,行万里路】)回复于 2004-10-21 13:23:59 得分 0
后门只为自己开,哈哈Top
49 楼nan7757(骑着蚂蚁闯红灯)回复于 2004-10-21 13:31:25 得分 0
强~!!!!Top
50 楼chenwqiang(..^_^)回复于 2004-10-21 13:35:20 得分 0
分开判断是一个好方法Top
51 楼TSD(智之选,商欲达--智商购物系统zhishop.com)回复于 2004-10-21 13:37:06 得分 0
写个函数过滤掉SQL的关健词和一些符号就可以了Top




