编程语言
首页 > 编程语言> > php – TYPO3 Extbase:CSRF-FormProtection在前端非管理员用户失败

php – TYPO3 Extbase:CSRF-FormProtection在前端非管理员用户失败

作者:互联网

我已经为我的自定义TYPO3扩展实现了CSRF保护(根据documentation),它非常适用于未经过身份验证的前端访问者以及后端管理员.我注意到一个奇怪的事情是,如果非管理员后端用户尝试在前端插件中使用表单,则会抛出错误:

PHP Catchable Fatal Error: Argument 1 passed to TYPO3\CMS\Core\FormProtection\FormProtectionFactory::getMessageClosure() must be an instance of TYPO3\CMS\Lang\LanguageService, null given

我使用TYPO3 V. 7.6.10和7.6.14测试.两个版本都会发生错误.

我看了一下FormProtectionFactory中的源代码,似乎$GLOBALS [‘Lang’]在FE中为admin用户初始化,但对于普通的后端用户来说是空的.在BE中,两个用户组都可以访问其他CSRF保护表单.

根据LanguageService的official reference,LanguageService通常仅在BE中可用:

This class is normally instantiated as the global variable $GLOBALS[‘LANG’] It’s only available in the backend and under certain circumstances in the frontend

有谁知道这些特定情况是什么?当然可以从BE注销并以未经身份验证的用户身份访问表单,但这显然非常烦人.我认为这是预期的行为,但我不明白为什么这个问题只发生在非管理员身上.也许有人有一个想法,如何使表格也可用于富裕的非管理员后端用户?

任何帮助都非常感谢.

谢谢!

为了完整起见,我调用了CSRF令牌生成器,但我认为’问题’在TYPO3本身(或者是预期的行为):

$this->view->assign("csrfToken", FormProtectionFactory::get()->generateToken($this->extensionName,
        $this->controllerContext->getRequest()->getControllerActionName(), $additionalObject));

解决方法:

TYPO3开发人员认为CSRF仅适用于已登录的用户,而这种情况并非如此,因此匿名用户的前端根本无法使用CSRF功能.

https://forge.typo3.org/issues/77403

标签:php,typo3,extbase
来源: https://codeday.me/bug/20190710/1428882.html