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

Tec*_*ith 65 xss serverside-javascript node.js

知道如何在node.js应用程序上防止XSS攻击?在那里处理删除hrefs中的javascript,onclick属性等的任何lib.从POSTed数据?

我不想为所有那些写一个正则表达式:)

有什么建议?

小智 54

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

npm install sanitizer
Run Code Online (Sandbox Code Playgroud)

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

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

任何反馈意见.

  • 使用`require('sanitizer').sanitize`删除所有`a [href]`属性,而不仅仅是顽皮的属性.对于我们的用例,我们需要仍然可以接受的链接(只是不是顽皮的链接,和其他xss顽皮等),任何建议? (3认同)

sso*_*low 24

在客户端上清理/重写HTML的答案之一建议借用Google Caja中的JS借用基于白名单的HTML清理程序,据我所知,从快速滚动浏览器可以实现HTML SAX解析器而不依赖于浏览器的DOM.

更新:此外,请记住,Caja清洁剂显然已经获得了完整,专业的安全审查,而正则表达式在安全妥协的方式很容易打字错误.

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

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

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

    • 支持HTML,MathML和SVG
    • toStaticHTML在IE8和IE9下,回归微软的专有,不可配置.
  • 高度可配置,使其适用于对可包含任意HTML的输入实施限制,例如WYSIWYG或Markdown注释字段.(事实上​​,这是最重要的)

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

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


Kor*_*nel 16

所有常用技术也适用于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;');
}
Run Code Online (Sandbox Code Playgroud)

  • "你不应该过滤输入"......"你应该HTML-escape ...输出":你对这个提出的最佳实践有什么参考吗? (2认同)

Bag*_*ggz 15

我最近发现了chriso的node-validator.

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

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

});
Run Code Online (Sandbox Code Playgroud)

XSS函数弃用

此库中不再提供XSS功能.

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

  • 他们一个月前删除了xss支持. (19认同)

小智 5

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