我很想知道,到目前为止,无法在网上找到任何答案,如何完成以下操作。
假设我有一个包含以下内容的字符串:
my_string =“ Hello ,我是字符串。” (在预览窗口中,我看到这实际上是在BOLD和ITALIC格式化而不是显示“强”和“i”标签)
现在,我想使用html_escape()(或h())方法/函数使其安全。 所以我想阻止用户插入任何javascript和/或样式表,但是,我仍然希望以粗体显示单词“Hello”,并以斜体显示单词“string”。
据我所知,除了文本本身之外,h()方法不会采用任何其他参数。
有没有办法逃避某些html标签,而不是全部?像白色或黑色列表标签?
这可能是什么样子的例子,我想说的是:
h(my_string,:except => [:strong,:i])#=>基本上,逃避一切,但单独留下“强”和“我”标签,不要逃避这些。
我有什么方法或方法可以做到这一点吗?
提前致谢!
答案 0 :(得分:3)
排除特定标签实际上是非常难的问题。特别是script
标记可以插入very many different ways - 检测它们都非常棘手。
如果可能,请不要自己实施。
答案 1 :(得分:2)
您是否考虑过使用RedCloth或BlueCloth而不是实际允许使用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输出结构良好,无需在模板中使用任何帮助程序。