security - 如何修复 HTTP 协议(protocol)规范中的 CSRF?

标签 security http web csrf

为了防止跨站点请求伪造的危险情况,需要对 HTTP 协议(protocol)规范和浏览器行为进行哪些更改?

我不是在寻找有关如何修补我自己的网络应用程序的建议。有数百万易受攻击的 Web 应用程序和表单。更改 HTTP 和/或浏览器会更容易。

如果您同意我的前提,请告诉我需要对 HTTP 和/或浏览器行为进行哪些更改。这不是寻找最佳单个答案的比赛,我想收集所有好的答案。

另请阅读下面我的“回答”中的要点并发表评论。

最佳答案

HTTP 规范的作者 Roy Fielding 不同意您的观点,即 CSRF 是 HTTP 中的一个缺陷,需要在那里修复。正如他在 reply in a thread named The HTTP Origin Header 中所写:

CSRF is not a security issue for the Web. A well-designed Web service should be capable of receiving requests directed by any host, by design, with appropriate authentication where needed. If browsers create a security issue because they allow scripts to automatically direct requests with stored security credentials onto third-party sites, without any user intervention/configuration, then the obvious fix is within the browser.

事实上,CSRF 攻击从一开始就可能使用纯 HTML。当今 JavaScript 和 CSS 等技术的引入只会引入更多的攻击向量和技术,使请求伪造更容易、更高效。

但这并没有改变这样一个事实,即来自客户端的合法且真实的请求不一定基于用户的意图。因为浏览器会始终自动发送请求(例如图像、样式表等)并发送任何身份验证凭据。

同样,CSRF 攻击发生在浏览器内部,因此唯一可能的修复方法是在浏览器内部修复它。

但由于这并非完全可行(见上文),应用程序有责任实现一种方案来区分真实请求和伪造请求。始终传播的 CSRF token 就是这样一种技术。如果实现得当并防止其他攻击(其中许多攻击只有在现代技术的引入下才有可能),它才能很好地发挥作用。

关于security - 如何修复 HTTP 协议(protocol)规范中的 CSRF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9799141/

相关文章:

java - 使用 Play Framework 上的按钮更改语言

security - GLassfish SSL 配置页面级别

简单的二进制(可执行)自检的跨平台方式

php - 对于我的 PHP Web 应用程序,数据库日志记录是否比文件日志记录更安全?

javascript - 发出 http 请求的访问控制 header 问题

node.js 从原始 http 请求字符串创建对象

php - 网站 Cookie - 是否存在任何安全问题?

http - JavaME Midlet 无法建立 HTTP 连接

c# - 使用 WebBrowser WPF 控件以编程方式填写一些 Web 表单

html - 资源在 Google Chrome 网络选项卡中显示待处理和来自缓存