CSURF 角度实现

Posted

技术标签:

【中文标题】CSURF 角度实现【英文标题】:CSURF Angular Implementation 【发布时间】:2015-03-10 17:11:34 【问题描述】:

我一直在尝试对我一直从事的个人项目进行 csurf 实现。当我不使用 Jade 或 EJS 等模板引擎时,我一直在到处搜索谷歌,试图弄清楚如何在表单上实现 csurf。我的快递服务器也不是直接呈现页面,而是主要返回 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="">

【问题讨论】:

这看起来是正确的。您看到的具体问题/错误是什么? 当您检查 dom 时,您是否真的看到了 value 属性的哈希集?粘贴结果会有很大帮助。 【参考方案1】:

根据$httpdocumentation 的“跨站请求伪造 (XSRF) 保护”部分:

在执行 XHR 请求时,$http 服务从 cookie 中读取一个令牌(默认为 XSRF-TOKEN)并将其设置为 HTTP 标头 (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 内容并创建隐藏输入。

【讨论】:

【参考方案2】:

在你的控制器中,你需要设置一个局部变量等于 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”添加到您的模块中。

【讨论】:

以上是关于CSURF 角度实现的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 有条件地使用 csurf 和 express 4

Node Express 和 csurf - 403(禁止)无效 csrf 令牌

如何使用 csurf 保护我的反应应用程序 api?

在nodejs(Express)中使用CSURF的“无效的csrf令牌”。CSRF令牌适用于第一个请求,但对所有其他请求都给出错误

js 实现图片旋转角度

物体旋转后缓慢停在指定角度的实现