我有一个输入表单,用户可以在其中键入任意HTML。除了脚本标签,我还需要过滤什么?我是这样做的:
userInput.replace(/<(script)/gi, "<$1");
但是WMD消毒器(在SO中使用)管理标签的白名单,并过滤掉(空白)所有其他标签。为什么?
我不喜欢白列表,因为我不想阻止用户输入任意标签。但如果需要的话,除了"脚本",我还可以使用更广泛的黑名单。我需要什么作为黑名单?
简短的回答:他们可以用 script
标签做任何事情。
script
标签不需要运行javascript。几乎每个 HTML标签中都可以放置脚本。Script可以出现在Script标签之外的许多地方,包括但不限于用于url、事件处理程序和style
属性的src
和href
属性。
用户将不需要的脚本放入页面的能力是一个称为跨站点脚本的安全漏洞。阅读有关本主题的内容,并阅读XSS预防小抄。
您可能不想让用户向您的页面添加HTML。如果您需要此功能,请考虑其他格式,例如Markdown,它允许您禁用任何嵌入式HTML的使用;或者另一个不太安全的选择是使用尝试删除所有脚本的过滤库,例如HTMLPurifier。如果您选择了过滤选项,请确保订阅新版本的公告,并在发现新的漏洞并解决问题时,始终返回到您的项目中安装修复了错误的过滤器版本。