防止在Node.js /服务器端JavaScript的XSS

任何想法如何防止XSS攻击node.js应用程序? 任何在那里处理删除href中的JavaScript,onclick属性等库。 从发布的数据?

我不想写一个正则expression式:)

有什么build议么?

在客户端对Sanitize / Rewrite HTML进行处理的一个答案是,从Google Caja中借用基于白名单的HTML清理程序,就我所知,通过快速滚动,可以实现HTML SAXparsing器,而不依赖于浏览器的DOM。

更新:另外,请记住,Caja消毒剂显然已经被授予一个完整的,专业的安全审查,而正则expression式是非常容易打字安全妥协的方式。

更新2017-09-24:现在也有DOMPurify 。 我还没有使用它,但它看起来像满足或超过我所寻找的每一点:

  • 尽可能依赖运行时环境提供的function。 (对于性能和对安全性的最大限度依赖于经过良好testing的成熟实现尽可能地重要)。

    • 依赖浏览器的DOM或Node.JS的jsdom。
  • 默认configuration旨在剥离尽可能less,同时仍然保证删除的JavaScript。

    • 支持HTML,MathML和SVG
    • 在IE8和IE9下回到微软专有的,不可configuration的toStaticHTML
  • 高度可configuration性,使其适用于对可包含任意HTML的input(如WYSIWYG或Markdown注释字段)施加限制。 (事实上​​,这是在这里堆的顶部)

    • 支持通常的标记/属性白名单/黑名单和URL正则表白名单
    • 对于某些常见types的HTML模板元字符,有特殊的选项进一步消毒。
  • 他们对兼容性和可靠性非常认真

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

我创build了一个捆绑了Caja HTML Sanitizer的模块

 npm install sanitizer 

http://github.com/theSmaw/Caja-HTML-Sanitizer

https://www.npmjs.com/package/sanitizer

任何反馈赞赏。

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

  • 黑名单不起作用。
  • 你不应该过滤input,以保护HTML输出。 这将无法正常工作或通过不必要的数据恶化。
  • 您应该在HTML输出中使用HTML转义文本。

我不确定node.js是否带有一些内置的东西,但是类似的东西应该可以完成这个工作:

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

我最近通过chriso发现了节点validation器 。

 get('/', function (req, res) { //Sanitize user input req.sanitize('textarea').xss(); // No longer supported req.sanitize('foo').toBoolean(); }); 

XSSfunction弃用

该库中不再提供XSSfunction。

https://github.com/chriso/validator.js#deprecations

你也可以看看ESAPI 。 有一个JavaScript版本的库 。 这非常坚固。

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

  var validator = require('validator'); var escaped_string = validator.escape(someString); 

试用npm模块strip-js 。 它执行以下操作:

  • 消毒HTML
  • 删除脚本标记
  • 删除包含JavaScript代码的属性,如“onclick”,“onerror”等
  • 删除包含JavaScript代码的“href”属性

https://www.npmjs.com/package/strip-js