【发布时间】:2009-08-12 14:40:39
【问题描述】:
在 Ruby on Rails 中防止 XSS 的做法是什么? 我在网上找到了很多旧文档,而且大部分时间都是关于使用 h/html_escape 帮助器转义来自用户的任何变量。
我从较新的文档中了解到,在 2.0 及更高版本中有 sanitize 自动清理输入的方法 恶意输入。是否足够,或者您是否正在做更多的事情来保护您的 应用?
【问题讨论】:
标签: ruby-on-rails ruby security xss
在 Ruby on Rails 中防止 XSS 的做法是什么? 我在网上找到了很多旧文档,而且大部分时间都是关于使用 h/html_escape 帮助器转义来自用户的任何变量。
我从较新的文档中了解到,在 2.0 及更高版本中有 sanitize 自动清理输入的方法 恶意输入。是否足够,或者您是否正在做更多的事情来保护您的 应用?
【问题讨论】:
标签: ruby-on-rails ruby security xss
h 方法仍然是转义字符串中所有 HTML 的方法。您应该在输出内容的任何地方都使用此方法。
<%=h @recipe.description %>
这种行为将在 Rails 3 中发生变化。默认情况下,所有输出都将被转义,您需要明确指定不转义它。同时,如果您经常忘记使用此h 方法,您可能需要查看Safe ERB plugin。
sanitize 方法是有选择地从内容中去除某些标签的好方法。例如,如果您想允许用户在添加链接的同时将其输出加粗和斜体,您可以这样做。
<%= sanitize @recipe.description, :tags => %w[b i a], :attributes => %w[href] %>
正如 Oliver 所说,请查看Security Guide 了解更多信息。
【讨论】:
Ruby on Rails Security Guide 相当详尽地阐述了您在为网站设计安全性时应考虑的特定于 Rails 的问题。
【讨论】:
就最佳实践而言,我会推荐以下内容:
始终使用 rails 表单助手(form_for 等),如果您编写自己的表单,您就会面临 CSRF 攻击。
虽然使用 h() 函数会在将文本写入页面时对其进行转义,但您最终仍会在数据库中保存 XSS 漏洞。使用XSS_terminate 插件会在保存时删除输入。
不要忘记您的应用程序运行在一堆其他应用程序(Rails、Apache、MySQL、您选择的操作系统)上,每个应用程序都有自己的安全问题。
【讨论】: