验证用户输入HTML子集

Validate User-Input HTML Subset

本文关键字:子集 HTML 输入 用户 验证      更新时间:2023-09-26

我正在寻找一种验证用户输入HTML的方法,类似于你在评论表单中看到的。用户的输入应该局限于最基本的标签,如p、ul、li、div、img。唯一允许的属性是样式。

验证可以通过Javascript在客户端进行,也可以通过Ruby在服务器端进行。我希望能找到一个能够做到这一点的Javascript库,或者至少能找到几个RegExe来做到这一步。

谢谢你的建议。

您可以使用Sanitize来过滤HTML。

使用您在问题中列出的示例元素,您可以在验证代码中使用类似的内容:

Sanitize.clean(html,
    :elements => ['p', 'ul', 'li', 'div', 'img'],
    :attributes => {'
        'all' => ['style']
    }
)

正如我在上面的评论中提到的,如果用户创建了覆盖整个页面的不可见链接,则允许style属性可能是危险的,尤其是如果您允许<a>标签,因为它会使您面临点击劫持攻击。

如果你确实想允许<a>标签,我建议完全禁止style,也许可以将rel=nofollow添加到用户提供的链接中:

Sanitize.clean(html,
    :elements => ['p', 'ul', 'li', 'div', 'img', 'a'],
    :add_attributes => {
      'a' => {'rel' => 'nofollow'}
    }
)