我有一个要求,我需要在文本中使链接可单击,同时将其他任何html标记保留为文本(不是html_safe)。这意味着我无法将整个文本设置为html_safe,因为那样会呈现其他html标签,并且无法清理文本并删除其他html标签。我看到其他网站通过在自己的行上制作html_safe链接和其他文本来处理此问题。检查html时,外观如下所示。
<span">
"This is an "
<a href="https://example.com/" target="_blank" rel="nofollow">https://example.com/</a>
"other <b>HTML</b>"
</span>
在Rails 4中最好的方法是什么?
当您在字符串上调用.html_safe
时,您实际上得到的对象的行为类似于字符串,但为ActiveSupport::SafeBuffer
。当您将字符串附加到ActiveSupport::SafeBuffer
时,它会自动转义。假设您要构建一个跨度,文本是用户输入:
'<span>'.html_safe + text +'</span>'.html_safe
在这种情况下,我们可以防止XXS攻击,因为用户原始文本会自动转义:
irb(main):004:0> "<span>".html_safe + "<script>alert('You have been haxxored!')</script>" + "</span>".html_safe
=> "<span><script>alert('You have been haxxored')</script></span>"
当视图在构造为ActiveSupport::SafeBuffer
时在视图中输出变量时,会自动发生。每当您输出常规字符串时,它将自动转义,因此默认情况下是安全的。
当然,总会有大量的程序员出于无知而给自己一个XSS漏洞:
# WAAAH! Rails is escaping my tags! Bad rails!
'<span>'+ text +'</span>'.html_safe
解决该问题的另一种方法是使用标记帮助器,partials或Nokogiri,而不是使用字符串串联来构造HTML。