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

Posted

技术标签:

【中文标题】清理请求以防止 SQL 注入攻击【英文标题】:Cleaning requests to prevent SQL injection attack 【发布时间】:2013-01-21 10:29:49 【问题描述】:

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

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

【问题讨论】:

这对居住在Staindrop的任何用户都没有帮助。 有趣的是***.com/questions/1800013/… 讽刺的是你没有参数化你的修复...... 嗨西蒙,我没有参数化“修复”,因为有必要有一个解决方案,我可以“找到并替换”到它发生的许多情况,如问题中所述。 【参考方案1】:

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

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

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

至少,请确保您正在转义任何bad characters。不过请注意,这个isn't always enough,所以如果你想彻底根除 SQL 注入,我会再次重申 - 使用 SQL 参数。

【讨论】:

【参考方案2】:

下面的一段 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 语句解析每个条目。

【讨论】:

谢谢,但您还没有完全阅读并理解这个问题。 我正在查看我的帐户并浏览了一些旧帖子时,我注意到了这一点,并认为它也应该回复清楚,以防将来有人通过 Google 找到这个帖子。 听起来很公平。希望 cmets 中接受的答案和链接有所帮助。

以上是关于清理请求以防止 SQL 注入攻击的主要内容,如果未能解决你的问题,请参考以下文章

使用存储过程可以防止 SQL 注入/XSXX 攻击吗?

如何防止sql注入攻击?

sql注入,xss攻击,csrf(模拟请求)

ASP.NET如何防止SQL注入

如何防止web攻击

传递键值对是不是也可以防止 SQL 注入攻击?