我们正在构建一个带有在JBoss中运行的Java Spring / Hibernate后端的应用程序。前端是AngularJS。
我们还没有做任何事情来在服务器端设置XSRF令牌。我们也不(无论如何)要求允许其他域访问我们的Web资源。
我想我会尝试查看我们的网站是否容易受到XSRF攻击,因此我设置了一个恶意网络应用程序,使用Angular的$ http.post()发布到我们的真实应用程序网址之一。我登录了真实应用程序,然后尝试从恶意应用程序发布。
在浏览器中,我收到了401响应并看到了错误:
XMLHttpRequest cannot load http://localhost:8080/user/delete. No
'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost:6543' is therefore not allowed access. The response
had HTTP status code 401.
服务器端未设置为在响应上设置Access-Control-Allow-Origin,因此出现上述错误。
所以我的问题是,是否只是从响应头中省略了Access-Control-Allow-Origin,足以防止XSRF攻击?
即使未设置Access-Control-Allow-Origin,我仍然可以在我的网站上进行XSRF攻击吗?如果是这样的话?我想演示这次攻击。
感谢。
答案 0 :(得分:5)
不,这还不够。即使浏览器出现'Access-Control-Allow-Origin'
错误,该请求仍由浏览器发出。如果攻击页面指定了withCredentials
:
$http.post(url, {withCredentials: true, ...})
然后,此请求将通过受害者的身份验证Cookie发送到您的域,这意味着对http://www.example.com:8080/user/delete
的请求将成功。
此外,也可以在没有使用标准HTML表单的XHR的情况下进行此请求:
<form method="post" action="http://www.example.com:8080/user/delete">
和JavaScript只会用于提交表单而不是自己提交请求。
保护系统免受CSRF攻击的一种简单方法是检查自定义标头,例如X-Requested-With
或Origin
标头。如果不启用CORS服务器端,则无法跨域发送X-Requested-With
。但是,Synchronizer Token Pattern仍然是CSRF预防的最强方法,因为这不会受到previous flaw in Flash等浏览器插件中的漏洞的影响,这些插件允许发送通常不可能的标头来自浏览器。