Security 如何修复HTTP协议规范中的CSRF?
为了防止跨站点请求伪造的危险案例,需要对HTTP协议规范和浏览器行为进行哪些更改 我不是在寻找关于如何修补我自己的web应用程序的建议。有数百万易受攻击的web应用程序和表单。更改HTTP和/或浏览器会更容易 如果您同意我的前提,请告诉我需要对HTTP和/或浏览器行为进行哪些更改。这不是一个寻找最佳答案的竞赛,我想收集所有的好答案Security 如何修复HTTP协议规范中的CSRF?,security,http,web,csrf,Security,Http,Web,Csrf,为了防止跨站点请求伪造的危险案例,需要对HTTP协议规范和浏览器行为进行哪些更改 我不是在寻找关于如何修补我自己的web应用程序的建议。有数百万易受攻击的web应用程序和表单。更改HTTP和/或浏览器会更容易 如果您同意我的前提,请告诉我需要对HTTP和/或浏览器行为进行哪些更改。这不是一个寻找最佳答案的竞赛,我想收集所有的好答案 请阅读并评论我下面“答案”中的要点。对表单提交位置强制执行相同来源政策。只允许将表单提交回其来源地 当然,这会破坏所有其他方面。如果你看一下,你会发现有一些方法可以通
请阅读并评论我下面“答案”中的要点。对表单提交位置强制执行相同来源政策。只允许将表单提交回其来源地 当然,这会破坏所有其他方面。如果你看一下,你会发现有一些方法可以通过依赖HTTP协议来防止CSRF。一个很好的例子是检查嵌入式设备上常用的,因为它不需要额外的内存
然而,这是一种薄弱的保护形式。客户端上的HTTP响应拆分等漏洞可能会影响referer值,这种情况已经发生。我同意另外两种说法;这可以在浏览器端完成,但不可能执行授权的跨站点请求。 无论如何,在应用程序端(甚至可能在Web服务器端,为了避免对已有的应用程序进行更改),可以很容易地添加CSRF保护层,如下所示:
- cookie被设置为随机值,只有服务器(当然还有接收cookie的客户端,但不是第三方服务器)知道该值
- 每个POST表单必须包含一个隐藏字段,其值必须与cookie相同。否则,必须阻止表单提交,并将403页返回给用户
- Cookie应声明为“本地”(默认)或“远程”
- 浏览器不得发送带有跨站点请求的“本地”cookie
- 浏览器决不能发送带有跨站点请求的http auth头
- 未经允许,浏览器不得发送跨站点帖子或GET?查询
- 未经许可,浏览器不得从远程页面发送LAN地址请求
- 浏览器必须报告和控制攻击,其中有许多跨站点请求
- 即使禁用了“Referer”,浏览器也应发送“Origin:(local | remote)”
- 其他常见的web安全问题(如XSHM)应该在HTTP规范中解决
- 需要新的HTTP协议版本1.2,以表明浏览器符合要求
- 浏览器应该自动更新以满足新的安全要求,或者警告用户
但由于这并不完全可能(见上文),应用程序有责任实现一个方案,允许区分真实请求和伪造请求。始终传播的CSRF令牌就是这样一种技术。当正确实施并防止其他攻击时(其中许多攻击也是由于现代技术的引入才可能发生的),它可以很好地工作。已经可以做到:
Referer
标题
这是一种较弱的保护形式。一些用户可能出于隐私目的禁用referer
,这意味着他们将无法在您的网站上提交此类表单。此外,这在代码中实现起来也很棘手。有些系统允许URL,如http://example.com?q=example.org
通过example.org
的推荐人检查。最后,您站点上的任何开放重定向漏洞都可能允许攻击者通过开放重定向发送其CSRF攻击,以获得正确的referer
头
原点
标题
这是一个新的标题。不幸的是,支持和不支持它的浏览器之间会出现不一致
其他标题
仅对于AJAX请求,添加不允许跨域的头(例如)可以用作CSRF预防方法。旧浏览器不会跨域发送XHR,而新浏览器将发送CORS预飞行,如果目标域明确不允许,则拒绝发出主请求。服务器端代码需要确保在收到请求时标头仍然存在。由于HTML表单不能添加自定义标题,因此此方法与它们不兼容。然而,这也意味着它可以防止攻击者在CSRF攻击中使用HTML表单
浏览器
浏览器,比如Chrome。虽然解释说它会