CSURF Angular 实施

CSURF Angular Implementation

我一直在尝试对我一直在从事的个人项目进行 csurf 实施。我一直在到处搜索 google,试图弄清楚当我不使用像 Jade 或 EJS 这样的模板引擎时如何在表单上实现 csurf。我的 Express 服务器也不直接呈现页面,而是主要返回 JSON。我的所有前端都像这样被引用

app.use(express.static(__dirname + '/www'));

我使用 csurf 的服务器代码如下所示

app.use(csurf());

app.use(function (req, res, next) {
    res.cookie('XSRF-TOKEN', req.csrfToken());
  next();
});

在表单的前端,html 输入字段如下所示。我也在使用 AngularJS 并且根据我看到的示例,我应该做的就是这个。

<input type="hidden" name="_csrf" value="{{csrftoken}}">

我在终端中收到以下错误

Error: invalid csrf token

如果我检查隐藏的输入,这就是显示的内容。

<input type="hidden" name="_csrf" value="">

在您的控制器中,您需要将局部变量设置为等于 csrf cookie 的值

例如

.controller('YourCtrl', function($cookies, $scope) {
    $scope.csrftoken = $cookies._csrf
  }
);

要使该示例正常工作,您需要包含 ngCookies 模块,因此请在您的 index.html

中包含类似的内容
<script src="bower_components/angular-cookies/angular-cookies.js"></script>

然后将依赖项 'ngCookies' 添加到您的模块。

根据 $http documentation 的“跨站请求伪造 (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).

因此,您只需配置 csurf 模块即可使用该 cookie。像那样:

var csrf = require('csurf');
...
// Cookie / Session initialization etc
app.use(cookieParser());
...
// Important : csrf should be added after cookie and session initialization.
// Otherwise you will get 'Error: misconfigured csrf'
app.use(csrf());
app.use(function(req, res, next) {
  res.cookie('XSRF-TOKEN', req.csrfToken());
  next();
});
...

这样做,您不需要配置 AngularJS 内容和创建隐藏输入。