如何修复order by子句的sql注入问题

时间:2015-12-14 13:24:23

标签: sql-server asp-classic sql-injection

如何解决经典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

3 个答案:

答案 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
 %>