Rails的“raw”帮助程序

3

在可能有许多用户的Rails应用程序中使用“raw”助手是否安全?

我将把TinyMCE与我的应用程序集成,以便用户向某些帖子添加HTML内容。 使用“raw”来显示他们的内容是否存在安全问题?

还是有更合适的做法吗?

谢谢!

1个回答

5
精细的手册中可以得知:
这种方法输出不经过转义的字符串。[...]如果数据来自用户的输入,则不建议使用此方法。
因此,是的,使用raw可能会存在一些安全问题(对于您的用户),除非您正确地对进入的HTML进行了清理。
您不应该信任客户端。即使您已经设置了一个有限的标签集合,也不能保证您的服务器接收到的HTML实际上来自TinyMCE,或者没有人以某种方式规避了TinyMCE。
如果您接受用户的HTML,则需要在存储之前列出白名单标记和属性。
您可以使用Nokogiri逐个解析传入的HTML标记,如果标记在您的白名单上,则允许它通过,如果您没有明确允许该标记(即它不在您的白名单上)则将其丢弃。并且,您需要检查所允许的标记上的属性,以便只有您想要的属性和属性值才能通过。任何不在您的白名单上的标记、属性或属性值都会被丢弃。一旦您清理了传入的HTML,您就可以存储它并使用raw助手安全地呈现给用户。
这种额外的复杂性是许多站点使用Markdown、BB-Code或其他生成HTML的标记语言的原因之一。

看起来我有些研究要做了。作为一个相当新的Rails开发者,这会很有趣,哈哈。谢谢你的回答。 - ardavis
2
请查看 Sanitize [http://rubygems.org/gems/sanitize] gem。它提供了一个与 Nokogiri 交互的界面,将解析您的 HTML,删除您未列入白名单的任何标记,并修复任何未关闭的标记。我现在在一个 Rails 应用程序中使用它,非常简单易实现。还附带一些非常强大的测试。 - Chris Bloom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接