| 
 帖子15 积分23 威望30  金钱30  在线时间0 小时 
 | 
9楼
 
 发表于 2008-7-23 08:37 
 | 只看该作者 
| 引用: 下面是引用haicao于06-12-2005 13:19发表的:
 如果是asp+access结构的话.
 过不过滤无所谓.
 asp+access密码验证可以这样写
 ...
 .....
 .......
 sql="select * from ad where user='"&user&"'"
 rs.open sql,conn,1,1
 if password=rs("password") then
 成功登陆!
 end if
 user字段俺这么输:
 admin' or password='123456
 如果运气好,有个密码正好是123456的
 在密码字段再输个 123456
 不就进去了么?
 对于字符输入,还是过滤的比较好,至少单引号必须过滤
 这样一来,被单引号引起来的东西,无论如何躲不过去了
 比如'&user&'
 把单引号转换为& #39;
 只要user字段输任何东西,都会当作字符串处理,而单引号一出现又被替换掉
 那么该字段的注射就不可能了(愚见,请大家批评)
 所以事实上很多的注射都是发生在数字型参数里,因为程序员总是记得对于数字型的参数,在SQL里是不需要用单引号引起来的,那么,即使进行了过滤,如果不充分,还是可以进行注射的.
 比如在BBSXP上次的blog.asp中,有个id字段进行了过滤,但是,我们完全可以绕过去.
 复制内容到剪贴板
 代码:
 if id<>"" then
 sql="select * from [calendar] where id="&id&" order by id Desc"
 虽然这个id变量过滤掉了'
 不过对于AC的我们构造一个union查询
 12 union select 1,2,username,userpass,5,6,7 from [user] where membercode=5
 就可以查询区长的用户名和密码了,当然,修改条件查询任何人的密码也没问题的
 对于MSSQL,union会出错,那么我们这么做:
 12  and exists(select * from clubconfig where substring(adminpassword,1,1) between 0x30 and 0x46)
 这样就跳过了单引号的限制,还有比较大小时用到的>和<符号
 用二分法很容易得到所有数据,毕竟这种公开代码的程序的表的结构都很清楚
 总结:
 要防止用' or ''='登陆后台,应该说是要防止SQL 注射
 防止SQL注射,个人认为最简单的注意方法有两个,1,检查所有输入,凡字符型,过滤掉单引号,并且用单引号引起来.
 比如
 user=replace(request(user),"'")
 select * from admin where user='"&user&"'
 如果是数字型,直接用
 id=int (request(id))
 select * from blog where id="&id&"
 个人认为这样基本上就差不多了,有错误的地方欢迎大家指正个人论坛: http://www.xdxf.net
 帖子60 精华2 积分3417 阅读权限100 性别男 在线时间134 小时 注册时间2005-5-3 最后登录2008-5-28 查看详细资料TOP
 
 evilow
  晶莹剔透§烈日灼然
 | 
 |