现在我有一个示例ASP脚本:
<%Set objConn = CreateObject("ADODB.Connection")
objConn.Open Application("WebUsersConnection")
sSQL="SELECT * FROM Users where Username=? & Request("user") & _"?and Password=? & Request("pwd") & "?
Set RS = objConn.Execute(sSQL)
If RS.EOF then
Response.Redirect("login.asp?msg=Invalid Login")
Else
Session.Authorized = True
Set RS = nothing
Set objConn = nothing Response.Redirect("mainpage.asp")
End If%>
我可以知道这个脚本会导致什么样的SQL注入?执行的结果是什么,以及可以使用上述脚本注入应用程序的任何示例SQL?它是从纸上提取的。感谢
答案 0 :(得分:1)
将用户输入直接写入SQL查询的问题之一:
sSQL="SELECT * FROM Users where Username='" & Request("user") & "' and Password='" & Request("pwd") & "'"
是用户提交的
username' OR 1=1 --
使您的查询最终如下所示:
SELECT * FROM Users where Username='username' OR 1=1 --' and Password=''
取决于您的数据库驱动程序,这可能至少返回一行,使您的脚本认为这是一个有效用户(或者甚至是管理员,如果默认按id升序排序)。
您可以使用ADODB.Command
对象来准备SQL查询并将值绑定到占位符。
这样的事情:
sSQL="SELECT * FROM Users where Username=? and Password=?"
set objCommand=CreateObject("ADODB.Command")
objCommand.Prepared = true
objCommand.ActiveConnection = objConn
objCommand.CommandText = sSQL
objCommand.Parameters.Append objCommand.CreateParameter("name",200,1,50,Request("user"))
objCommand.Parameters.Append objCommand.CreateParameter("password",200,1,64,Request("pwd"))
objCommand.Execute
MSDN似乎并不清楚ADODB.Command
是否会实际单独处理查询和值,但我想对于“现代”数据库驱动程序,这是支持的。如果我没记错的话,这适用于Oracle OLEDB数据库驱动程序。
答案 1 :(得分:0)
我已经使用以下两个步骤来防止在高流量网站上多年使用ASP注入SQL,并且从未遇到过问题。
对于每个char数据类型,请确保使用双撇号替换任何撇号,如下所示:
sql = "SELECT * FROM users WHERE "
sql = sql & "Username = '" & Replace(Request("user"), "'", "''") & "' "
sql = sql & "AND Password = '" & Replace(Request("pwd"), "'", "''") & "'"
对于任何数字(非字符)字段,请先验证输入是否为数字,否则忽略它,或返回错误。
答案 2 :(得分:0)
在将它们传递到数据库进行处理之前,使用正则表达式检查输入中的字符(查询字符串/表单变量/ etc ...)总是好的。应该进行检查以查看输入中的所有字符是否都在允许的字符内(白名单检查)。
Function ReplaceRegEx(str, pattern)
set pw = new regexp
pw.global = true
pw.pattern = pattern
replaced = pw.replace(str, "") 'Find the pattern and store it in "replaced"
ReplaceRegEx = replace(str,replaced,"") 'Replace with blank.
End Function
'below is a sample. you can create others as needed
Function UserNameCheck(x)
UserNameCheck = ReplaceRegEx(x,"^[a-zA-Z_-]+$")
End Function
这就是你在ASP页面中调用它的方式:
fld_UserName=UserNameCheck(fld_UserName)
if fld_UserName="" then
'You can probably define the below steps as function and call it...
response.write "One or more parameters contains invalid characters"
response.write "processing stopped"
response.end
end if