在yii2中使用缓存时渲染动态csrf隐藏输入

时间:2014-09-08 11:51:41

标签: php caching csrf yii2

我在我的视图中缓存了包含表单的html片段。

<?php $form = ActiveForm::begin(); ?>
  <?php echo $form->field($model, 'name'); ?>
  <?= Html::submitButton('Save') ?>
<?php ActiveForm::end() ?>

问题在于CSRF验证令牌 - 它应该是动态的(不是静态的)。有没有其他/更好的方法如何渲染它而不再禁用和再次启用它?

 <?php Yii::$app->request->enableCsrfValidation = false; ?>
 <?php $form = ActiveForm::begin(); ?>
 <?php Yii::$app->request->enableCsrfValidation = true; ?>
    <input type="hidden" name="_csrf" value="<?php echo $this->renderDynamic('return Yii::$app->request->csrfToken;'); ?>">
    <?php echo $form->field($model, 'name'); ?>
    <?= Html::submitButton('Save') ?>
<?php ActiveForm::end() ?>

如果我不禁用&amp;启用CsrfValidation我在html中有两个令牌 - 第一个来自缓存,第二个是动态的。

2 个答案:

答案 0 :(得分:1)

我刚刚遇到同样的问题,最后经过几个小时的不同处理后,我想出了一种用jQuery修改它的方法。

$this->registerJs("$(document).ready(function(){
    $('input[name=_csrf]').val('".$this->renderDynamic('return Yii::$app->request->csrfToken;')."');
});", View::POS_END);

然后摆脱你在那里的所有额外的东西

<?php $form = ActiveForm::begin(); ?>
    <?php echo $form->field($model, 'name'); ?>
    <?= Html::submitButton('Save') ?>
<?php ActiveForm::end() ?>

答案 1 :(得分:0)

另一种方式:

<?php $form = ActiveForm::begin(['options' => ['csrf' => false]]); ?>

<input type="hidden" name="<?= $this->renderDynamic('return Yii::$app->request->csrfParam;'); ?>" value="<?= $this->renderDynamic('return Yii::$app->request->csrfToken;'); ?>" />

<?php ActiveForm::end(); ?>