S
soul
Unregistered / Unconfirmed
GUEST, unregistred user!
说起这个就要回忆起当初修改大富翁的初衷,—— 一个严重的安全问题。
这个问题表现在两个方面一个密码的检验,一个是整个网站数据库的安全。
这个问题在Sql server上尤其明显。并且它可能不仅仅出现在web上,很多程序也
有这个毛病。
好,听我说来。
大家知道,一句sql语句的语法,可是是否可曾想过你的意图被修改。
以大富翁为例,大富翁以前的密码检验程序大致如下形式
user=request("user")
pwd=request("pwd")
sql="select * from users where user='"+user+'" and <font color=red>pwd="'+pwd+'"'</font>
RS.Open SQL, Conn, 1, 1
if RS.RecordCount>0 then
' 通过验证
end if
问题就出在这里了,大家也许对此没有什么意见,其实却犯了大错误。
我如果输入
user=soul
pwd=" or user="soul
那么我便可以改变sql语句的本意,使我通行无阻。
所以大家在做这些事情时切记要考虑输入的合法性,看看是否会引起你的sql语句的改变。
对于数字型的变量一定确认输入的确是数字,而如果是字符串的话,尽量过滤掉 ' 号。
如果必须要存在 ' 号,那就得想法变成转义符号在嵌到sql语句中。
总之,不要让输入使得你的sql发生变化。
在上列中
现在在输入是过滤掉了 ' 号并且改成了。
user=request("user")
pwd=request("pwd")
sql="select * from users where user='"+user+'"
RS.Open SQL, Conn, 1, 1
if RS.RecordCount>0 then
if rs('pws')=pwd then
' 通过验证
end if
end if
第二点情况一般发生在sql server上,但比上面更严重,更可怕。
因为在sql server上形如 select * from aaa where a=1 select * from bbb where b=1 delete aaa where a=1
这样的东西是可以被正确执行的及
象大富翁原来的方式
Lid=request("lid")
.....
sql="select * from letters where id =" &
Lid
这样的语句是非常可怕的。
因为我如果输入的url是 dispQ.asp?lid=33333 delete aaaa
那么sql将变成 select * from letters where id =33333 delete aaaa
其结果是 aaaa 库被无情删除。
这个后果尽管没在大富翁上发生,但其实大富翁在很长时间里都处在风雨飘摇之中。
真的很可怕。
现在终于起用的新版本,这个问题得到了完整的解决。我仔细检查了每一个角落。
可以说没有这些问题。
当然我也知道其实大富翁还是有很多我们没有考虑到的东西,由于对大富翁本身没
什么威胁,也就没去修正。
在此通报大家,希望引起大家的注意。这个问题是个普遍问题,和asp本身关系并
不大,大家在做自己程序的时候不妨也考虑下,是否自己已经犯了这个错误。
这个问题表现在两个方面一个密码的检验,一个是整个网站数据库的安全。
这个问题在Sql server上尤其明显。并且它可能不仅仅出现在web上,很多程序也
有这个毛病。
好,听我说来。
大家知道,一句sql语句的语法,可是是否可曾想过你的意图被修改。
以大富翁为例,大富翁以前的密码检验程序大致如下形式
user=request("user")
pwd=request("pwd")
sql="select * from users where user='"+user+'" and <font color=red>pwd="'+pwd+'"'</font>
RS.Open SQL, Conn, 1, 1
if RS.RecordCount>0 then
' 通过验证
end if
问题就出在这里了,大家也许对此没有什么意见,其实却犯了大错误。
我如果输入
user=soul
pwd=" or user="soul
那么我便可以改变sql语句的本意,使我通行无阻。
所以大家在做这些事情时切记要考虑输入的合法性,看看是否会引起你的sql语句的改变。
对于数字型的变量一定确认输入的确是数字,而如果是字符串的话,尽量过滤掉 ' 号。
如果必须要存在 ' 号,那就得想法变成转义符号在嵌到sql语句中。
总之,不要让输入使得你的sql发生变化。
在上列中
现在在输入是过滤掉了 ' 号并且改成了。
user=request("user")
pwd=request("pwd")
sql="select * from users where user='"+user+'"
RS.Open SQL, Conn, 1, 1
if RS.RecordCount>0 then
if rs('pws')=pwd then
' 通过验证
end if
end if
第二点情况一般发生在sql server上,但比上面更严重,更可怕。
因为在sql server上形如 select * from aaa where a=1 select * from bbb where b=1 delete aaa where a=1
这样的东西是可以被正确执行的及
象大富翁原来的方式
Lid=request("lid")
.....
sql="select * from letters where id =" &
Lid
这样的语句是非常可怕的。
因为我如果输入的url是 dispQ.asp?lid=33333 delete aaaa
那么sql将变成 select * from letters where id =33333 delete aaaa
其结果是 aaaa 库被无情删除。
这个后果尽管没在大富翁上发生,但其实大富翁在很长时间里都处在风雨飘摇之中。
真的很可怕。
现在终于起用的新版本,这个问题得到了完整的解决。我仔细检查了每一个角落。
可以说没有这些问题。
当然我也知道其实大富翁还是有很多我们没有考虑到的东西,由于对大富翁本身没
什么威胁,也就没去修正。
在此通报大家,希望引起大家的注意。这个问题是个普遍问题,和asp本身关系并
不大,大家在做自己程序的时候不妨也考虑下,是否自己已经犯了这个错误。