我能够从 2 个不同的应用程序发送跨源请求。虽然浏览器返回了 Cross-Origin 错误,但我的服务器仍在接收并执行请求。例如,从远程站点,我可以使用调用跨域请求,
$.ajax({
xhrFields: {
withCredentials: true
},
data:{ my: 'a' },
url: 'http://MyApp/Page',
type: 'POST'
})
我知道浏览器不会将响应返回给脚本,但我的服务器页面仍然执行。
假设一个无辜的用户登录了一个网站,http://abc.com 。该应用程序将接受插入记录的发布请求。当无辜用户访问无辜时http://HackerSite.com ,http://HackerSite.com将能够发送 POST 请求到 http://abc.com通过 Ajax 。如何避免这种情况?
最佳答案
您所说的漏洞是CSRF但可以防范。
您可以通过发送和检查 X-Requested-With: XMLHttpRequest
header 来防止 POST 在 AJAX 请求之外提交(例如通过 HTML 表单)。由于此 header 不在安全列表中(即没有 CORS),因此也无法通过 AJAX 跨域发送。
但是,过去有一些通过插件(例如 flash)进行的漏洞利用,其中可以设置通过浏览器无法实现的 header (例如 Referer
),因此为了防止这种情况,建议使用synchroniser token pattern其中涉及在隐藏字段中设置一个 token ,该 token 以及所有破坏性请求的 cookie 都会被验证。我所说的破坏性是指更改、提交或删除内容的请求(即应该是 POST 的内容)。
有关更多信息,请参见此处:http://www.html5rocks.com/en/tutorials/cors/
关于jquery - 如何阻止其他网站发送跨域ajax请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19566366/