如何解决经典asp应用程序中order by
子句的SQL注入问题?
以下是演示代码:
strSort=request("sort")
strSQL="select * from table1"
select case strSort
case "case1"
strSQL=strSQL & "order by " & strSort
case "case2"
strSQL=strSQL & "order by" & strSort
end select
答案 0 :(得分:1)
您应始终使用compiled queries /也称为预备语句。他们只会为您验证值,为您的应用程序添加一层安全性。
请注意,这仍然不能确保您的代码不会受到SQL注入攻击的影响,但它已经是安全的良好基础,因为SQL注入变得更加复杂,无法利用预准备语句。您可以阅读有关这些高级攻击的更多here。
所以,最后,请记住,只要您直接处理字符串,就不会安全,您必须手动检查参数的有效性。 你只是不能没有内置的对象/函数,因为你有太多的字符需要处理(Unicode等等)。
例如this文章将解释为什么仅仅天真地逃避引号是不够的。
所以,如果不在使用前清理字符串,就无法解决问题。
注意:经典ASP解决方案
在上面介绍的经典ASP中,我称之为 Type-Safe SQL Parameters 。 SQL Server中的Parameters集合提供了类型检查和长度验证。如果要使用类型安全的SQL参数,可以阅读有关它们的更多信息here。
答案 1 :(得分:0)
这对我有用,连接对象Conn来自global.asa
<%
Dim Rs
Dim Sql
Dim TableName
Dim Cmd
Const adParamInput = 1
Const adVarChar = 200
Set Cmd = Server.CreateObject("ADODB.Command")
TableName = Request("table")
Sql = "select table_name from user_tables where upper(table_name) = upper(?) "
Cmd.ActiveConnection = Conn
Cmd.CommandText = Sql
Cmd.Parameters.Append cmd.CreateParameter("table_name", adVarChar, adParamInput, Len(TableName), TableName)
Set Rs = Cmd.Execute()
Do While Rs.EOF = False
Response.Write Rs("table_name") & "<br />"
Rs.MoveNext
Loop
Rs.Close
Set Rs = Nothing
%>
答案 2 :(得分:-2)
Classic ASP中没有任何真正的反注射安全性。
<%
Function Inj(ByVal Str)
REM For Oracle DB
Str = Replace(Src, "'", "''")
Str = Replace(Src, "&", "' || '&' || '")
Inj = Str
End Function
strSort = Inj(request("sort"))
strSQL="select * from table1"
select case strSort
case "case1"
strSQL=strSQL & "order by '" & strSort & "'"
case "case2"
strSQL=strSQL & "order by '" & strSort & "'"
end select
%>