Discourse 如何防范通过 User Agent 进行的 SQL 注入?

注意到 Discourse 会在某些表中持久化用户代理(User-Agent),例如 web_crawler_requests。已知攻击者会利用“user-agent”字段注入恶意代码,例如 Sleepy User Agent 攻击。我想了解一下,Discourse 是否已采取任何措施来防范此类攻击?

Discourse 是一个基于 Rails 的应用程序,因此我们在项目中充分利用了该框架的安全防护机制:

6 个赞

你好 @mbaker341997

Rails 安全指南是一个很好的概览,但在我看来,该指南并未充分涵盖许多人认为(可以说)是缓解 SQL 注入攻击最重要的控制措施。

防范"SQL 注入”的第一道防线是严格的数据输入验证。

让我引用 Rails 安全指南(上文)中的一个直接示例:

Rails 安全指南展示了这个简单的例子:

Project.find(:all, :conditions => "name = '#{params[:name]}'")

攻击者可以通过向输入参数注入以下内容来利用此漏洞:

' OR 1=1'

然而,通过在模型中实施严格的验证,就可以防止这种情况发生,例如:

before_validation :filter_name_param

private

def filter_name_param

   ### 在此处编写自定义参数过滤代码,确保特殊字符和其他“危险代码”
   ### 绝不会被允许接近数据库

end

Rails 提供了许多“开箱即用”的验证功能,这些功能可以(并且应该)被包含在模型中,以确保输入参数在进入数据库之前很早就得到验证。

关于 Rails 验证的更多信息,请参见:

许多人容易忘记,数据输入验证是防范 SQL 注入攻击的第一道防线,这对于所有服务器端 Web 开发代码(如 Ruby、PHP、Python 等)都是如此。一般来说,客户端验证可能会被利用,因此必须在服务器端进行二次验证。

特别是,我推荐阅读“自定义验证”部分:

希望这能帮到你。

2 个赞