【发布时间】:2016-01-20 13:32:32
【问题描述】:
首先,我假设有一个控制输入以防止 XSS 漏洞的后端。
在this answer@Les Hazlewood 中解释如何在客户端保护 JWT。
假设所有通信都使用 100% TLS - 无论是在期间还是任何时候 登录后 - 通过基本用户名/密码进行身份验证 身份验证和接收 JWT 作为交换是一个有效的用例。 这几乎就是 OAuth 2 的流程之一(“密码授予”) 作品。 [...]
您只需设置授权标头:
Authorization: Bearer <JWT value here>但是,话虽如此,如果您的 REST 客户端“不受信任”(例如 启用 JavaScript 的浏览器),我什至不会这样做: 可通过 JavaScript 访问的 HTTP 响应 - 基本上是任何标头 值或响应体值 - 可以通过嗅探和拦截 MITM XSS 攻击。
最好将 JWT 值存储在仅安全、仅 http 的 cookie 中 (cookie 配置:setSecure(true)、setHttpOnly(true))。这保证 浏览器将:
- 仅通过 TLS 连接传输 cookie,并且,
- 永远不要让 cookie 值可用于 JavaScript 代码。
这种方法几乎是最佳实践所需要做的一切 安全。 最后一件事是确保你有 CSRF 保护 每个 HTTP 请求,以确保外部域发起请求 到您的网站无法运行。
执行此操作的最简单方法是设置仅安全(但不是仅 http) 具有随机值的 cookie,例如一个 UUID。
我不明白为什么我们需要具有随机值的 cookie 来确保向您的站点发起请求的外部域无法运行。同源政策不是免费的吗?
来自OWASP:
检查源头
Origin HTTP 标头标准是作为一种方法引入的 防御 CSRF 和其他跨域攻击。不像 referer,来源将出现在发起的 HTTP 请求中 来自 HTTPS 网址。
如果存在原始标头,则应检查它 一致性。
我知道 OWASP 本身的一般建议是同步器令牌模式,但我看不出还有哪些漏洞:
- TLS + JWT 在安全的 httpOnly cookie + 同源策略 + 无 XSS 漏洞。
更新 1: 同源策略只适用于XMLHTTPRequest,所以一个邪恶的网站可以很容易地发出表单POST请求,这会破坏我的安全。需要显式的源头检查。等式是:
- TLS + JWT 在安全的 httpOnly cookie + Origin Header check + 没有 XSS 漏洞。
【问题讨论】:
-
SOP 不会阻止发送请求。它确实会阻止页面访问结果的跨域请求。
-
@Bergi 在后端包含一个显式控件来检查原始标头怎么样?如果检查失败,我会立即返回错误状态码。
标签: cookies jwt cross-domain csrf same-origin-policy