Security CSRF是否可以使用PUT或DELETE方法?

Security CSRF是否可以使用PUT或DELETE方法?,security,csrf,Security,Csrf,CSRF是否可以使用PUT或DELETE方法?或者使用PUT或DELETE是否会阻止CSRF?否。依赖HTTP动词不是防止CSRF攻击的方法。这一切都取决于你的网站是如何创建的。你可以使用PUTs作为POST,DELETE作为GET,这并不重要 要防止CSRF,请采取以下步骤: 网站上有各种可用的CSRF对策: 在所有表单提交和副作用URL中都需要一个秘密的、特定于用户的令牌来防止CSRF;攻击者的站点无法放置 在其提交的文件中加入权利标记 要求客户端在用于执行任何安全操作的同一HTTP请求中

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

否。依赖HTTP动词不是防止CSRF攻击的方法。这一切都取决于你的网站是如何创建的。你可以使用PUTs作为POST,DELETE作为GET,这并不重要

要防止CSRF,请采取以下步骤:

网站上有各种可用的CSRF对策:

  • 在所有表单提交和副作用URL中都需要一个秘密的、特定于用户的令牌来防止CSRF;攻击者的站点无法放置
    在其提交的文件中加入权利标记
  • 要求客户端在用于执行任何安全操作的同一HTTP请求中提供身份验证数据 影响(资金转移等)
  • 限制会话Cookie的生存期检查HTTP Referer标头或(和)
  • 检查HTTP源标头[16]
  • 确保没有clientaccesspolicy.xml文件授予对Silverlight控件的意外访问权[17]
  • 确保没有crossdomain.xml文件授予对Flash电影的意外访问权[18]
  • 验证请求的标头是否包含X-Requested-With。RubyonRails(v2.0之前)和Django(v1.2.5之前)使用。 这种保护已被证明是不安全的[19] 浏览器插件和重定向可允许攻击者 为任何网站的请求提供自定义HTTP头,因此 允许伪造的请求

从理论上讲,这是不可能的,因为无法启动跨域PUT或DELETE请求(CORS除外,但这需要飞行前请求,因此需要目标站点的合作)。在实践中,我不会依赖这一点-许多系统都受到了攻击,例如,假设CSRF文件上传攻击不可能发生(不应该发生,但某些浏览器错误使其成为可能)。

好问题

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

  • 不能使用HTML表单发出PUT或DELETE请求
  • 图像、脚本标记、CSS链接等都向服务器发送GET请求
  • XmlHttpRequest和Flash/Silverlight/Applets等浏览器插件将阻止跨域请求
因此,一般来说,不可能对支持PUT/DELETE谓词的资源进行CSRF攻击

也就是说,世界并不完美。可能有几种方法可以使此类攻击成为可能:

  • Rails等Web框架支持“伪方法”。如果放置名为
    \u method
    的隐藏字段,将其值设置为put或DELETE,然后提交GET或POST请求,它将覆盖HTTP谓词。这是一种支持从浏览器表单中放置或删除的方法。如果您使用这样一个框架,那么您必须使用标准技术保护自己免受CSRF的影响

  • 您可能意外地在服务器上为CORS设置了lax响应头。这将允许任意网站发出PUT和DELETE请求

  • 在某种程度上,HTML5计划在HTML表单中包含对PUT和DELETE的支持。但后来,他们取消了这种支持。不能保证以后不会添加它。有些浏览器实际上可能支持这些动词,这可能对您不利

  • 某些浏览器插件中可能存在一个漏洞,使攻击者能够发出PUT/DELETE请求


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

    CSRF确实可以使用PUT和DELETE,具体取决于服务器的配置

    考虑CSRF最简单的方法是在浏览器中打开两个选项卡,一个对用户身份验证的应用程序打开,另一个对恶意网站打开


    如果恶意网站向您的应用程序发出javascript请求,浏览器将随请求一起发送标准cookie,从而允许恶意网站使用已验证的会话“伪造”请求。该网站可以做任何类型的请求,包括获取、放置、发布、删除等

    防范CSFR的标准方法是发送恶意网站无法知道的请求。这可以像一个cookie的内容一样简单。虽然来自恶意站点的请求将发送Cookie,但它实际上无法访问Cookie,因为它正由另一个域提供服务,并且浏览器安全性阻止它访问另一个域的Cookie

    将cookie内容称为“令牌”。您可以将令牌与请求一起发送,并在服务器上确保在继续请求之前已正确提供“令牌”

    下一个问题是,如何在所有不同的请求中发送该值,而DELETE特别困难,因为它不是为任何类型的负载而设计的。在我看来,最干净的方法是使用令牌指定请求头。类似这样的x-security-token=token。这样,您可以查看传入请求的头,并拒绝任何缺少令牌的请求

    在过去,标准ajax安全性限制了通过ajax在恶意服务器上执行的操作,但是,现在,该漏洞取决于您对服务器的访问控制配置的设置方式。有些人打开他们的服务器,以便更容易进行跨域调用或让用户创建自己的RESTful客户端等,但这也使得恶意站点更容易利用,除非采取了上述CSRF预防方法。

    是的,通过put和DELETE方法可以实现CSRF,但只有通过非限制性政策启用CORS

    我不同意