2017-08-30 116 views
0

目前我正在尝试构建一个网站,它的后端和angularJS一样纤细。因此我看了几个教程和演示项目。这是最有趣的一个:https://github.com/alexdebril/slim-angularPHP Slim框架在每个连接上生成CSRF令牌

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

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

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

我的依赖关系:
苗条\苗条v3.8.1
苗条\ CSRF v0.7.0
角v1.6.4(路线,咏叹调,材质,UI的自举,饼干,HTTP-AUTH-拦截器)

那么我怎么能为每个用户只有一个CSRF令牌?
或者我如何在angular中更新tokenizer服务以便始终使用最新的CSRF令牌?或者我需要一个观察者?检测这个?

+0

slim-angular的文档解释了如何标记每个请求。参见[slim-angular Tokenizer Example](https://github.com/alexdebril/slim-angular#tokenizer)。 – georgeawg

回答

0

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

2

看来他们使用的是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

+0

我已经试过了。然后'$ name = $ request-> getAttribute($ container-> csrf-> getTokenNameKey()); $ value = $ request-> getAttribute($ container-> csrf-> getTokenValueKey());'不输出任何CSRF密钥(只有'null')。还有一个问题是,如果服务器由于连接错误而生成新的令牌,则角度不会检测到它。所以主要问题应该是:我如何检测角度上的CSRF令牌更改? (那么每个连接是否会有新的令牌,或者攻击或错误认证中可能只有新的令牌都无关紧要。) – christopher2007