如何实施CSRF保护
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.1,现已不再维护。
读本页的更新版本用于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令牌,并用它替换表单字段值。
如何建立登入表格用于保护不受CSRF攻击的登录表单。
尽管Symfonyob娱乐下载 Forms默认情况下提供自动CSRF保护,但您可能需要手动生成和检查CSRF令牌,例如当使用不受Symfony Form组件管理的常规HTML表单时。
考虑创建一个允许删除项的简单HTML表单。首先,使用csrf_token()树枝函数在模板中生成一个CSRF令牌,并将其存储为一个隐藏的表单字段:
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
使用ob娱乐下载\组件\HttpFoundation\请求;/ /……公共函数删除(请求$请求){$submittedToken=$请求->请求->get (“令牌”);// 'delete-item'是模板中用来生成令牌的相同值如果($这->isCsrfTokenValid (“delete item”,$submittedToken)) {/ /……做一些事情,比如删除一个对象}}
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。