如何实现CSRF保护吗
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 5.2,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
跨站点请求伪造——是一个恶意用户的方法试图让你合法用户在不知情的情况下提交数据,他们不打算提交。
CSRF保护是通过表单添加一个隐藏字段,其中包含一个值,只有你和你的用户知道。这可以确保用户——而不是其他实体——提交给数据。
在使用CSRF保护之前,将其安装在您的项目:
1
美元作曲家需要symfony / seob娱乐下载curity-csrf
然后,启用/禁用CSRF保护的csrf_protection
选项(见CSRF配置参考更多信息):
- YAML
- XML
- PHP
1 2 3 4
#配置/包/ framework.yaml框架:#……csrf_protection:~
令牌用于CSRF保护是不同的每个用户存储在会话中。这就是为什么一个会话自动开始就呈现一种形式与CSRF保护。
此外,这意味着您不能完全缓存页面,包括CSRF保护形式。作为一种替代方法,您可以:
- 在一个未嵌入形式ESI片段和缓存页面的其余部分内容;
- 缓存整个页面加载形式通过一个未AJAX请求;
- 缓存整个页面和使用hinclude.jsCSRF令牌和一个未加载AJAX请求和替换表单字段的值。
默认情况下Symfonob娱乐下载y CSRF令牌在隐藏字段_token
,但这可以定制form-by-form基础上:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27
/ / src /形式/ TaskType.php名称空间应用程序\形式;/ /……使用应用程序\实体\任务;使用ob娱乐下载\组件\OptionsResolver\OptionsResolver;类TaskType扩展AbstractType{/ /……公共函数configureOptions(OptionsResolver美元解析器):无效{美元解析器- >setDefaults ([“data_class”= >任务::类,/ /启用/禁用CSRF保护这种形式“csrf_protection”= >真正的,/ /隐藏的HTML字段的名称存储令牌“csrf_field_name”= >“_token”,/ /任意字符串用于生成令牌的价值/ /使用不同的字符串形式提高其安全“csrf_token_id”= >“task_item”]);}/ /……}
您还可以自定义渲染CSRF表单字段创建一个自定义的形式的主题和使用csrf_token
字段(如定义的前缀{%块csrf_token_widget %}…{% endblock %}
定制整个表单字段内容)。
_token
,但这可以定制form-by-form基础上:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27
/ / src /形式/ TaskType.php名称空间应用程序\形式;/ /……使用应用程序\实体\任务;使用ob娱乐下载\组件\OptionsResolver\OptionsResolver;类TaskType扩展AbstractType{/ /……公共函数configureOptions(OptionsResolver美元解析器):无效{美元解析器- >setDefaults ([“data_class”= >任务::类,/ /启用/禁用CSRF保护这种形式“csrf_protection”= >真正的,/ /隐藏的HTML字段的名称存储令牌“csrf_field_name”= >“_token”,/ /任意字符串用于生成令牌的价值/ /使用不同的字符串形式提高其安全“csrf_token_id”= >“task_item”]);}/ /……}
csrf_token
字段(如定义的前缀{%块csrf_token_widget %}…{% endblock %}
定制整个表单字段内容)。如何构建一个登录表单吗为防止CSRF攻击一个登录表单。您还可以配置CSRF保护注销操作。
csrf_token()树枝函数模板中生成一个CSRF令牌并将其存储为一个隐藏的表单字段:
1 2 3 4 5 6
<形式行动=”{{url (admin_post_delete, {id:职位。id})}}”方法=“职位”>{# csrf_token的论点()是一个任意字符串用于生成令牌#}<输入类型=“隐藏”的名字=“令牌”价值=”{{csrf_token (delete item)}}”/ ><按钮类型=“提交”>删除项目< /按钮>< /形式>
1 2 3 4 5 6
<形式行动=”{{url (admin_post_delete, {id:职位。id})}}”方法=“职位”>{# csrf_token的论点()是一个任意字符串用于生成令牌#}<输入类型=“隐藏”的名字=“令牌”价值=”{{csrf_token (delete item)}}”/ ><按钮类型=“提交”>删除项目< /按钮>< /形式>
然后,CSRF令牌的值在控制器操作和使用isCsrfTokenValid ()检查它的有效性:
1 2 3 4 5 6 7 8 9 10 11 12 13
使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;/ /……公共函数删除(请求美元请求):响应{美元submittedToken=美元请求- >请求- >get (“令牌”);/ / delete item是相同的值中使用模板生成令牌如果(美元这- >isCsrfTokenValid (“delete item”,美元submittedToken)){/ /……做一些事情,像删除一个对象}}
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。