CSRF 是否可以使用 PUT 或 DELETE 方法?还是使用 PUT 或 DELETE 会阻止 CSRF?

最佳答案

好问题!

在一个完美的世界里,我想不出一种方法来执行 CSRF 攻击。

  • 不能使用 HTML 表单发出 PUT 或 DELETE 请求。
  • 图片、脚本标签、CSS 链接等都向服务器发送 GET 请求。
  • XmlHttpRequest 和 Flash/Silverlight/Applet 等浏览器插件会阻塞跨域请求。

  • 因此,一般来说,对支持 PUT/DELETE 动词的资源进行 CSRF 攻击是不可能的。

    也就是说,世界并不完美。可能有几种方法可以使这种攻击成为可能:
  • Rails 等 Web 框架支持“伪方法”。如果您放置一个名为 _method 的隐藏字段,将其值设置为 PUT 或 DELETE,然后提交 GET 或 POST 请求,它将覆盖 HTTP Verb。这是一种从浏览器表单支持 PUT 或 DELETE 的方法。如果您使用这样的框架,则必须使用标准技术
  • 保护自己免受 CSRF 的影响
  • 您可能不小心为服务器上的 CORS 设置了松散的响应 header 。这将允许任意网站发出 PUT 和 DELETE 请求。
  • 在某个时候,HTML5 计划在 HTML 表单中包含对 PUT 和 DELETE 的支持。但后来,他们取消了这种支持。不能保证以后不会添加它。某些浏览器实际上可能支持这些动词,这可能对您不利。
  • 某些浏览器插件中可能存在一个错误,可能允许攻击者发出 PUT/DELETE 请求。

  • 简而言之,我建议保护您的资源,即使它们只支持 PUT 和 DELETE 方法。

    关于security - CSRF 是否可以使用 PUT 或 DELETE 方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11833061/

    10-15 01:52