2009-09-29 57 views
5

我想知道,并且至今还没有找到任何答案,如何完成以下操作。Rails - 使用h()转义HTML并排除特定标记

比方说,我有一个包含以下内容的字符串:

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

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

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

有没有办法只转义某些html标签,而不是所有?像白色或黑色上市标签?

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

H(my_string,:除了=> [:强壮,我])#=>所以基本上,逃生一切,但只留下“强”和“我”标签,不要逃避这些。

是否有任何方法或方法可以实现此目标?

在此先感谢!

回答

3

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

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

2

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

编辑1:我发现this message当浏览如何使用RedCloth删除HTML时,可能会有一些用处。另外,this page向您展示了2.0.5版本如何让您删除HTML。似乎无法找到任何新的信息,但forum post发现了一个漏洞。希望它已被固定,因为这是从2006年,但我似乎无法找到RedCloth手册或文档...

+0

RedCloth很棒,但它不会去掉任何html标签;我可以插入,它不会被转义。我不确定BlueCloth如何去除HTML;我以前没有用过它。 – zgchurch 2009-09-30 01:18:21

1

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

0

防止XSS攻击是严重的事情,请遵循hrnt's,并认为由于浏览器模糊不清,可能存在比可能更多的漏洞。尽管html_escape会将事情锁定得非常紧密,但我认为使用任何自制的东西来完成这种事情是错误的。你只需要更多的眼球和同行评审来保证任何形式的健壮性。

我现在正在评估sanitize vs XssTerminate。我更喜欢xss_terminate方法,因为它的鲁棒性 - 在模型级别的清理将在所有用户输入都经过ActiveRecord的普通Rails应用程序中相当可靠,但Nokogiri,特别是Loofah似乎更具性格,更主动地维护并且明确更灵活和Ruby-ish。

更新我刚刚实施ActsAsTextiled的一个分支叫ActsAsSanitiled使用Santize(最近已被更新的方式来使用引入nokogiri),以保证安全性和RedCloth输出的良好性,都无需任何助手在你的模板中。