如何避免username和password为1' or '1'='1这样的万能帐户登陆系统?

时间:2022-12-20 19:19:51
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这样的万能帐户登陆系统?

51 个解决方案

#1


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
先判断用户名,再判断密码

#2


用判断InStr()函数来判断,
其它的输入框用replace(trim(request("")),"';","")把英文的单引号和分号转换为空来过滤。

#3


算是sql注入攻击吧

#4


'*******************************************************************
   ' 检查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

#5


嘿嘿,其实不用那么复杂,只要向我那样判断两层就没问题了,过得了第一层它不可能再过第二层

#6


去掉空格就好了

#7


username="'"& replace(username,"'","''") &"'"

#8


判断两次,先判断用户名,再判断密码,就如 lordwudee(三屉馒头) 所讲

#9


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这样的万能帐户登陆系统?

#10


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

#11


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 if

#12


基本漏洞而已
在提取表单元素的时候至少要有个过滤把,象' 、%、;、"、#、$什么的都得替换掉,我一般是替换成全角中文字符的

#13


这么多的好代码呀!
我通同收藏了.

#14


去掉空格还会有问题吗!

#15


方法一:把输入字符串的引号给转换掉或屏蔽掉.
方法二:先通过username来查询记录在通过userpass来匹配帐号.

#16


呵呵,都不错,多多学习了:)

#17


对用户名和密码进行校验就可以了,不允许出现单引号

#18


哈哈  大家都说了哟

#19


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 function

#20


防止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,"'","&acute;")
  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

#21


username = trim(replace(replace(Request.form("username"),"'","''"),chr(255),""))

#22


两次判断就可以了,不用这么复杂

#23


必须将单引号过滤,否则网页将出现查询性错误
replace(trim(request("")),"';","")
然后出现的错误将被检测出来

#24


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
先判断用户名,再判断密码

#25


拿凳子来学习学习~

#26


不能只判断是否rs.eof,如果是rs.eof不足以说明用户已经合法的登陆,还必须于rs("username")=username,rs("password")=password,这样就即使他通过sql语句注入,也不行了

#27


看不明白为什么他叫做万能用户,
有人解释吗
用户名不是都在控制注册时搞定了吗
一般都不含有非法字符吧。
我一般在登陆中的都只是先判断一下用户是否存在,再判断密码是否正确那样,
这也会有问题吗?

#28


如果用上rs("username")=username
rs("userpass")=userpass
的话应该还是会比较安全吧。其它的都想不到了。

#29


http://community.csdn.net/Expert/topic/3230/3230236.xml?temp=.4624903

#30


username="'"& replace(username,"'","''") &"'"

#31


可写成:
sql="select * from testtable where username="'"& replace(username,"'","''") &"'" and password="'"& replace(password,"'","''") &"'"

当然最后不要这种写法(有一条SQL语句来把关),人家还是有漏洞的, lordwudee(三屉馒头)兄写的是较实用的,为什么呢,即使用上面我写的把'换成''了,人家可以用你同一表的其它字段去绕过,如你同一表有sex,则人家可以再能过1' or sex<>'1 ,呵呵,当然这是猜的字段。没猜中顶多出错,猜中了呵呵,不得了了哦

#32


用REPLACE过滤掉标点符号和SQL关健字

#33


<%
username=Chk(request("username"))
password=Chk(request("password"))

Function Chk(str)
    If str<>"" Then Chk=Replace(str,"'","&#39;")
End Function
%>

#34


replace掉所有26个字母10个数字和下划线外的字符.

#35


做两层判断是最好的

#36


其实只要在数据库中保存加密后的密码,在登陆时将输入的密码加密和数据库中的该用户的密码比较就可以避免这样问题。

#37


同意2层验证,以上方法我都试了

#38


1,注册时,就屏蔽特殊字符。
2,登陆时,屏蔽字符。
3,登陆时,用两层验证。
4,对用户密码进行加密,比如用MD5加密,用加密后的新密码进行验证

#39


分布判断

先判断用户名是否存在

在检查用户名是否相符

屏蔽字符串

屏蔽一些在sql中不安全的字符串


md5加密

密码用md5加密

用户名最好也用md5加密

#40


mark

#41


关注

#42


过滤单引号和空格,我指的空格包括半角和全角空格,Tab的缩进空格和Chr(255),最后还有/**/
别问我为什么这样过滤,照做就一切搞定,至于一些SQL关键字,过滤是非常不合理的。

#43


来高手呀。

#44


你都用md5加密估计就没问题了  注册的时候 验证的时候 都加密  其他的什么都不用了 呵呵 绝对没问题

#45



  去网络上下一个JAVA的版本的MD5的算法,
 把密码加密下,然后验证的时候,就没有这种问题,
非常简单.超级推荐!

#46


用户也用md5加密?我没听错吧?

#47


后门法:
uid  = replace(uid,"::","or")
upwd = replace(upwd,"::","or")

#48


