2

我们继承了一个旧网站,其中包含近 2000 个不同的手工构建的 SQL 字符串,直接从 httprequests 获取变量。该站点经常受到 SQL 注入攻击。显然,该站点应该使用 SQL 参数进行编码以避免这种安全噩梦,但由于涉及更改这些参数的工作量,我们正在寻找另一种“清理”传入请求的方法。

主要清洁功能:-

Public Function myRequest(ByRef Request As HttpRequest, ByVal param As String) As String
        Return CleanRequest(Request(param))
End Function

Public Function CleanRequest(ByVal requestString As String) As String
        Dim badChars() As String = {"select", "drop", ";", "--", "insert", "delete", "xp_", "update"}
        Dim newChars As String = requestString

        For i = 0 To UBound(badChars)
            newChars = Replace(newChars, badChars(i), "", 1, -1, vbTextCompare)
        Next

        CleanRequest = Replace(newChars, "'", "''")
End Function

如此称呼:-

Dim details As DataSet

detailsSQL = "select * from mytable where tableid = '" & myRequest(Request, "tableid") & "'"
details = sql.sqlSelect(detailsSQL)

请注意,代码是结构化和命名的,以便于查找和替换。有了这个代码,尽管该网站继续经常受到攻击。任何人都可以推荐主要的“清洁”功能来帮助阻止这些注入攻击吗?

4

2 回答 2

5

我认为防止 SQL 注入的唯一可靠方法是投入大量精力并将所有请求转换为使用 SQL 参数。

但是,要回答您的问题,您的 clean 方法似乎缺少 SQL Injection- unescaped characters的基本触发器。目前,您的网站仍然容易受到各种类型的攻击,例如:

"password' or 1=1; --"
"password'; DROP Table Users; --"

至少,请确保您正在转义任何不良字符。但请注意,这并不总是足够的,所以如果你想完全消除 SQL 注入,我会重新迭代 - 使用 SQL 参数。

于 2013-01-21T10:48:12.397 回答
1

下面的一段 SQL 是错误的。请使用 SQL 参数:它将帮助您摆脱最明显的 SQL 注入攻击。

detailsSQL = "select * from mytable where tableid = '" & myRequest(Request, "tableid") & "'"
details = sql.sqlSelect(detailsSQL)

将此替换为:

detailsSQL = "select * from mytable where tableid = @tableid"
details = sql.sqlSelect(detailsSQL, new SqlParameter(@tableid, myRequest(Request, "tableid")))

假设

  • sql 是 SQLServer 数据库查询的包装器
  • 您的 sqlSelect 函数也适用于具有 SQL 参数
  • myRequest 按照詹姆斯的建议正确转义条目

以正确的方式使用参数将不再需要为 SQL 语句解析每个条目。

于 2013-01-21T10:56:22.187 回答