72

Any idea how one would go about preventing XSS attacks on a node.js app? Any libs out there that handle removing javascript in hrefs, onclick attributes,etc. from POSTed data?

I don't want to have to write a regex for all that :)

Any suggestions?

4

9 回答 9

56

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

npm install sanitizer

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

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

任何反馈表示赞赏。

于 2010-10-29T16:29:05.893 回答
24

Sanitize/Rewrite HTML on the Client Side的答案之一建议从 Google Caja 借用 JS 中基于白名单的 HTML sanitizer,据我所知,它可以在不依赖于浏览器的 DOM。

更新:另外,请记住,Caja sanitizer 显然已经过全面、专业的安全审查,而众所周知,正则表达式很容易以危及安全的方式打错字。

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

  • 尽可能依赖运行时环境提供的功能。(通过尽可能多地依赖经过充分测试的成熟实现,这对于性能和最大限度地提高安全性都很重要。)

    • Node.JS 依赖浏览器的 DOM 或jsdom
  • 默认配置旨在尽可能少地剥离,同时仍保证删除 javascript。

    • 支持 HTML、MathML 和 SVG
    • 回退到微软的专有,toStaticHTML在 IE8 和 IE9 下不可配置。
  • 高度可配置,使其适用于对可以包含任意 HTML 的输入实施限制,例如 WYSIWYG 或 Markdown 注释字段。(其实这里是堆顶)

    • 支持常用的标签/属性白名单/黑名单和 URL 正则表达式白名单
    • 具有特殊选项可进一步清理某些常见类型的 HTML 模板元字符。
  • 他们对兼容性和可靠性很认真

    • 在 16 个不同的浏览器以及三个不同的 Node.JS 主要版本上运行的自动化测试。
    • 为确保开发人员和 CI 主机都在同一个页面上,发布了锁定文件。
于 2010-09-14T03:15:22.337 回答
20

所有常用技术也适用于 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;');
}
于 2010-12-11T23:24:17.143 回答
15

我最近发现了chriso的节点验证器

例子

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

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

});

XSS 函数弃用

此库中不再提供 XSS 功能。

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

于 2010-12-23T22:23:14.967 回答
5

您还可以查看ESAPI。该库有一个javascript 版本。它非常坚固。

于 2010-09-15T23:51:17.210 回答
4

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

  var validator = require('validator');

  var escaped_string = validator.escape(someString);
于 2014-01-31T10:28:46.417 回答
1

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

  • 清理 HTML
  • 删除脚本标签
  • 移除包含 JavaScript 代码的“onclick”、“onerror”等属性
  • 删除包含 JavaScript 代码的“href”属性

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

于 2016-10-12T15:31:56.957 回答
0

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

使用白名单指定的配置清理不受信任的 HTML(以防止 XSS)。

访问https://www.npmjs.com/package/xss
项目主页:http: //jsxss.com

于 2021-04-16T05:48:13.537 回答
0

您应该尝试图书馆 npm “疯狂”。 https://github.com/bevacqua/insane

我在生产中尝试,效果很好。大小非常小(压缩后约 3kb)。

  • 清理 html
  • 移除所有评估 js 的属性或标签
  • 您可以允许您不想清理的属性或标签

该文档非常易于阅读和理解。 https://github.com/bevacqua/insane

于 2018-12-31T11:05:14.527 回答