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

你知道如何防止对 node.js 应用程序的 XSS 攻击吗?有没有处理从 POST 数据中移除 hrefs、 onclick 属性等 javascript 的库?

我不想为这一切编写正则表达式:)

有什么建议吗?

67794 次浏览

在客户端消毒/重写 HTML的一个答案建议借用 Google Caja 的基于白名单的 HTML 消毒程序,据我所知,它实现了一个 HTML SAX 解析器,而不依赖于浏览器的 DOM。

更新: 另外,请记住,Caja 消毒剂显然已经进行了全面的,专业的安全检查,而正则表达式是众所周知的非常容易输入的安全性损害的方式。

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

  • 尽可能依赖执行期函式库提供的功能。(通过尽可能依赖经过良好测试的成熟实现,对性能和安全性最大化都很重要。)

    • 对于 Node.JS,依赖于浏览器的 DOM 或 Jsdom
  • 默认配置设计为尽可能少地去除,同时仍然保证删除 javascript。

    • 支持 HTML、 MathML 和 SVG
    • 回落到微软的专有的,不可配置的 toStaticHTML在 IE8和 IE9之下。
  • 高度可配置,使其适合于对可以包含任意 HTML 的输入强制执行限制,例如 WYSIWYG 或 Markdown 注释字段。(事实上,它是这一堆的顶部)

    • 支持通常的标记/属性白名单/黑名单和 URL 正则表达式白名单
    • 有特殊的选项可以进一步消毒某些常见类型的 HTML 模板元字符。
  • 他们很看重兼容性和可靠性

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

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

我已经创建了一个模块,捆绑 Caja HTML 消毒剂

npm install sanitizer

Http://github.com/thesmaw/caja-html-sanitizer

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

感谢你的反馈。

所有常用的技术也适用于 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;');
}

我最近通过 Chriso发现了 Node-validator (节点验证器)

例子

get('/', function (req, res) {


//Sanitize user input
req.sanitize('textarea').xss(); // No longer supported
req.sanitize('foo').toBoolean();


});

功能废弃

XSS 函数在这个库中不再可用。

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

在较新版本的 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

您应该尝试使用 Library npm“ crazy”。 Https://github.com/bevacqua/insane

我尝试在生产,它工作得很好。大小是非常小(约3kb gzip)。

  • 清理 html
  • 删除所有计算 js 的属性或标记
  • 您可以允许不需要消毒的属性或标记

文档非常容易阅读和理解。 Https://github.com/bevacqua/insane

更新2021-04-16 : XSS 是一个用于过滤用户输入以防止 XSS 攻击的模块。

使用白名单指定的配置消除不可信 HTML (以防止 XSS)。

访问 https://www.npmjs.com/package/xss
项目主页: < a href = “ http://jsxss.com”rel = “ nofollow norefrer”> http://jsxss.com