后门只为自己开,哈哈

#49


强~!!!!

#50


分开判断是一个好方法

#1


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
先判断用户名,再判断密码

#2


用判断InStr()函数来判断,
其它的输入框用replace(trim(request("")),"';","")把英文的单引号和分号转换为空来过滤。

#3


算是sql注入攻击吧

#4


'*******************************************************************
   ' 检查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

#5


嘿嘿,其实不用那么复杂,只要向我那样判断两层就没问题了,过得了第一层它不可能再过第二层

#6


去掉空格就好了

#7


username="'"& replace(username,"'","''") &"'"

#8


判断两次,先判断用户名,再判断密码,就如 lordwudee(三屉馒头) 所讲

#9


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这样的万能帐户登陆系统?

#10


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

#11


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 if

#12


基本漏洞而已
在提取表单元素的时候至少要有个过滤把,象' 、%、;、"、#、$什么的都得替换掉,我一般是替换成全角中文字符的

#13


这么多的好代码呀!
我通同收藏了.

#14


去掉空格还会有问题吗!

#15


方法一:把输入字符串的引号给转换掉或屏蔽掉.
方法二:先通过username来查询记录在通过userpass来匹配帐号.

#16


呵呵,都不错,多多学习了:)

#17


对用户名和密码进行校验就可以了,不允许出现单引号

#18


哈哈  大家都说了哟

#19


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 function

#20


防止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,"'","&acute;")
  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

#21


username = trim(replace(replace(Request.form("username"),"'","''"),chr(255),""))

#22


两次判断就可以了,不用这么复杂

#23


必须将单引号过滤,否则网页将出现查询性错误
replace(trim(request("")),"';","")
然后出现的错误将被检测出来

#24


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
先判断用户名,再判断密码

#25


拿凳子来学习学习~

#26


不能只判断是否rs.eof,如果是rs.eof不足以说明用户已经合法的登陆,还必须于rs("username")=username,rs("password")=password,这样就即使他通过sql语句注入,也不行了

#27


看不明白为什么他叫做万能用户,
有人解释吗
用户名不是都在控制注册时搞定了吗
一般都不含有非法字符吧。
我一般在登陆中的都只是先判断一下用户是否存在,再判断密码是否正确那样,
这也会有问题吗?

#28


如果用上rs("username")=username
rs("userpass")=userpass
的话应该还是会比较安全吧。其它的都想不到了。

#29


http://community.csdn.net/Expert/topic/3230/3230236.xml?temp=.4624903

#30


username="'"& replace(username,"'","''") &"'"

#31


可写成:
sql="select * from testtable where username="'"& replace(username,"'","''") &"'" and password="'"& replace(password,"'","''") &"'"

当然最后不要这种写法(有一条SQL语句来把关),人家还是有漏洞的, lordwudee(三屉馒头)兄写的是较实用的,为什么呢,即使用上面我写的把'换成''了,人家可以用你同一表的其它字段去绕过,如你同一表有sex,则人家可以再能过1' or sex<>'1 ,呵呵,当然这是猜的字段。没猜中顶多出错,猜中了呵呵,不得了了哦

#32


用REPLACE过滤掉标点符号和SQL关健字

#33


<%
username=Chk(request("username"))
password=Chk(request("password"))

Function Chk(str)
    If str<>"" Then Chk=Replace(str,"'","&#39;")
End Function
%>

#34


replace掉所有26个字母10个数字和下划线外的字符.

#35


做两层判断是最好的

#36


其实只要在数据库中保存加密后的密码,在登陆时将输入的密码加密和数据库中的该用户的密码比较就可以避免这样问题。

#37


同意2层验证,以上方法我都试了

#38


1,注册时,就屏蔽特殊字符。
2,登陆时,屏蔽字符。
3,登陆时,用两层验证。
4,对用户密码进行加密,比如用MD5加密,用加密后的新密码进行验证

#39


分布判断

先判断用户名是否存在

在检查用户名是否相符

屏蔽字符串

屏蔽一些在sql中不安全的字符串


md5加密

密码用md5加密

用户名最好也用md5加密

#40


mark

#41


关注

#42


过滤单引号和空格,我指的空格包括半角和全角空格,Tab的缩进空格和Chr(255),最后还有/**/
别问我为什么这样过滤,照做就一切搞定,至于一些SQL关键字,过滤是非常不合理的。

#43


来高手呀。

#44


你都用md5加密估计就没问题了  注册的时候 验证的时候 都加密  其他的什么都不用了 呵呵 绝对没问题

#45



  去网络上下一个JAVA的版本的MD5的算法,
 把密码加密下,然后验证的时候,就没有这种问题,
非常简单.超级推荐!

#46


用户也用md5加密?我没听错吧?

#47


后门法:
uid  = replace(uid,"::","or")
upwd = replace(upwd,"::","or")

#48


后门只为自己开,哈哈

#49


强~!!!!

#50


分开判断是一个好方法