Ruby on rails Rails 3.0.2数组#连接HTML安全吗?
我有一个rails gem,它使用了如下代码片段:Ruby on rails Rails 3.0.2数组#连接HTML安全吗?,ruby-on-rails,Ruby On Rails,我有一个rails gem,它使用了如下代码片段: components = [] components << label_for(attribute) components << ... components << text_field(attribute) return components.join 组件=[] 组件字符串在Rails3中自动进行HTML转义。您需要将最后一行更改为: return components.join.html_safe
components = []
components << label_for(attribute)
components << ...
components << text_field(attribute)
return components.join
组件=[]
组件字符串在Rails3中自动进行HTML转义。您需要将最后一行更改为:
return components.join.html_safe
或者,如果编辑gem太麻烦,您可以从视图中进行编辑:
<%= helper_name.html_safe %>
String#join
不支持SafeBuffer
String#html_safe
标记您的字符串已被html转义,防止用户将html的一部分偷偷带到您的页面中。查看Yehuda Katz在SafeBuffer
上的介绍,以及您为什么/如何使用它们
如果您有一个要连接的String
和SafeBuffer
数组,请确保已对它们全部运行#html_safe
,或将它们压缩到SafeBuffer
中,如下所示:
['<one>', '<p>two</p>'.html_safe].inject ''.html_safe, &:concat
=> "<one><p>two</p>"
['',two'.html\u-safe].注入'.html\u-safe,&:concat
=>“一个两个”
Rails有一个名为的内置帮助程序,它将为您执行此操作。
类数组
def html_safe_join(分隔符=“”)
''.html_safe.tap do| str|
每个带有_索引do |元素的_,i|
STR0
str正如@sj26所指出的,要么使用rails内置的助手:
<%= safe_join(components) %>
或者使用我的gem使Array#join
html安全感知,在这种情况下,您的原始代码将按原样工作。手动引用如何
<%= raw ['<div>', 'any', '</div>'].map{|val| h(val)}.join('<br />') %>
感谢您的回复。我在Rails 3.0.1中使用join
(使用较新的HTML转义)时没有任何问题。为什么它在Rails 3.0.2中特别失败?谢谢。我创建了一个超级简单的应用程序来测试你的问题,发现3.0.1对我来说就像你说的3.0.2一样。除非我告诉它不要(我在助手中使用“raw”方法),否则这两种方法都会转义html。谢谢JW和Adam。我刚做了一个测试,你是对的。我不知道为什么我的gem在最近的六个版本中工作,但这确实解决了我的问题。干杯请注意,如果不先显式转义数组中的每一条用户生成内容,这可能会允许XSS。正如@sj26和@marc andre lafortune提出的解决方案所指出的,rails助手safe_join
是一种更好的方法,因为它可以避免XSS漏洞。在我看来,这是一个更好的答案。Join似乎天生就不安全。只是一个关于你保险箱的问题。这只是为了防止数组中的第一个字符串没有标记为html\u安全吗?另外,&:concat和:concat之间有什么区别,后者对我来说似乎是一样的:)更正确的答案是现在使用[safe\u-join(array)
][这是理解safe-buffer
的array-join
。nb safe\u-join是在rails 3.1中添加的
<%= raw ['<div>', 'any', '</div>'].map{|val| h(val)}.join('<br />') %>