注意到 Discourse 会在某些表中持久化用户代理(User-Agent),例如 web_crawler_requests。已知攻击者会利用“user-agent”字段注入恶意代码,例如 Sleepy User Agent 攻击。我想了解一下,Discourse 是否已采取任何措施来防范此类攻击?
Discourse 是一个基于 Rails 的应用程序,因此我们在项目中充分利用了该框架的安全防护机制:
6 个赞
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 个赞