ruby-on-rails - 在视图中正确转义字符串
问题描述
我已经在多个地方读到,从 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
解决方案
找到了:
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>") %>
并在浏览器中得到相同的结果:
<b>hello</b>
<b>hello</b>
所以如果你问这是不是真的,那么我会说是的。
推荐阅读
- javascript - 如何组合具有相同属性值的数组中的元素
- android - 单元测试室 android - 这项工作尚未完成
- image - 如何删除所有存储库中的所有图像,除了 gcloud 平台中一个名为“devops”的存储库
- javascript - 如何在反应组件中包含外部 js 文件
- laravel - 取消 Stripe 订阅会引发调度错误
- java - 在java中获取对象内部的对象数据
- html - 单击复选框单选时显示 Div
- javascript - 如何删除所有的div?与香草 JS
- java - 从 MappedSuperclass 继承关系
- c# - 如何强制降级 dotnet core 中的交互依赖