防止在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, '&'). replace(/</g, '<'). // it's not neccessary to escape > replace(/"/g, '"'). replace(/'/g, '''); }
我最近通过chriso发现了节点validation器 。
例
get('/', function (req, res) { //Sanitize user input req.sanitize('textarea').xss(); // No longer supported req.sanitize('foo').toBoolean(); });
XSSfunction弃用
该库中不再提供XSSfunction。
你也可以看看ESAPI 。 有一个JavaScript版本的库 。 这非常坚固。
在更新版本的validator
模块中,您可以使用以下脚本来防止XSS攻击:
var validator = require('validator'); var escaped_string = validator.escape(someString);
试用npm模块strip-js
。 它执行以下操作:
- 消毒HTML
- 删除脚本标记
- 删除包含JavaScript代码的属性,如“onclick”,“onerror”等
- 删除包含JavaScript代码的“href”属性