我有一个部署在三台服务器上的应用程序。使用负载平衡器的请求被多路传输到服务器。问题是一台服务器生成CSRF令牌,该令牌在另一台服务器上进行验证,但验证失败。
CSRF是否应该像会话一样保存在DB中,以便在每个服务器上保持相同?
有人能解决这个问题吗?
感谢
是的,想法是将其存储在服务器的某个公共位置。
在我们的案例中,我们所有的服务器都使用一个memcache服务器进行会话存储,并且我们没有遇到任何关于CSRF令牌的问题。
此外,如果您正在使用PageCache,如果CSRF令牌也在缓存中,则可能会出现问题。为了避免缓存CSRF令牌,您可以在布局中使用renderDynamic
函数,如下所示:
<?= $this->renderDynamic(' return 'yii'helpers'Html::csrfMetaTags(); '); ?>