Что опять с csrf?

есть представление

<?php use yii\helpers\Html;
    use yii\widgets\ActiveForm; ?>
    
    <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?>
    <?= $form->field($model, 'files')->fileInput(); ?>
        <div class="form-group">
            <?= Html::submitButton( Yii::t('app','CREATE'), [ 'btn btn-primary']) ?>
        </div>
    
    <?php ActiveForm::end(); ?>


которое рендерится в такую форму

<form id="w0" action="/admin/gods/parser" method="post" enctype="multipart/form-data">
      <input name="_csrf-backend" value="VUxobVRobngsYS8DbCAJNg8NBy5sDBpKeBUJLDMsXR5hYRw/LDoKAg==" type="hidden">
      <div class="form-group field-parser-files has-success">
         <label class="control-label" for="parser-files">Files</label>
         <input name="Parser[files]" value="" type="hidden">
         <input id="parser-files" name="Parser[files]" type="file">
         <div class="help-block"></div>
      </div>
      <div class="form-group">
          <button type="submit" 0="btn btn-primary">CREATE</button>
      </div>
    </form>


пытаюсь передать файл получаю

Bad Request (#400)

в дебагере $_POST, $_FILES пустые (я так понимаю из за csrf) вот такая кука

_backendIdentity 	'423f79f516d6a8d78865449ca435c5647a7789a03ba248969a67d16769573572a:2:{i:0;s:16:\"_backendIdentity\";i:1;s:46:\"[6,\"VzbzK9z_E91wc53eZcpgR3zpCircJXzm\",1209600]\";}'
    BACKENDSESSID 	'7ho5ksl3h1ruicmnpl4tum4df7'
    _frontendIdentity 	'46fb95bc6a4f9a13529776ffe76bff408d289e768e2b28bcd0a6bda37d76304ca:2:{i:0;s:17:\"_frontendIdentity\";i:1;s:46:\"[6,\"VzbzK9z_E91wc53eZcpgR3zpCircJXzm\",1209600]\";}'
    _csrf-backend 	'0103833d315b6d4786857f9eec26e1de752e73aaa8cfad01bd095e0628ce45c1a:2:{i:0;s:13:\"_csrf-backend\";i:1;s:32:\"y-Gn8HgNZAoC8dt2-YaAgD3f4-tRxRdz\";}'


а в Request Body все содержание файла. не подскажите что я делаю не так

вот контролер



public function actionParser()
        {
            $execelparser = new Parser();
    
            if ($execelparser->load(Yii::$app->request->post())) {
                $parsers = Yii::$app->request->post('Parsers');
                $execelparser->files = UploadedFile::getInstance($execelparser, 'files');
                $years = date('Y');
                $mounts = date('m');
                $path = 'files';
                $files_to = TransliteratorHelper::process($execelparser->files->name, '', 'en');
                if (file_exists(Yii::getAlias('@frontend/web/') . $path . '/' . $years . '/' . $mounts . '/')) {
                } else {
                    mkdir(Yii::getAlias('@frontend/web/') . $path . '/' . $years . '/' . $mounts . '/', 0777, true);
                }
                foreach ($execelparser->files as $file) {
                    $files_to = TransliteratorHelper::process($execelparser->files->name, '', 'en');
                    if ($execelparser->upload($path, $years, $mounts, $files_to)) {
                       $xmlParse= $execelparser->XMLparses(Yii::getAlias('@frontend/web/').$path.'/'.$years.'/'.$mounts.'/'.$files_to);
                    }
                }
    
                return var_dump($files_to);
            }else{
                return $this->render('parser',[
                    'model'     => $execelparser
                ]);
            }


вот модель

class Parser extends Model
    {
        public $files;
        public function rules()
        {
            return [
                [['files'], 'file', 'skipOnEmpty' => true, 'extensions' => 'xml, yml']
            ];
        }
  • Вопрос задан
  • 152 просмотра
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
При проблемах с csrf - появляется ошибка проверки данных (400), но при этом в дебагере post содержит все отправленное. Так как проверка csrf происходит после получения запроса. Так что если post пустой - скорее всего беда в сервере.
Или как вариант, у Вас есть js который ловит отправку формы и меняет post, до его отправки на сервер.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы