缺少CSRF令牌,Ionic - AngularJS FullStack

时间:2016-03-01 00:13:51

标签: javascript angularjs express ionic-framework angular-fullstack

我有一个带有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

我不修改快速服务器的默认配置

3 个答案:

答案 0 :(得分:4)

似乎您忘记在<form></form>中添加用于在html中发布POST的csrf令牌。

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

关于跨站请求伪造(CSRF)的几句话:

  1. 如何进行CSRF攻击:
  2. 想象一下,我们有一个网站&#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提供保护,此请求将被授权,黑客将从中获取资金用户。

    1. 如何保护CSRF攻击(可能的解决方案之一):
    2. 你可以放两个秘密令牌:一个在cookie中,一个用于每个帖子网站请求。每次用户发帖请求时,服务器都应该比较这两个令牌。

      1. 为什么会这样?
      2. 现在,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;