如何实施CSRF保护
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.3,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
跨站请求伪造-是一种恶意用户试图让合法用户在不知情的情况下提交他们不打算提交的数据的方法。
CSRF保护的工作原理是在表单中添加一个隐藏字段,该字段包含只有您和用户知道的值。这确保提交给定数据的是用户(而不是其他实体)。
在使用CSRF保护之前,请将其安装到您的项目中:
1
$作曲家需要symfony/secuob娱乐下载rity-csrf
,启用/禁用CSRF保护csrf_protection
选项(请参阅CSRF配置参考欲知更多资料):
- YAML
- XML
- PHP
1 2 3 4
#配置/包/ framework.yaml框架:#……csrf_protection:~
用于CSRF保护的令牌对于每个用户都是不同的,它们存储在会话中。这就是为什么在呈现带有CSRF保护的表单时,会话就会自动启动。
此外,这意味着不能完全缓存包含受CSRF保护的表单的页面。作为替代,你可以:
- 将表单嵌入uncached对象中ESI片段并缓存余下的页面内容;
- 缓存整个页面,并通过非缓存AJAX请求加载表单;
- 缓存整个页面并使用hinclude.js使用非缓存AJAX请求加载CSRF令牌,并用它替换表单字段值。
默认情况下,Symfoob娱乐下载ny将CSRF令牌添加到一个名为_token
,但这可以在一个表单的基础上自定义:
12 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
作为字段的前缀(例如define{% block csrf_token_widget %}…{% endblock %}
自定义整个表单字段内容)。
_token
,但这可以在一个表单的基础上自定义:12 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
作为字段的前缀(例如define{% block csrf_token_widget %}…{% endblock %}
自定义整个表单字段内容)。安全用于保护不受CSRF攻击的登录表单。还可以配置注销操作的CSRF保护。
csrf_token()树枝函数在模板中生成一个CSRF令牌,并将其存储为一个隐藏的表单字段:
1 2 3 4 5 6
<形式行动="{{url('admin_post_delete', {id: post. delete')Id})}}"方法=“职位”>csrf_token()的参数是用于生成令牌的任意字符串#}<输入类型=“隐藏”的名字=“令牌”价值="{{csrf_token('delete-item')}}"/><按钮类型=“提交”>删除项目按钮>形式>
1 2 3 4 5 6
<形式行动="{{url('admin_post_delete', {id: post. delete')Id})}}"方法=“职位”>csrf_token()的参数是用于生成令牌的任意字符串#}<输入类型=“隐藏”的名字=“令牌”价值="{{csrf_token('delete-item')}}"/><按钮类型=“提交”>删除项目按钮>形式>
然后,在控制器动作中获取CSRF令牌的值并使用isCsrfTokenValid ()检查其有效性的方法:
12 3 4 5 6 7 8 9 10 11 12 13
使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;/ /……公共函数删除(请求$请求):响应{$submittedToken=$请求->请求->get (“令牌”);// 'delete-item'是模板中用来生成令牌的相同值如果($这->isCsrfTokenValid (“delete item”,$submittedToken)) {/ /……做一些事情,比如删除一个对象}}
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。