3

我有一个MEAN堆栈上的后端项目,开始于AngularJS Full-Stack generator和Ionic下的应用程序,当我尝试执行POST请求以从Ionic应用程序执行登录时,服务器说“CSRF令牌丢失”CSRF令牌丢失,Ionic - AngularJS FullStack

{"error":{"message":"CSRF token missing","stack":"Error: CSRF token missing\n at checkCsrf (/Volumes/Data/Dev/carry/back/node_modules/lusca/lib/csrf.js:89:18)\n at /Volumes/Data/Dev/carry/back/node_modules/lusca/index.js:48:21\n at hsts (/Volumes/Data/Dev/carry/back/node_modules/lusca/lib/hsts.js:25:9)\n at /Volumes/Data/Dev/carry/back/node_modules/lusca/index.js:48:21\n at xframe (/Volumes/Data/Dev/carry/back/node_modules/lusca/lib/xframes.js:12:9)\n at /Volumes/Data/Dev/carry/back/node_modules/lusca/index.js:48:21\n at xssProtection (/Volumes/Data/Dev/carry/back/node_modules/lusca/lib/xssprotection.js:16:9)\n at /Volumes/Data/Dev/carry/back/node_modules/lusca/index.js:48:21\n at lusca (/Volumes/Data/Dev/carry/back/node_modules/lusca/index.js:53:9)\n at Layer.handle [as handle_request] (/Volumes/Data/Dev/carry/back/node_modules/express/lib/router/layer.js:95:5)\n at trim_prefix (/Volumes/Data/Dev/carry/back/node_modules/express/lib/router/index.js:312:13)\n at /Volumes/Data/Dev/carry/back/node_modules/express/lib/router/index.js:280:7\n at Function.process_params (/Volumes/Data/Dev/carry/back/node_modules/express/lib/router/index.js:330:12)\n at next (/Volumes/Data/Dev/carry/back/node_modules/express/lib/router/index.js:271:10)\n at /Volumes/Data/Dev/carry/back/node_modules/express-session/index.js:432:7\n at /Volumes/Data/Dev/carry/back/node_modules/connect-mongo/lib/connect-mongo.js:305:11\n at handleCallback (/Volumes/Data/Dev/carry/back/node_modules/mongoose/node_modules/mongodb/lib/utils.js:96:12)\n at /Volumes/Data/Dev/carry/back/node_modules/mongoose/node_modules/mongodb/lib/collection.js:1341:5\n at handleCallback (/Volumes/Data/Dev/carry/back/node_modules/mongoose/node_modules/mongodb/lib/utils.js:96:12)\n at /Volumes/Data/Dev/carry/back/node_modules/mongoose/node_modules/mongodb/lib/cursor.js:670:5\n at handleCallback (/Volumes/Data/Dev/carry/back/node_modules/mongoose/node_modules/mongodb-core/lib/cursor.js:154:5)\n at nextFunction (/Volumes/Data/Dev/carry/back/node_modules/mongoose/node_modules/mongodb-core/lib/cursor.js:675:5)"}} 

尽管它已经作为出现在请求发送令牌和其它数据

POST /auth/local HTTP/1.1 
Host: 192.168.1.13:9000 
Connection: keep-alive 
Content-Length: 47 
Accept: application/json, text/plain, */* 
X-DevTools-Emulate-Network-Conditions-Client-Id: 552547EB-CA80-4AF8-8392-DDE2A9D833A4 
Origin: file:// 
User-Agent: Mozilla/5.0 (Linux; Android 5.1.1; E5803 Build/32.0.A.4.11; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/48.0.2564.106 Mobile Safari/537.36 
Content-Type: application/json;charset=UTF-8 
Accept-Encoding: gzip, deflate 
Accept-Language: en-US 
Cookie: connect.sid=s%3AKpTipuTW9UAqmbx_X__fuDrfGxXiGRpF.%2FKf2gm3y%2F0VwBzUygchh7%2BVfi6PLoQZhOfI5T22XlxY; XSRF-TOKEN=iZvZ2wKb3VafJb9ZGqily3pBY3nGI9gVBQaww%3D 
X-Requested-With: com.todomicilio.app 

我不要修改Express服务器的默认配置

回答

4

似乎您忘记在<form></form>中添加用于在HTML中进行POST的csrf标记。

在您的数据中只有Cookie中有CSRF令牌,您还需要在表单中(或者在特殊的http请求头中,这取决于保护实现)具有CSRF令牌。

关于跨站请求伪造一对夫妇的话(CSRF):

  1. 如何使CSRF攻击:

假设我们有一个网站 “hacker.example”,也我们知道另一个网站“bank.example”,用钱操作。想象一下,bank.example有一个POST方法/send-money将钱从当前用户帐户发送到另一个帐户receiver-account参数和银行使用cookie用于用户授权。

想象一下,来自银行的用户进入黑客的网站并点击提交表单到bank.example/send-money的按钮,黑客的值为receiver-account参数。因此,浏览器会将此POST请求发送到bank.example网站,其中包含bank.example(!)的Cookie,因此,如果银行没有CSRF保护,则该请求将被授权,黑客将从该用户那里获得一笔钱。

  • 如何保护CSRF攻击(可能的解决方案之一):
  • 你可以放两个秘密凭证:一个在cookie,并为每个POST请求的网站。每次用户发出请求时,服务器应该比较这两个令牌。

    1. 它为什么会起作用?

    现在,hacker.example应该知道csrf令牌来发出适当的POST请求。黑客只有两种可能的选项来获取它:从bank.example的cookie中提取或从bank.example的html代码中提取csrf令牌。

    hacker.example用不上从bank.example因为安全策略和hacker.example的饼干不能得到html页面从<form>bank.example因为CORS提取CSRF令牌。

    +0

    很NICE的解释! – vinesh

    0

    虽然这是有点晚了,但我想回答,因为我面临同样的问题。 这里是解决问题:

    https://github.com/angular-fullstack/generator-angular-fullstack/pull/2613

    “当express.static()被服务的index.html它打破了中间件链和避免了CRSF被设置/请求,引起第一次登录到失败,只要用户没有设置cookies。

    我觉得这涉及并可能修复#2224,#2511,#2611和krakenjs/lusca#95

    这基本上犯重命名_index.html到app.template。 html更具表现力,生成的文件将是app.html,避免expr ess.static()阻止中间件链,因为没有index.html了。因此routes.js:sendFile被有效地调用。

    注意,我试着和周围有很多玩的WebPack试图寻找另一种解决方案,这是最优雅的一个我能找到。”

    相关问题