gpt4 book ai didi

angularjs - 带有 AngularJS 和 Express 的错误 CSRF token

转载 作者:行者123 更新时间:2023-12-04 22:11:59 26 4
gpt4 key购买 nike

我想在使用 MEAN 堆栈的应用程序中添加 CSRF 保护。

我尝试了某人已经给出的答案:CSRF Protection in ExpressJS

但它是针对较旧的 express 版本,所以我做了一些更改:

app.use(cookieParser(config.cookieSecret, { httpOnly: true }));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({ secret: config.sessionSecret, resave: false, saveUninitialized: true }));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
app.use(csrf({value: function(req) {
var token = (req.body && req.body._csrf)
|| (req.query && req.query._csrf)
|| (req.headers['x-csrf-token'])
|| (req.headers['x-xsrf-token']);
return token;
}
}));
app.use(function(req, res, next) {
res.cookie('XSRF-TOKEN', req.csrfToken());
next();
});

我可以看到名为 XSRF-TOKEN 的 token 在我的应用程序中生成良好(使用 Chrome 检查)。

但是当我发布一个表单(Angular 前端)时,我有一个关于 token 的错误:
{"message":"invalid csrf token","error":{"expose":true,"code":"EBADCSRFTOKEN","statusCode":403,"status":403}}
我错过了什么 ?我想知道 req.csrfToken() 是否生成了 Angular 给出的好标记...

编辑:

我只是看到 XSRF-TOKEN 被 AngularJS 用于 $http 请求 。所以我想我必须在我的表单中添加一个隐藏的输入以使用 csrf 值发布,由 Express 检查,但是如何?

最佳答案

最后,我能够发送良好的代币值(value)。这是完整的答案。

AngularJS 在使用 $http 服务发出的请求期间使用 CSRF 保护(Angular 称为 XSRF)。

When performing XHR requests, the $http service reads a token from a cookie (by default, XSRF-TOKEN) and sets it as an HTTP header (X-XSRF-TOKEN). Since only JavaScript that runs on your domain could read the cookie, your server can be assured that the XHR came from JavaScript running on your domain. The header will not be set for cross-domain requests.



有很多帖子解释了如何使用 ExpressJS 3.xx 发送 XSRF-TOKEN,但有些事情随着 4.xx 版本 发生变化。 Connect 中间件不再包含在内。 Express 使用自己的中间件: cookie-parserbody-parserexpress-sessioncsurf

1 - 发送 XSRF-TOKEN cookie

第一步是发送cookie,从后端到前端(Express to Angular):
var express         = require('express');
var app = express();
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
var config = require('./lib/config'); //config.js file with hard-coded options.
var csrf = require('csurf');

app.use(cookieParser(config.cookieSecret, { httpOnly: true }));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({
name: 'sessionID',
secret: config.sessionSecret,
cookie: {
path: '/',
httpOnly: true,
secure: false,
maxAge: 3600000
},
rolling: true,
resave: false,
saveUninitialized: true
}));
app.use(csrf());
app.use(function(req, res, next) {
res.cookie('XSRF-TOKEN', req.csrfToken());
next();
});

现在,Angular 能够在 $http 请求期间设置其 HTTP header (X-XSRF-TOKEN)。例子 :
<body ng-app="testApp">
<div ng-controller="LoginCtrl">
<form role="form" ng-submit="login()" >
<input type="email" ng-model="user.email" />
<input type="password" ng-model="user.password" />
<input type="submit" value="Log In" />
</form>
<p style="color:red">{{loginMsg}}</p>
</div>
</body>

<script>
var app = angular.module('testApp', ['ngResource']);
app.controller('LoginCtrl', function ($scope, $http) {
$scope.user = {};
$scope.loginMsg = '';
$scope.login = function () {
$http.post('/login', $scope.user).success(function () {
$window.location.href='/profile';
}).error(function () {
$scope.loginMsg = 'Wrong credentials, try again.';
});
};
});
</script>

2 - 以非 Angular 形式添加 _csrf 输入

那是我的问题,我不知道如何添加此输入。最后,我创建了一个名为 $csrf 的新 Angular 服务:
    app.factory('$csrf', function () {
var cookies = document.cookie.split('; ');
for (var i=0; i<cookies.length; i++) {
var cookie = cookies[i].split('=');
if(cookie[0].indexOf('XSRF-TOKEN') > -1) {
return cookie[1];
}
}
return 'none';
});

我在 Plunker 上做了一个例子: http://plnkr.co/edit/G8oD0dDJQmjWaa6D0x3u

希望我的回答会有所帮助。

关于angularjs - 带有 AngularJS 和 Express 的错误 CSRF token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27390547/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com