当使用登录表单时,你应该确保你的应用免受CSRF(跨站请求伪造)攻击。Security组件已经内置了对CSRF的防御支持。在本文中,您将学习如何在登录表单使用它。
配置CSRF保护
首先,配置Security组件,它能够提供CSRF保护。这个Security组件需要一个 CSRF token provider。你可以把它设置为使用默认的表单组件。
1 2 3 4 5 6 7 8 |
# app/config/security.yml security: firewalls: secured_area: # ... form_login: # ... csrf_provider: form.csrf_provider |
Security组件还可以进一步配置,但是login表单的CSRF的所有信息都在这里了。
渲染CSRF字段
Security组件还需要检查CSRF token,你需要在login表单中添加一个CSRF token的hidden字段。默认情况下,这个字段的名称是 _csrf_token. 隐藏字段一定要包含CSRF token,这个值需要使用这个csrf_token 函数生成。那么当使用login表单时,一定要在这个函数中传人‘authenticate’,才能够最终生成登录的token id。
1 2 3 4 5 6 7 8 9 10 11 12 |
{# src/Acme/SecurityBundle/Resources/views/Security/login.html.twig #} {# ... #} <form action="{{ path('login_check') }}" method="post"> {# ... the login fields #} <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}" > <button type="submit">login</button> </form> |
在这之后,你就有能力保护你的表单免受CSRF攻击。
你还能够在你的配置文件里改变你的csrf字段名称,你需要设置csrf_parameter。那么改变token id 需要设置intention:
123456789 # app/config/security.ymlsecurity:firewalls:secured_area:# ...form_login:# ...csrf_parameter: _csrf_security_tokenintention: a_private_string