Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 3.0.2数组#连接HTML安全吗?_Ruby On Rails - Fatal编程技术网

Ruby on rails Rails 3.0.2数组#连接HTML安全吗?

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

我有一个rails gem,它使用了如下代码片段:

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
=> "&lt;one&gt;<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 />') %>