我什么时候可以考虑使用dangerouslySetInnerHTML()安全?

时间:2016-03-04 16:05:22

标签: reactjs

阅读scary doc,我知道如果我向dangerouslySetInnerHTML()提供了错误的参数,我的裤子就会因为XSS而失败。我必须做什么上游这个函数调用,以确保我可以安全地使用它?查找并删除< script>来自用户输入的标签?还有什么?

1 个答案:

答案 0 :(得分:5)

CAVEAT:我不是安全专家;以下总结了我作为一名外行人积累的最佳理解。

确保你的危险"最好的方法内部HTML是安全的,以确保您只将它设置为您自己生成的HTML。换句话说,您永远不会显示任何来自外部来源的内容。这可能听起来过于严格,但有一个解决方法:如果你想包括"污染"在危险的HTML中,您可以解析受污染的内容并重新生成它。基本思想是您的解析器只识别合法输入,并忽略其他所有内容。然后它获取解析后的输入,并生成安全输出。

例如,我们说我们有以下规则:

  • 字符串是A-Z,a-z,0-9和/或标点符号句点,逗号,分号,冒号,问号和感叹号的任何序列。
  • 样式字符串类似于[b]粗体[/ b],[u]下划线[/ u]等。
  • 其他一切都被忽略了。

请注意,您并未将脚本标记等内容列入黑名单,因为您可能不知道需要列入黑名单的所有内容。相反,您将某些您认为安全的特定事物列入白名单,并忽略其他所有内容。解析输入后,您已经获得了已知安全字符串和样式字符串的列表,并且使用嵌入式标记进行样式化生成安全的HTML输出相对简单。

链接和图像标记更难以安全处理,因为任何链接/图像都可能导致恶意软件,或者在一天左右后重定向到恶意软件的无害网站。我知道对图像安全的最好方法是要求将它们上传到配备病毒扫描程序的服务器(也不是100%万无一失)。对于链接,我能想到的最好的方法是确保实际链接文本与您要链接的文本一起显示。但我仍然会使用相同的方法:编写一个知道如何解析安全URL(对于链接或图像)的解析器,并且不知道如何解析不安全的URL,然后从解析的数据重新生成链接/图像。这仍然比仅显示样式文本更具风险,但如果您需要链接/图像,这是我所知道的最佳方式。