2014-09-08 3 views
3

J'ai mis en cache le fragment de html, y compris la forme à mon avis.rendre dynamique csrf entrée cachée tout en utilisant le cache dans yii2

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

Problème avec le jeton de validation CSRF - il doit être dynamique (et non statique). Existe-t-il une autre/meilleure façon de le rendre sans le désactiver et de l'activer à nouveau?

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

Si je ne désactivez pas & activer CsrfValidation J'ai deux jetons en html - premier est de cache et la seconde est dynamique.

+0

vous n'avez pas à le faire. Avez-vous ajouté des balises meta csrf dans votre fichier layout.php principal? et mettre à jour votre compositeur fois – Kshitiz

+0

que j'ai fait tout mettre à jour. Si je ne fais pas cela, j'ai deux jetons _csrf cachés dans mon formulaire ... – emte

+0

vérifiez vos points de vue site login.php page. ils utilisent une forme active. Vérifiez combien de jetons csrf sont là. et laissez-moi savoir – Kshitiz

Répondre

1

Je venais juste de tomber sur ce même problème et finalement, après des heures de travail avec différentes choses, j'ai trouvé un moyen de le modifier avec jQuery.

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

Et puis se débarrasser de tous les trucs supplémentaires que vous avez là

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

Une autre façon:

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