转义 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标签进行测试,它被转义到&amp;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 输出但没有换行符的主要内容,如果未能解决你的问题,请参考以下文章

python 换行和转义字符

PHP如何输出换行符

C++特殊字符转义序列

Delphi中JSON回车换行符转义

在标签中进行0换行后转义StackView

Python_转义字符