Rails - 使用h()转义HTML并排除特定标记

时间:2009-09-29 20:08:30

标签: html ruby-on-rails security escaping

我很想知道,到目前为止,无法在网上找到任何答案,如何完成以下操作。

假设我有一个包含以下内容的字符串:

my_string =“ Hello ,我是字符串。” (在预览窗口中,我看到这实际上是在BOLD和ITALIC格式化而不是显示“强”和“i”标签)

现在,我想使用html_escape()(或h())方法/函数使其安全。 所以我想阻止用户插入任何javascript和/或样式表,但是,我仍然希望以粗体显示单词“Hello”,并以斜体显示单词“string”。

据我所知,除了文本本身之外,h()方法不会采用任何其他参数。

有没有办法逃避某些html标签,而不是全部?像白色或黑色列表标签?

这可能是什么样子的例子,我想说的是:

h(my_string,:except => [:strong,:i])#=>基本上,逃避一切,但单独留下“强”和“我”标签,不要逃避这些。

我有什么方法或方法可以做到这一点吗?

提前致谢!

5 个答案:

答案 0 :(得分:3)

排除特定标签实际上是非常难的问题。特别是script标记可以插入very many different ways - 检测它们都非常棘手。

如果可能,请不要自己实施。

答案 1 :(得分:2)

您是否考虑过使用RedClothBlueCloth而不是实际允许使用HTML?这些方法提供了相当多的格式化选项,并为您管理解析。

编辑1:我在浏览如何使用RedCloth删除HTML时发现this message可能有些用处。此外,this page向您展示了版本2.0.5如何允许您删除HTML。似乎无法找到任何新信息,但forum post发现了一个漏洞。希望它从2006年开始修复,但我似乎无法找到RedCloth手册或文档......

答案 2 :(得分:2)

使用white list插件或其modified版本。这是超级的! 您也可以查看Sanitize(似乎更好,但从未尝试过)。

答案 3 :(得分:1)

我会第二次使用Sanitize删除HTML标签。它工作得很好。它默认删除所有内容,您可以为要允许的标记指定白名单。

答案 4 :(得分:0)

防止XSS攻击是一项严肃的事情,请关注hrnt,并认为由于模糊的浏览器怪癖,可能会有超过一个数量级的漏洞利用。虽然html_escape会将事情严密锁定,但我认为使用本土任何东西都是错误的。您只需要更多的眼球和同行评审,以获得任何类型的稳健性保证。

我目前正在评估sanitize vs XssTerminate。我更喜欢xss_terminate方法,因为它在模型级别的健壮性 - 擦除在常规Rails应用程序中非常可靠,其中所有用户输入都通过ActiveRecord,但Nokogiri和特别是Loofah似乎更多一点peformant,更积极地维护,并且更加灵活和Ruby-ish。

更新我刚刚实现了一个名为ActsAsSanitiled的ActsAsTextiled分支,它使用Santize(最近已更新为使用nokogiri)以确保安全性RedCloth输出结构良好,无需在模板中使用任何帮助程序。