【发布时间】:2015-07-13 04:40:09
【问题描述】:
我有一个 Express 应用程序,我想保护它免受 XSS 攻击。
我红了一些关于 XSS 的页面 - 包括 OWASP 的页面,并且鉴于我的应用程序特性,我决定编写一个中间件来编码 HTML 实体 - 更准确地说是 XML 实体,包括 <>"' - 我之前的请求参数我在路线中使用它们。
我还在连接时刷新会话 cookie,以防止 cookie 被盗。
我如何构建我的应用
- 所有 AJAX 请求都是 POST(所有参数由中间件重写)
- 我不使用 GET 参数
- 我使用的路由参数应该是 int,如果不是,我会引发错误。
- 唯一不来自用户输入的数据来自 OAuth 个人数据检索,当它们进入我的应用时,我也会对其进行清理
- 在页面加载时执行的客户端 JS 只涉及来自数据库的数据,假设在它们进入数据库时由中间件清理。
- window.location 使用安全
- 我还没有使用任何外部客户端 JS 库(如 JQuery 或 FileUpload) - 也许我稍后会在代码中添加它们
- 当用户输入内容时,它总是被发送到服务器(通过 AJAX POST)我借此机会发回经过清理的输入以在 JS 和/或 DOM 中使用它而不是初始输入
- 我不使用 eval
我的感觉
我的结论是,通过这种行为(在外部数据到来时对其进行清理),我避免了所有存储和反射的 XSS,并且正确使用 windows.location 可以防止我对抗基于 DOM 的 XSS。
这个结论是对的,还是我忘记了什么?我还应该使用一些helmet 功能吗?
编辑
我的问题不是最好的 HTML sanitizer 服务器端是什么(即使它是其中的一部分),我宁愿想知道我在代码中设置的保护措施是否能在全球范围内保护我的应用免受所有众所周知的 XSS 类型的攻击。特别是我会知道我的中间件是否不是一个坏习惯。
确实XSS filtering function in PHP 至少没有涵盖基于 DOM 的 XSS 攻击(因为它仅涵盖服务器端 HTML 清理)。
我列出了我的应用程序的一些特殊性,以便对我忘记的任何点或会使应用程序暴露于 XSS 漏洞的不良架构模式获得反馈。
编辑 2
我选择 Erlend 的答案是最好的,但是 msoliman 的答案也很出色,并且与 Erlend 的答案相辅相成。
【问题讨论】:
-
没错,它使用PHP而不是node.js,但它传达了基本思想。
标签: node.js express xss sanitize