首页 > 解决方案 > 在视图中正确转义字符串

问题描述

我已经在多个地方读到,从 Rails 3 开始,您不再需要html_escape "some string"在视图中实际转义字符串,并且默认情况下,简单地写入<%= "some string" %>就会转义字符串。但是,我在文档中找不到此信息。我通读了 Rails 指南部分中的 XSS,其中说明了这一点:

https://guides.rubyonrails.org/security.html#cross-site-scripting-xss

作为第二步,最好的做法是转义应用程序的所有输出,尤其是在重新显示未经过输入过滤的用户输入时(如前面的搜索表单示例)。使用 escapeHTML()(或其别名 h())方法将 HTML 输入字符 &、"、< 和 > 替换为它们在 HTML 中的未解释表示(&、"、< 和 >)。

然后我看到几个博客说它是默认转义的。例如:https ://www.netsparker.com/blog/web-security/preventing-xss-ruby-on-rails-web-applications/

https://dzone.com/articles/preventing-cross-site-scripting-vulnerabilities-wh

标签: ruby-on-railsrubyruby-on-rails-5

解决方案


找到了:

https://guides.rubyonrails.org/3_0_release_notes.html

“7.4.3 其他更改您不再需要调用 h(string) 来转义 HTML 输出,它在所有视图模板中默认启用。如果您想要未转义的字符串,请调用 raw(string)。”


escapeHTML()(或其别名 h())来自 CGI::escapeHTML,它是一个 Ruby API 实现。如果您不使用 Rails,您仍然可以转义 HTML。html_escape "some string"Rails 可能会对 ERB 文件中的 HTML 进行一些自动处理以进行显示,这可能是您使用and所指的内容<%= "some string" %>。我认为您可能会混淆html_escape显示 url 时可能需要的内容,以及存储在数据库中的内容,并且您希望 ERB 处理器不会弄乱它?我有时知道,特别是在.js.erb文件中,我需要逃避一些事情才能得到我期望的结果。这与消毒不同。在您的示例中,它们似乎指的是您可能接受然后重新显示的内容,例如搜索字符串。如果你把<i>hello</i>进入搜索框,您可能希望在将输入传递到后端之前对其进行清理,或者如果您使用一些 javascript 进行过滤,出于安全原因,您可能希望将其转义并让它在搜索框中正确显示过滤后。

编辑:我也无法在 ri 文档中找到您的评论的答案。但我试过:

<%= "<b>hello</b>" %>
<%= h("<b>hello</b>") %>

并在浏览器中得到相同的结果:

&lt;b&gt;hello&lt;/b&gt;
&lt;b&gt;hello&lt;/b&gt;

所以如果你问这是不是真的,那么我会说是的。


推荐阅读