在我的rails application_helper.rb 文件中,有一个解析方法。在该方法内部是一个字符串变量 html ,其中包含
<form>
,其他html标签和
的价值。我将在我的视图 index.html.erb 中调用解析,
<%= parse() %>
对解析的调用将输出 html 变量的值。
非常出乎意料的是,我注意到该视图呈现了一个浏览器根本没有处理的网页,即该网页包含了写作
<form>
而不是渲染表格;等等所有其他标签,例如
<br>.
并且
也没有被相应的空格取代。
在检查网页的源代码时,我注意到所有的&符号(例如
将视图作为
发送到浏览器&
和&lt;被发送为
<
并且类似于&gt;。
那么,发生了什么?放
<parse()>
内
<%= %>
在将其发送到浏览器之前处理了 html 的值?为什么呢?
另一个难题是,当我将 parse()放入
时,网页呈现正常<%== %>
(我知道
<%== %>
不是一个正确的语法,我只是错误地发现了这个拼图。)
那是怎么回事?
答案 0 :(得分:2)
<%= =>
出于安全原因,请转义所有代码。例如,我会在我的名字中添加一些脚本:<script>...something bad to steal your accesses, cookies, make redirects, etc</script>
。当您访问我的个人资料时,将执行此脚本。此攻击称为跨站点脚本(XSS)。所以rails关心你并逃避所有这些事情以防止XSS攻击。
你要找的是用这种方式表达你的表达方式:
<%= raw(parse()) %>
或者它是别名,你提到过:
<%== parse() %>
更多详情 - http://edgeguides.rubyonrails.org/active_support_core_extensions.html#output-safety
这应该保留所有标记而不转义....但请记住......如果您有任何类型的数据,用户在parse
输入,那么您将打开一个XSS漏洞在你的申请中。这不是你永远不应该做的事情。只有当你知道自己在做什么时才应该做这件事;)