在Node.js /服务器端javascript中阻止XSS


68

知道如何防止对node.js应用程序进行XSS攻击吗?在那里处理删除href,onclick属性等中的javascript的任何库。从发布的数据?

我不想为所有这些写正则表达式:)

有什么建议?

Answers:


24

在客户端对HTML进行清理/重写的答案之一是建议从Google Caja借用JS中基于白名单的HTML清理器,据我快速浏览所知,该实现器不依赖HTML来实现HTML SAX解析器。浏览器的DOM。

更新:另外,请记住,显然Caja消毒剂已经过全面,专业的安全检查,而正则表达式以易于破坏安全性的方式而闻名。

更新2017-09-24:现在也有DOMPurify。我还没有使用过它,但是看起来它达到或超过了我要寻找的每一个要点:

  • 尽可能依靠运行时环境提供的功能。(通过尽可能多地使用经过测试的成熟实现,对于性能和最大化安全性都非常重要。)

  • 默认配置旨在尽可能减少剥离,同时仍保证删除javascript。

    • 支持HTML,MathML和SVG
    • 回到Microsoft专有的,无法toStaticHTML在IE8和IE9下进行配置的状态。
  • 高度可配置,使其适用于对可以包含任意HTML的输入进行限制,例如WYSIWYG或Markdown注释字段。(实际上,这是这里的顶端)

    • 支持常用的标签/属性白名单/黑名单和URL regex白名单
    • 有特殊的选项可以进一步清除某些常见类型的HTML模板元字符。
  • 他们对兼容性和可靠性很重视

    • 在16种不同的浏览器以及Node.JS的三个不同主要版本上运行的自动化测试。
    • 为确保开发人员和CI主机都在同一页面上,将发布锁定文件。

谢谢,我已经使用regex(yuck)找到了它,但是我很想研究创建连接中间件来清理所有参数。
Techwraith 2010年


18

所有常用技术也都适用于node.js输出,这意味着:

  • 黑名单将不起作用。
  • 您不应该过滤输入以保护HTML输出。它不会或将不必要地使数据畸形而起作用。
  • 您应该在HTML输出中使用HTML转义文本。

我不确定node.js是否带有一些内置功能,但是类似的事情应该可以完成:

function htmlEscape(text) {
   return text.replace(/&/g, '&').
     replace(/</g, '&lt;').  // it's not neccessary to escape >
     replace(/"/g, '&quot;').
     replace(/'/g, '&#039;');
}

3
“不应该过滤输入” ...“应该对HTML进行转义...输出”:对于这种建议的最佳实践,您有任何参考吗?
Daniel Flippance 2014年

1
@DanielFlippance这两点是“您应该对HTML进行转义的HTML输出”的逻辑结果,那就是HTML规范。
Kornel 2014年

不过滤用户输入是危险的“最佳实践”。您正在为开发人员的错误敞开大门,在大型项目中,开发人员的错误将会发生,因此您将一遍又一遍地被黑客入侵。如果您决定采用这种方式,请记住这一点。
Tomov

@LachoTomov为捕获开发人员错误,我建议使用默认转义的模板引擎。输入处理有两个重大缺点:数据丢失和错误的安全感。例如,人们的名字中可以带有撇号。您不能过滤掉在任何情况下都可能有害的所有内容,但是如果过滤掉明显的内容,则开发人员可能对转义的情况不太保持警惕,并且冒烟测试可能在不该通过的情况下通过。
Kornel

@Kornel肯定有办法对此进行防御。但是您并不总是可以控制其他开发人员使用的内容。对于前。如果您要构建一些公共API。如果返回不安全数据,则使用该数据的网站有50%以上会遭到黑客入侵。是的,您可以将其归咎于其他开发人员,但这不是这个主意-网站仍然遭到黑客入侵:)因此,正确的方法取决于特定的用例。
Tomov '20



3

在较新版本的validator模块中,可以使用以下脚本来防止XSS攻击:

  var validator = require('validator');

  var escaped_string = validator.escape(someString);

1
正如nealpoole.com/blog/2013/07/…中指出的那样 ---您不能简单地使用转义过滤器来防止XSS。OWASP XSS预防备忘单中解释了更多详细信息。您仍然应该使用Google Caja Sanitizer。
jmnwong 2014年


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.