清理请求以防止 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 注入攻击的主要内容,如果未能解决你的问题,请参考以下文章