答案是:一般情况下,没有任何办法可以模拟PUT和DELETE方法实现CSRF。
不能使用HTML表单进行PUT或DELETE请求。
图像,脚本标签,CSS链接等都发送GET请求到服务器。
XmlHttpRequest和浏览器插件(如Flash / Silverlight / Applets)将阻止跨域请求。
因此,一般来说,不可能对支持PUT / DELETE动词的资源进行CSRF攻击。
这就是说,世界并不完美。可能有几种方式可以使这种攻击成为可能:
1.Web框架(如Rails)支持“伪方法”。如果把一个名为_method
的隐藏字段设置为PUT或DELETE,然后提交GET或POST请求,它将覆盖HTTP动词。这是一种从浏览器表单中支持PUT或DELETE的方法。如果正在使用这样的框架,你将不得不使用标准技术来保护CSRF
例如:可以用另外一种重写方法来测试一下,我们在POST方法后加上_method=PUT试试看:
2.可能会意外地在您的服务器上设置了CORS的松散响应标头。这将允许任意网站做PUT和DELETE请求。
3.在某些时候,HTML5已经计划在HTML表单中包含对PUT和DELETE的支持。但后来,他们取消了这种支持。不能保证以后不会添加。有些浏览器可能实际上支持这些动词,这可能会对你有用。
4.某些浏览器插件中可能只是存在一个漏洞,可能允许攻击者发出PUT / DELETE请求。