【发布时间】:2018-09-03 20:43:55
【问题描述】:
据我了解CSRF,这是一个非常简单的方案:
- 用户 (Bob) 在其浏览器中具有 MyApp.com 的身份验证 cookie。
- 攻击者向 Bob 发送电子邮件,其中包含指向 MyApp-Crack.com 网站的链接,其中带有魔术按钮“点击赢取 10.000 美元”,这是一个带有 action="myapp.com/user/delete 的简单隐藏表单的按钮="sumbit" -account.php" 方法="POST"
- 单击此按钮会使用 Bob 的身份验证 cookie 创建对 myapp.com/user/delete-account.php 的 POST 请求。
- 请求已通过身份验证并执行所需的操作。
想象一下 MyApp.com 是带有 RESTful 后端的纯 SPA,示例中的 url (myapp.com/user/delete-account.php) 是相当 RESTful API (myapp.com/API/delete-account.json) 并被调用仅来自浏览器 javascript(角度)或移动应用程序(使用 JWT)。
想法:如果我在 JavaScript 中的任何请求中添加特定标头:
headers.append('X-MyApp-Source', 'angular-app');
并添加服务器端检查:
if (user.AuthType == "cookies" && !request.Headers.Contains("X-MyApp-Source"))
{
return (400, "Bad request, missing source header");
}
攻击者有什么方法可以使用 Bob 的带有请求标头的 cookie 创建请求?
- MyApp.com 无法嵌入 iframe
X-Frame-Options - MyApp-Crack.com 上的隐藏 html 表单不会添加此标题
- 不同域上的javascript添加标头但不发送cookie
- 这不是真的。属性 XMLHttpRequest.withCredentials: true 将发送 cookie.
我并不是说我的想法是无懈可击的,只是 brianstorm。
谢谢!
【问题讨论】:
标签: angular .net-core csrf csrf-protection