假设用户输入中不允许使用任何标记,并且我们希望在存储数据库之前清理用户输入,在Rails中,我们可以选择使用sanitize
(白名单空集标签)和strip_tags
。
哪个更能抵御XSS攻击?如果其他东西更好,那是什么?为什么它更好?
答案 0 :(得分:0)
从Rails 3和Rails核心开发团队在默认情况下使Rails不安全时所采取的脂肪击败,现在所有字符串都标记为安全或不安全,默认情况下“不安全”字符串。当您编写将HTML输出到模板中的帮助程序时,您只需要考虑在Rails中显式管理字符串的“安全性”。
逃避与消毒: 在此上下文中,转义意味着使用HTML转义序列替换某些字符串字符,该转义序列将从文本中删除特殊含义并使其呈现为常规文本。另一方面,清理意味着验证HTML内容以确保仅使用良好的HTML标记和属性。请注意,由于这种情况,清理本质上不如转义安全,并且只应在呈现内容必须包含HTML标记的情况下使用。一个例子是textarea上的WYSIWYG HTML编辑器,它管理稍后在页面上呈现的代码。
Sanitize对所有标签进行编码,并从传递给它的html字符串中剥离所有属性(不是特别允许的,在您的情况下都是如此)。它还使用无效协议剥离href和src标记,以防止滥用js属性。另一方面,Strip_tags将删除所有提供的标签,包括听起来完全符合您要求的注释。只要您将params列入白名并将其添加到正确转义的数据库中,例如:
Title.where(author = ?, author_id)
而不是盲目地将用户输入插入到您的数据库中我会对您的设置方式感到满意。