【发布时间】:2016-02-14 02:08:30
【问题描述】:
我正在开发一个带有 Laravel 后端的 AngularJS webapp。
我想通过跨域请求启用 CSRF 保护。有可能吗?
“跨站点请求伪造”中的$http reference 表示“不会为跨域请求设置标头”
查看开发人员工具日志,我看到在 $http.post 调用后发送了预检请求(选项动词)并且它设置了 XSRF-TOKEN cookie,但是 POST 请求没有 cookie,所以我不能这样做:
$http.defaults.headers.post['X-CSRFToken'] = $cookies['XSRF-TOKEN'];
有什么想法吗?
更新:
@zeroflagL:我试过了
$http.defaults.headers.common.xsrfCookieName = 'XSRF-TOKEN';
$http.defaults.headers.common.xsrfHeaderName = 'X-XSRF-TOKEN';
现在我在 POST 的请求标头中:
xsrfCookieName:XSRF-TOKEN
xsrfHeaderName:X-XSRF-TOKEN
但是 CSRF 检查没有通过(服务器上的 TokenMismatchException)。 我想在请求标头中应该有 XSRF-TOKEN 可以工作...
【问题讨论】:
-
您是否按照文档中的说明设置了
xsrfHeaderName和xsrfCookieName? -
@zeroflagL:我试过没有成功,更新了我的帖子
-
删除
headers.common.只是$http.defaults.xsrf...。 -
$http.defaults.headers.common.xsrf...应该是正确的,如果我使用您的表单,则 POST 请求标头中没有设置任何内容。顺便说一句,这并不能解决问题 -
示例:您有一个网站
http://myweb.com。用户已登录。用户在另一个选项卡中打开站点http://evil.com。该邪恶网站嵌入了一个 URL 为http://myweb.com/transferMoney的图像标签。因为用户仍处于登录状态,所以会话 id 已发送,从服务器的角度来看,请求似乎没问题。如果客户端在http://anotherweb.com上运行并向http://myweb.com发出跨站点请求,则XSRF 不是问题,因为该请求似乎并非来自您的站点。
标签: angularjs ajax laravel cross-domain csrf