清理请求以防止SQL注入攻击

时间:2013-01-21 10:29:49

标签: .net vb.net request sql-injection httprequest

我们继承了一个旧网站,其中包含近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)

请注意,代码的结构和命名都是为了方便查找和编码。更换。有了这个代码,虽然该网站继续经常受到损害。 任何人都可以建议添加主要的“干净”功能,以帮助阻止这些注入攻击吗?

2 个答案:

答案 0 :(得分:5)

我认为唯一可以防止SQL注入的可靠方式是将所有请求付诸实践并将其转换为使用SQL参数。

但是,为了回答您的问题,您的干净方法似乎缺少SQL注入的基本触发器 - 未转义字符。目前,您的网站仍然容易受到各种类型的攻击,例如:

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

至少,确保您逃脱任何bad characters。但是请注意,isn't always enough,如果你想完全根除SQL注入,我会重新迭代 - 使用SQL参数。

答案 1 :(得分: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正如James建议的那样正确地转义条目

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