如何为Symfony非登录页面添加CSRF令牌校验?
非登录页面的CSRF校验配置方案
首先明确:security.yaml中针对form_login的enable_csrf配置仅对登录表单生效,无法通过该配置为非登录页面统一开启CSRF校验,但你有多种实现方式可选,不止手动调用isCsrfTokenValid这一种:
利用Symfony表单组件自动处理
如果你是用Symfony官方的Form组件构建页面表单,组件默认会自动生成CSRF令牌并在提交时完成校验,无需额外编写校验代码,只要正常定义表单类并在控制器中使用即可。手动调用方法校验(自定义表单场景)
若你是自己手写的HTML表单(未使用Form组件),可以在控制器中手动获取并校验令牌:public function yourAction(Request $request) { $csrfToken = $request->request->get('_csrf_token'); // 第二个参数要和表单中生成令牌时的意图名称一致 if (!$this->isCsrfTokenValid('form_submit_intention', $csrfToken)) { throw new AccessDeniedException('无效的CSRF令牌'); } // 后续业务逻辑 }同时要在表单里通过Twig生成令牌字段:
<input type="hidden" name="_csrf_token" value="{{ csrf_token('form_submit_intention') }}">全局事件监听实现批量校验
如果需要给多个非登录路由统一添加CSRF校验,可以通过订阅KernelEvents::REQUEST事件,编写监听器对指定路由进行令牌校验,避免在每个控制器中重复写校验代码。
内容的提问来源于stack exchange,提问作者Hevyweb
相关产品推荐
相关产品推荐

