如何修复 order by 子句的 sql 注入问题
How fix sql injection issue for the order by clause
如何解决经典 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
您应该始终使用 compiled queries / 也称为 准备好的语句 。他们只会为您完成验证值的工作,为您的应用程序添加一层安全性。
请注意,这仍然不能 100% 确保您的代码不会受到 SQL 注入攻击,但它已经是安全的良好基础,因为 SQL 注入变得利用准备好的语句要复杂得多。您可以阅读 here 有关这些高级攻击的更多信息。
所以,最后请记住,只要您直接处理字符串,您就根本不安全,您将不得不手动检查参数的有效性。
如果没有内置 objects/functions,你 不能 这样做,因为你有太多的字符需要处理(Unicode 等)。
例如 this 文章将向您解释为什么仅天真地转义引号是不够的。
因此,如果不在使用前对字符串进行清理,就无法解决问题。
注意:经典 ASP 解决方案
在经典的ASP中我上面介绍的叫做Type-Safe SQL Parameters。
SQL 服务器中的参数集合提供类型检查和长度验证。如果你想使用类型安全的 SQL 参数,你可以阅读更多关于它们的信息 here.
经典中没有任何真正的反注入安全性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
%>
这对我有用,连接对象 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
%>
如何解决经典 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
您应该始终使用 compiled queries / 也称为 准备好的语句 。他们只会为您完成验证值的工作,为您的应用程序添加一层安全性。
请注意,这仍然不能 100% 确保您的代码不会受到 SQL 注入攻击,但它已经是安全的良好基础,因为 SQL 注入变得利用准备好的语句要复杂得多。您可以阅读 here 有关这些高级攻击的更多信息。
所以,最后请记住,只要您直接处理字符串,您就根本不安全,您将不得不手动检查参数的有效性。 如果没有内置 objects/functions,你 不能 这样做,因为你有太多的字符需要处理(Unicode 等)。
例如 this 文章将向您解释为什么仅天真地转义引号是不够的。
因此,如果不在使用前对字符串进行清理,就无法解决问题。
注意:经典 ASP 解决方案
在经典的ASP中我上面介绍的叫做Type-Safe SQL Parameters。 SQL 服务器中的参数集合提供类型检查和长度验证。如果你想使用类型安全的 SQL 参数,你可以阅读更多关于它们的信息 here.
经典中没有任何真正的反注入安全性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
%>
这对我有用,连接对象 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
%>