Problemas con CSRF formulario fileinput

Hola a todos,

Tengo un formulario que incluye un campo para subir archivo. El formulario se genera con ActiveForm. El token csrf esta presente en las etiquetas meta y dentro del formulario:

Cuando realizo un POST (a través de submitButton), la función “validateCsrfToken($clientSuppliedToken = null)” en yii2/web/Request.php retorna 0 y obtengo “bad request 400”.

Al revisar esta función, los valores de algunas de las variables y llamada a funciones son las siguientes:

$this->csrfParam es “_csrf”
$this->getBodyParam($this->csrfParam) es vacio
$this->getCsrfTokenFromHeader() es vacio

Esto ocurre solamente cuando hay un campo de tipo fileInput, si quito el campo del formulario el POST se realiza correctamente. Adicionalmente esto solamente ocurre en el servidor de desarrollo, en mi equipo local no tengo este error.

En el php.ini del servidor se ve que la variable session.use_strict_mode con valor igual a 0.

Agradezco cualquier ayuda que me ayude a encontrar el error.

Saludos desde Chile.

que libreria estas usando para subir archivos ?
tengo varios años utilizando File Input - © Kartik y me ha idos muy bien

Estoy trabajando con yii\web\UploadedFile, en mi equipo local funciona todo correctamente. Pero en el servidor no funciona.

Hola nuevamente,

Sigo intentando resolver el problema. Llegué a la conclusión de que el problema se debe a enctype=“multipart/form-data”, cuando esta opción esta habilitada obtengo una bad request 400 después de hacer POST, esto ocurre con o sin inputfile.

¿Que relación existe entre multipart/form-data y csrf?, el problema es que la validación csrf no ocurre si enctype es multipart/form-data.

en el formulario tienes q activar

    <?php $form = ActiveForm::begin(
        ['enableAjaxValidation' => true],['enctype'=>'multipart/form-data']
        ); ?>

Hola, gracias por la ayuda.

SOLUCIONADO.

No era un problema de Yii2, el problema estaba en la configuración post_max_size del php.ini del servidor. Se había definido post_max_size en unidades de “MB” en lugar de “M”, esto provocaba que el POST tuviera tamaño 0 y por lo tanto fallará la validación CSRF.

Saludos