PHP Slim框架在每个连接上生成CSRF令牌
目前,我正在尝试建立一个以slim为后端,angularJS为fronend的网站。因此,我看了一些教程和演示项目。这是最有趣的一个: 开箱即用,我对CSRF的实现有一个问题。在本项目中,CSRF保护在中间件中实现,以便应用于每个连接。好与坏无关紧要。PHP Slim框架在每个连接上生成CSRF令牌,php,angularjs,csrf,slim,Php,Angularjs,Csrf,Slim,目前,我正在尝试建立一个以slim为后端,angularJS为fronend的网站。因此,我看了一些教程和演示项目。这是最有趣的一个: 开箱即用,我对CSRF的实现有一个问题。在本项目中,CSRF保护在中间件中实现,以便应用于每个连接。好与坏无关紧要。 但是,当我使用composer和npm安装所有依赖项时,项目工作得并不好,因为每个服务器连接都会获得一个新的CSRF令牌,该令牌将存储在PHP会话中 因此,在这个项目的主页上有一个角度表单,它将向服务器发送一个由csrf令牌保护的字符串。然后服务
但是,当我使用composer和npm安装所有依赖项时,项目工作得并不好,因为每个服务器连接都会获得一个新的CSRF令牌,该令牌将存储在PHP会话中 因此,在这个项目的主页上有一个角度表单,它将向服务器发送一个由csrf令牌保护的字符串。然后服务器只回复相同的字符串,角度控制器将其打印出来。当我第一次触发表单提交时,一切都会很好,但是在第二次提交时,服务器将响应错误400,因为他有一个angular还没有的新csrf令牌 但是这个示例项目的创建者不可能犯这样的错误,是吗?为什么我的apache会为同一用户的每个连接创建一个新的csrf令牌?我怎样才能解决这个问题呢 我的依赖项:
slim\slim v3.8.1版
slim\csrf v0.7.0
angular v1.6.4(路由、aria、材质、ui引导、cookie、http身份验证拦截器) 那么,如何为每个用户仅提供一个CSRF令牌呢?
或者,为了始终使用最新的CSRF令牌,我必须如何更新angular中的令牌发生器服务?还是我需要一个观察者?要检测到这一点?他们似乎正在使用它,幸运的是它有一个设置,可以在每次请求时禁用重新生成CSRF令牌。根据报告: 默认情况下,
Slim\Csrf\Guard
将在每个请求后生成一个新的名称/值对。这是一项重要的安全措施。然而,在许多情况下,这是不必要的,而且。例如,通过使用每会话请求,处理AJAX请求变得更加容易,而无需在每次请求后检索新的CSRF令牌(通过重新加载页面或发出单独的请求)
因此,在
/php/middleware.php
中,只需将第6个参数设置为true
,其余参数设置为null
。要查看其他5个选项的功能列表,您只需查看它们正在使用的。,幸运的是,它有一个设置,可以在每次请求时禁用重新生成CSRF令牌。根据报告:
默认情况下,Slim\Csrf\Guard
将在每个请求后生成一个新的名称/值对。这是一项重要的安全措施。然而,在许多情况下,这是不必要的,而且。例如,通过使用每会话请求,处理AJAX请求变得更加容易,而无需在每次请求后检索新的CSRF令牌(通过重新加载页面或发出单独的请求)
因此,在
/php/middleware.php
中,只需将第6个参数设置为true
,其余参数设置为null
。要查看其他5个选项的功能列表,您只需查看。我删除了Slim自己的CSRF软件包(Slim/CSRF),因为除了角度之外,还有几个问题。相反,我现在使用将在报头中传输的XSRF令牌。Angular可以很好地处理这个问题,而且完全是开箱即用。我删除了Slim自己的CSRF软件包(Slim/CSRF),因为除了Angular之外,它还有几个问题。
相反,我现在使用将在报头中传输的XSRF令牌。Angular可以很好地处理这个问题,而且完全是开箱即用。slim Angular的文档介绍了如何标记每个请求。请参阅。slim angular的文档解释了如何标记每个请求。看,我已经试过了。但是接下来是
$name=$request->getAttribute($container->csrf->getTokenNameKey())$value=$request->getAttribute($container->csrf->getTokenValueKey())代码>不输出任何CSRF键(仅null
)。还有一个问题,如果服务器由于错误连接而生成新令牌,angular不会检测到它。因此,主要的问题应该是:如何检测角度的CSRF标记变化?(那么,在每个连接上是否会有一个新的令牌,或者在一次攻击或错误的身份验证中是否只会有一个新的令牌,这并不重要。)我已经尝试过了。但是接下来是$name=$request->getAttribute($container->csrf->getTokenNameKey())$value=$request->getAttribute($container->csrf->getTokenValueKey())代码>不输出任何CSRF键(仅null
)。还有一个问题,如果服务器由于错误连接而生成新令牌,angular不会检测到它。因此,主要的问题应该是:如何检测角度的CSRF标记变化?(那么,在每个连接上是否会有一个新的令牌,或者在一次攻击或错误的身份验证中是否只会有一个新令牌并不重要。)