转义 HTML 输出但不换行

发布于 2024-09-29 23:08:06 字数 299 浏览 1 评论 0原文

我的模型中有一个描述文本字段。 否,我想在展示页面上添加此描述。 但由于没有换行符,文本显得很难看。

如果我用
替换它们,那么导轨就会逃脱它们。 所以我尝试使用 raw() 方法。 我想转义错误的 HTML,但输出中有换行符。

我最终得到了一些丑陋的代码。

raw(h(@place.description.gsub("\n","#linebreak#")).gsub("#linebreak#","<br/>"))

您有什么建议吗?

I have a description text field in my Model.
No I want to add this description on the show page.
But the text renders ugly because of no linebreaks.

If i replace them with <br/> then the rails escape them with.
So i tried to use the raw() method.
I want to escape bad HTML but have the linebreaks in my output.

I end up with some ugly code.

raw(h(@place.description.gsub("\n","#linebreak#")).gsub("#linebreak#","<br/>"))

Do you have any suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

笑梦风尘 2024-10-06 23:08:06

您应该使用 simple_format 帮助器:

<%= simple_format @place.description %>

http://api. rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format

you should use the simple_format helper:

<%= simple_format @place.description %>

http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format

走过海棠暮 2024-10-06 23:08:06

3 年后,但提供一个良好的工作解决方案永远不会太晚

这将转义除换行符之外的所有 HTML 字符(兼容 Linux、Windows 和 Mac)

html_escape(@place.description).gsub(/(?:\n\r?|\r\n?)/, '<br />').html_safe

3 years later, but it's never too late to provide a good working solution

This will escape all HTML chars but the newlines (compatible Linux, Windows and Mac)

html_escape(@place.description).gsub(/(?:\n\r?|\r\n?)/, '<br />').html_safe
メ斷腸人バ 2024-10-06 23:08:06

是您要找的吗

@place.description.html_safe.gsub("\n", '<br/>')

?但转念一想,这样的html_safe用法岂不是很容易让网站受到XSS攻击吗? (因为它假设描述是安全的)。

没有更好的解决方案

<%= (h @place.description).gsub("\n", '<br/>') %>

因此,一开始我认为

<%= (h @place.description).gsub("\n", '<br/>'.html_safe) %>

,但实际上两个版本都可以工作。然后我通过向 description 添加一些 HTML 标签进行测试,它被转义为 < 等,因此它确实可以防止 XSS 攻击。

is what you are looking for

@place.description.html_safe.gsub("\n", '<br/>')

? But on second thought, doesn't the html_safe usage like that make it easy for the site to get XSS attack? (because it assumes the description is safe).

So won't a better solution be

<%= (h @place.description).gsub("\n", '<br/>') %>

at first I thought

<%= (h @place.description).gsub("\n", '<br/>'.html_safe) %>

is needed but actually both versions work. I then tested by adding some HTML tags to description and it got escaped into < etc, so it does prevent XSS attack.

廻憶裏菂餘溫 2024-10-06 23:08:06

这是一个有效的解决方案:

<%= sanitize(@place.description.gsub("\n", "<br />"), :tags => %w(br), :attributes => %w()) %>

更多阅读:

解析文本区域中的换行符不允许使用所有 html 标签

文档:

http:// /api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html

来自 sanitize:

此清理助手将对所有标签进行 html 编码并去除所有未明确允许的属性。

它还会去除带有无效协议的 href/src 标签,例如 javascript: 特别是。它尽力对抗黑客可能使用的任何技巧,例如输入 unicode/ascii/hex 值来绕过 javascript: 过滤器。查看广泛的测试套件。

您可以使用 :tags 选项指定允许的标签,并使用 :attributes 选项指定属性。

Here's a solution that works:

<%= sanitize(@place.description.gsub("\n", "<br />"), :tags => %w(br), :attributes => %w()) %>

More reading:

Parsing newline characters in textareas without allowing all html tags

Documentation:

http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html

From sanitize:

This sanitize helper will html encode all tags and strip all attributes that aren’t specifically allowed.

It also strips href/src tags with invalid protocols, like javascript: especially. It does its best to counter any tricks that hackers may use, like throwing in unicode/ascii/hex values to get past the javascript: filters. Check out the extensive test suite.

You can specify allowed tags with :tags option, and attributes with :attributes option.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文