转义 HTML 输出但没有换行符
Posted
技术标签:
【中文标题】转义 HTML 输出但没有换行符【英文标题】:escape HTML output but no line-breaks 【发布时间】:2011-05-03 10:16:42 【问题描述】:我的模型中有一个描述文本字段。 不,我想在显示页面上添加此描述。 但是由于没有换行符,文本变得难看。
如果我用<br/>
替换它们,那么导轨会用它们逃脱。
所以我尝试使用 raw() 方法。
我想转义错误的 html,但在我的输出中有换行符。
我最终得到了一些丑陋的代码。
raw(h(@place.description.gsub("\n","#linebreak#")).gsub("#linebreak#","<br/>"))
你有什么建议吗?
【问题讨论】:
【参考方案1】:你应该使用 simple_format 助手:
<%= simple_format @place.description %>
http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format
【讨论】:
值得注意的是,在较新版本的 Rails 中,这对 xss 是安全的。见:***.com/questions/3137393/…【参考方案2】:3 年后,但提供一个好的工作解决方案永远不会太晚
这将转义除换行符以外的所有 HTML 字符(兼容 Linux、Windows 和 Mac)
html_escape(@place.description).gsub(/(?:\n\r?|\r\n?)/, '<br />').html_safe
【讨论】:
【参考方案3】:就是你要找的东西
@place.description.html_safe.gsub("\n", '<br/>')
?但转念一想,html_safe
这样的用法难道不会让网站更容易受到 XSS 攻击吗? (因为它假定description
是安全的)。
所以不是更好的解决方案
<%= (h @place.description).gsub("\n", '<br/>') %>
一开始我以为
<%= (h @place.description).gsub("\n", '<br/>'.html_safe) %>
是必需的,但实际上两个版本都可以使用。然后我通过向description
添加一些HTML标签进行测试,它被转义到&lt;
等,所以它确实可以防止XSS攻击。
【讨论】:
我在下面发布了我的解决方案。【参考方案4】:这是一个可行的解决方案:
<%= sanitize(@place.description.gsub("\n", "<br />"), :tags => %w(br), :attributes => %w()) %>
更多阅读:
Parsing newline characters in textareas without allowing all html tags
文档:
http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html
来自消毒:
此清理助手将对所有标签进行 html 编码并去除所有未明确允许的属性。
它还会去除带有无效协议的 href/src 标签,尤其是 javascript:。它尽最大努力对抗黑客可能使用的任何技巧,例如输入 unicode/ascii/hex 值以通过 javascript: 过滤器。查看广泛的测试套件。
您可以使用 :tags 选项指定允许的标签,使用 :attributes 选项指定属性。
【讨论】:
以上是关于转义 HTML 输出但没有换行符的主要内容,如果未能解决你的问题,请参考以下文章