我已经在多个地方读到,从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
答案 0 :(得分:1)
找到了:
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进行转义。 Rails可能会对显示的ERB文件中的HTML进行一些自动处理,而这可能就是您使用html_escape "some string"
和<%= "some string" %>
所引用的内容。我认为您可能会混淆html_escape
,这在显示URL以及存储在数据库中的URL时可能需要,并且您希望ERB处理器不要弄乱它吗?有时,我知道,尤其是在.js.erb
文件中,我需要进行一些改动才能获得预期的结果。这与消毒不同。在您的示例中,它们似乎是指您可能接受然后重新显示的内容,例如搜索字符串。如果您将<i>hello</i>
放入搜索框中,则需要在将输入传递给后端之前先对输入进行净化处理,或者如果您使用某种JavaScript进行过滤,出于安全原因并希望使其逸出,您可能希望对其进行转义过滤后,可以在搜索框中正确显示。
编辑:我也无法在ri文档中找到您评论的答案。但是我尝试过:
<%= "<b>hello</b>" %>
<%= h("<b>hello</b>") %>
在浏览器中得到相同的结果:
<b>hello</b>
<b>hello</b>
因此,如果您要问是否正确,那么我会说是。