如何通过Twig模板在Silex 2中使用CSRF令牌?

时间:2017-05-18 11:08:58

标签: symfony twig csrf silex

我注册了 CsrfServiceProvider()

$app->register(new Silex\Provider\CsrfServiceProvider());

我的表格:

<form action="{{ url('some.action') }}" method="post">
  <input type="text" name="blah-blah" value="" placeholder="">
  <input type="hidden" name="_csrf_token" value="">{# how to output SCRF token here? #}
<button type="submit" class="btn btn-success">Submit</button>

感谢您的帮助!

解决方案(我对V-Light回答的解释)

控制器:

$app->get('/', function() use ($app) {
  $tokenId = 'intention';
  $csrf_token = $app['csrf.token_manager']->getToken($tokenId);

  return $app['twig']->render('home.twig', [
    'csrf_token' => $csrf_token,
  ]);
})->bind('home');

模板: <input type="hidden" name="_csrf_token" value="{{ csrf_token }}">

1 个答案:

答案 0 :(得分:3)

我假设您不使用symfony中的Forms(FormServiceProvide ins silex world),并且没有像

这样的表格枝条助手
<input type="hidden" name="_csrf_token" value="{{- csrf_token('intention') -}}">

但是无论如何首先尝试,也许我的假设是不正确的,而且它已经有效了:)

FormServiceProvider

尝试安装Forms for Silex

然后查看Usage documentaion-block of CSRF for Silex

  

注册CSRF服务提供商后,默认情况下,通过表单服务提供商创建的所有表单都将受到CSRF保护。

所以它非常自我解释;)你应该做的唯一事情 - 用FormServiceProvider创建表单(参见文档)并在twig中正确渲染它们,而不是自己编写普通的html。

但是...

  

即使不使用Symfony Form组件,您也可以使用CSRF保护。:

此时你可以创建自己的twig-helpers等等 只需使用

$tokenId = 'intention'; 
$csrf_token = $app['csrf.token_manager']->getToken($tokenId);

然后将$csrf_token变量传递给您的twig-view并以类似

的形式使用它

对于cource,检查给定/提交的令牌是否有效 - 每次您使用csrf-token提交表单时的工作(请参阅Silex的CSRF文档的使用部分)