2014-09-08 1 views
3

내보기에서 양식을 포함하여 HTML 조각을 캐싱했습니다.yii2 캐시에서 동적 csrf 숨겨진 입력을 렌더링합니다.

<?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에서 두 개의 토큰을 가지고 - 최초의 캐시에서이고, 두 번째는 동적입니다.

+0

이 작업을 수행 할 필요가 없습니다. main.php 파일 레이아웃에 csrf 메타 태그를 추가 했습니까? 그리고 작곡가를 업데이트 할 때마다 – Kshitiz

+0

내가 모든 것을 업데이트했는지 확인하십시오. 내가하지 않으면 내 양식에 두 개의 숨겨진 _csrf 토큰이 있습니다 ... – emte

+0

view site login.php 페이지를 확인하십시오. 그들은 활성 양식을 사용하고 있습니다. 얼마나 많은 csrf 토큰이 있는지 확인하십시오. 알려주세요 – Kshitiz

답변

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() ?> 
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(); ?> 
관련 문제