Cookies 为什么同一原产地政策不是';不足以防止CSRF攻击?
首先,我假设后端控制输入以防止XSS漏洞 在@Les Hazlewood中,解释如何在客户端保护JWT 假设所有通信均为100%TLS-无论是在通信期间还是在任何时候 登录后-通过basic使用用户名/密码进行身份验证 身份验证和在exchange中接收JWT是一个有效的用例。 这几乎就是OAuth 2的一个流程(“密码授予”) 作品 [……] 您只需设置授权标头:Cookies 为什么同一原产地政策不是';不足以防止CSRF攻击?,cookies,jwt,cross-domain,csrf,same-origin-policy,Cookies,Jwt,Cross Domain,Csrf,Same Origin Policy,首先,我假设后端控制输入以防止XSS漏洞 在@Les Hazlewood中,解释如何在客户端保护JWT 假设所有通信均为100%TLS-无论是在通信期间还是在任何时候 登录后-通过basic使用用户名/密码进行身份验证 身份验证和在exchange中接收JWT是一个有效的用例。 这几乎就是OAuth 2的一个流程(“密码授予”) 作品 [……] 您只需设置授权标头: Authorization: Bearer <JWT value here> 授权:持票人 但是,也就是说,如果您
Authorization: Bearer <JWT value here>
授权:持票人
但是,也就是说,如果您的REST客户端“不受信任”(例如。
启用JavaScript的浏览器),我甚至不会这样做:在
可通过JavaScript访问的HTTP响应-基本上是任何标头
值或响应体值-可通过
MITM XSS攻击
最好将JWT值存储在仅限http的安全cookie中
(cookie配置:setSecure(true)、setHttpOnly(true))。这保证了
浏览器将:
- 安全httpOnly cookie中的TLS+JWT+同源策略+无XSS漏洞
- 安全httpOnly cookie+源标头检查中的TLS+JWT没有XSS漏洞
http://compromised.com
通过发出这样的请求(从用户浏览器):
合法请求如下所示:
POST https://example.com/transfer-funds
fromAccountId: 1
toAccountId: 666
csrfToken: 249f3c20-649b-44de-9866-4ed72170d985
您可以通过要求外部站点无法读取的值(CSRF令牌)来实现这一点,即在HTML表单值或响应头中
关于Origin头,较旧的浏览器不支持它,Flash有一些漏洞可以让客户端更改它。基本上你会相信Adobe在未来不会把事情搞砸……这听起来是个好主意吗
确保每个HTTP请求都有CSRF保护
您只需要对具有副作用的请求(如更改状态或发送消息)提供CSRF保护
我对同一原产地政策和CORS的概念有误解,@Bergi、@Neil McGuigan和@SilverlightFox帮助我澄清了这一点
首先,@Bergi说了些什么
SOP不阻止发送请求。它确实会阻止页面 访问跨域请求的结果 这是一个重要的概念。我认为浏览器不会根据SOP限制向跨域发出请求,但这仅适用于Hossain先生在优秀教程中所称的“不那么简单的请求” 跨来源请求有两种类型:
- 简单请求
- “不那么简单的请求”(我刚编的一个词)
- HTTP方法匹配(区分大小写)以下内容之一:
- 头
- 得到
- 职位
- HTTP头匹配(不区分大小写):
- 接受
- 接受语言
- 内容语言
- 最后事件ID
- 内容类型,但仅当值为以下值之一时:
- 应用程序/x-www-form-urlencoded
- 多部分/表单数据
- 文本/纯文本
主持人:https://server.com
连接:保持活动状态
访问控制请求方式:POST
来源:https://evilsite.com
访问控制请求头:内容类型
接受:*/*
接受编码:gzip、deflate、sdch
接受语言:es,es;q=0.8
如果服务器响应,例如: 访问控制允许来源:
访问控制允许方法:获取、发布、放置
访问控制允许标题:内容类型
内容类型:text/html;字符集=utf-8
浏览器根本不会发出请求,因为 无法加载XMLHttpRequest。回应 飞行前需求
POST https://example.com/transfer-funds
fromAccountId: 1
toAccountId: 666
csrfToken: 249f3c20-649b-44de-9866-4ed72170d985