关于防止SQL注入的问题

为了避免出现这个漏洞,现在基本上的后台验证都不会使用这类方式,而是取得用户输入的账号和密码,在SQL中先将用户名与数据库中的记录做对比,若数据库中某条记录的用户名等于用户输入的用户名,则取出该条记录中的密码,然后再与用户输入的密码对比,正确就通过,不正确就返回。例如一下代码:
 
<%
pwd = request.form("pwd") 获取用户输入的密码,再把值赋给pwd
name = request.form("name") 获取用户输入的用户名再把值赋给name
都没有进行任何过滤
Set rs = Server.CreateObject("ADODB.Connection")
sql = "select * from Manage_User where UserName=" & name & "" 将用户名和密码放入查询语句中查询数据库,
Set rs = conn.Execute(sql) 执行SQL语句,执行后并得到rs对象结果,“真”或“假”
If Not rs.EOF = True Then 如果是真则执行以下代码
password=rs("password") 取得密码数据
if password=md5(pwd) then
Session("Name") = rs("UserName") 将UserName的属性赋给Name的Session自定义变量
Session("pwd") = rs("PassWord") 将PassWord的属性赋给pwd的Session自定义变量
Response.Redirect("Manage.asp")了 利用Response对象的Redirect方法重定向Manage.asp
else
response.write "密码错误!!!!"
end if
Else 否则执行以下代码
Response.Redirect "Loginsb.asp?msg=您输入了错误的帐号或口令,请再次输入!"
End If
%>
 
通过以上例子可知道,密码的验证不再是直接在SQL语句中做验证了,而是根据用户名,取出对应的密码,然后再与用户输入的做对比。这样一来就造成了我们不能使用or=or绕过了。有的朋友在这里可能有疑问了,若我们提交or=or那么SQL语句就变成:select * from Manage_User where UserName=or=or,这样一来得到的结果也应该是真啊,为什么就不能绕过呢?
 
其实就算SQL查询的地方得到的值是真,可别忘了后面还有密码的验证,若我们提交以上SQL,得到账号是真的,那么后面根据账号去数据库中取出来的密码与用户提交的密码是绝对通不过的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值