【问题标题】:render dynamic csrf hidden input while using cache in yii2在 yii2 中使用缓存时渲染动态 csrf 隐藏输入
【发布时间】:2014-11-01 15:15:51
【问题描述】:

我在我的视图中缓存了包括表单在内的 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() ?>

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

【问题讨论】:

  • 您不必这样做。您是否在布局 main.php 文件中添加了 csrf 元标记?并更新您的作曲家一次
  • 确定我确实更新了所有内容。如果我不这样做,我的表单中有两个隐藏的 _csrf 令牌......
  • 检查您的浏览站点 login.php 页面。他们正在使用主动形式。检查那里有多少个 csrf 令牌。让我知道
  • 只有一个。但这是因为它没有被缓存 - 问题只是缓存代码块中的重复令牌 - 因为令牌应该是动态的(不缓存)我必须做这个解决方法......

标签: php caching csrf yii2


【解决方案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() ?>

【讨论】:

    【解决方案2】:

    另一种方式:

    <?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(); ?>
    

    【讨论】:

      猜你喜欢
      • 2019-04-10
      • 1970-01-01
      • 2017-05-30
      • 2021-06-29
      • 2015-05-23
      • 2017-01-13
      • 2016-11-23
      • 1970-01-01
      相关资源
      最近更新 更多