【问题标题】:PHP Slim framework generates CSRF Token on each connectionPHP Slim 框架在每个连接上生成 CSRF Token
【发布时间】:2018-02-08 19:00:11
【问题描述】:

目前我正在尝试构建一个以 slim 作为后端和 angularJS 作为前端的网站。因此,我查看了几个教程和演示项目。这是最有趣的一个:https://github.com/alexdebril/slim-angular

开箱即用我对 CSRF 实施有疑问。在这个项目中,CSRF 保护是在中间件中实现的,以便应用于每个连接。好与不好无关紧要。
但是当我使用 composer 和 npm 安装所有依赖项时,项目运行不佳,因为每个服务器连接都会获得一个新的 CSRF 令牌,该令牌将存储在 PHP 会话中。

所以在这个项目的主页上,有一个 Angular 表单,它将用 csrf 令牌保护的字符串发送到服务器。然后服务器只回复相同的字符串,角度控制器将其打印出来。当我第一次触发表单提交时,一切都会好起来的,但是在第二次提交时,服务器将响应错误 400,因为他有一个 angular 还没有的新 csrf 令牌。

但是这个示例项目的创建者不可能犯这样的错误,不是吗?为什么我的 apache 为与同一用户的每个连接创建一个新的 csrf 令牌?我该如何解决这个问题?

我的依赖:
超薄\超薄 v3.8.1
苗条\csrf v0.7.0
angular v1.6.4 (route, aria, material, ui-bootstrap, cookie, http-auth-interceptor)

那么我怎样才能为每个用户只拥有一个 CSRF 令牌呢?
或者我如何必须以角度更新标记器服务才能始终使用最新的 CSRF 令牌?还是我需要一个观察者?检测到这个?

【问题讨论】:

标签: php angularjs csrf slim


【解决方案1】:

看起来他们正在使用slim-csrf,幸运的是,它有一个设置来禁用在每个请求上重新生成 CSRF 令牌。根据GitHub readme

默认情况下,Slim\Csrf\Guard 将在每次请求后生成一个新的名称/值对。这是certain situations 的一项重要安全措施。但是,在许多情况下,这是不必要的,a single token throughout the user's session will suffice。例如,通过使用按会话请求,处理 AJAX 请求变得更容易,而无需在每次请求后检索新的 CSRF 令牌(通过重新加载页面或发出单独的请求)。

所以,在/php/middleware.php 中,只需将第 6 个参数设置为true,其余的保留为null。有关其他 5 个选项的功能列表,您可以查看source

【讨论】:

  • 我已经试过了。但随后$name = $request->getAttribute($container->csrf->getTokenNameKey());$value = $request->getAttribute($container->csrf->getTokenValueKey()); 不输出任何CSRF 密钥(仅null)。还有一个问题,如果服务器因为错误的连接而生成了一个新的令牌,那么 Angular 就不会检测到它。所以主要问题应该是:如何检测 CSRF 令牌的角度变化? (那么每个连接是否会有一个新的令牌,或者可能只有一个新的攻击或错误的身份验证令牌都没关系。)
【解决方案2】:

我删除了 Slim 自己的 CSRF 包 (slim/csrf),因为除了 angular 之外还有几个问题。
相反,我现在使用将在标头中传输的 XSRF 令牌。 Angular 可以很好地处理这个问题,并且完全开箱即用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 2011-10-12
    • 2017-07-23
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    相关资源
    最近更新 更多