我有一个带有AngularJS Full-Stack generator MEAN堆栈后端的项目和Ionic下的应用程序,当我尝试执行POST请求从Ionic应用程序登录时服务器说“缺少CSRF令牌” “
{"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
我不修改快速服务器的默认配置
答案 0 :(得分:4)
似乎您忘记在<form></form>
中添加用于在html中发布POST的csrf令牌。
在您的数据中,只有cookie中有CSRF令牌,您还需要在表单中使用CSRF令牌(或者在特殊的http请求头中,它取决于保护实现)。
关于跨站请求伪造(CSRF)的几句话:
想象一下,我们有一个网站&#34; hacker.example&#34;我们也知道另一个网站&#34; bank.example&#34;用钱运作。想象一下,bank.example
有一个POST方法/send-money
,可以将当前用户帐户的资金转到另一个帐户,其中receiver-account
参数和银行使用Cookie用于用户授权。
想象一下,来自银行的用户进入了黑客的网站并点击了将表单提交给bank.example/send-money
的按钮,其中包含黑客对receiver-account
参数的值。因此,浏览器会向bank.example网站发送此POST请求,其中包含bank.example(!)的Cookie,因此,如果银行没有对CSRF提供保护,此请求将被授权,黑客将从中获取资金用户。
你可以放两个秘密令牌:一个在cookie中,一个用于每个帖子网站请求。每次用户发帖请求时,服务器都应该比较这两个令牌。
现在,hacker.example
应该知道csrf令牌以发出适当的POST请求。黑客只有两种可能的选择:从bank.example
的cookie或从bank.example
的html代码中提取csrf令牌。
但由于安全政策,hacker.example
无法访问来自bank.example
的Cookie,hacker.example
无法获取html页面以从<form>
中提取csrf令牌{1}}因为CORS。
答案 1 :(得分:1)
如果您不想使用CSRF令牌,请禁用Lusca。
请参阅以下链接
https://github.com/angular-fullstack/generator-angular-fullstack/issues/1582
答案 2 :(得分:0)
虽然时间已晚,但我想回答,因为我遇到了同样的问题。 以下是问题的解决方案:
https://github.com/angular-fullstack/generator-angular-fullstack/pull/2613
&#34;当express.static()为index.html提供服务时,它会破坏中间件链并避免在/ request上设置CRSF,导致第一次登录失败,只要用户没有设置cookie。
我认为这涉及并可能修复#2224,#2511,#2611和krakenjs / lusca#95
这个提交基本上将_index.html重命名为app.template.html,这更具表现力,生成的文件将是app.html,避免了express.static()阻止中间件链,因为没有index.html了。因此,有效地调用routes.js:sendFile。
请注意,我尝试使用webpack试图寻找另一种解决方案,这是我能找到的最优雅的解决方案。&#34;