example detail columns yii csrf yii2 csrf-protection

example - yii2 detail view columns



Yii2 ¿Cómo crear correctamente una columna de casilla de verificación en gridview para acciones masivas? (2)

Bueno, antes que nada, no hagas lo que haces. Como dijiste, está abierto para CRSF. Use POST y no GET para llevar los valores a su controlador. El enlace y la respuesta de arogachev podrían indicarle cómo hacer eso, creo. 1 cosa adicional con el CRSF, puede obtener el CRSF de la página de yii, eche un vistazo aquí Obteniendo una mala solicitud (# 400) en las llamadas Ajax usando Yii 2 pero no en la respuesta aceptada (que es la mía :)) sino a el otro.

Necesito crear "acciones masivas" similares a la administración de publicaciones de wordpress, por lo que puede, por ejemplo, eliminar múltiples registros a la vez.

Este es mi enfoque, y funciona bien, pero estoy seguro de que no es el mejor enfoque, ya que este método es vulnerable a los ataques de CSRF.

Columna de casilla de verificación en una vista de cuadrícula

GridView::widget([ ''dataProvider'' => $dataProvider, ''columns'' => [ [''class'' => ''yii/grid/CheckboxColumn''], ''id''=>''grid'', ''country'', ], ]);

Botón que dispara una función

<a href="#" onclick="bulkAction(''p'');">

La función:

<script> function bulkAction(a) { var keys = $(''#grid'').yiiGridView(''getSelectedRows''); window.location.href=''<?php echo Url::to([''mycontroller/bulk'']); ?>&action=''+a+''&ids=''+keys.join(); } </script>

Esta función crea una url como esta:

index.php?r=mycontroller/bulk&action=1&ids=2,6,7,8

PROBLEMA ES Este enfoque es vulnerable a los piratas CSRF (explicado aquí: http://blog.codinghorror.com/cross-site-request-forgeries-and-you/ )

Entonces, ¿cuál es la forma CORRECTA de hacerlo?


Lo resolví yo así:

De esta forma, el formulario queda protegido de CSRF y todo va en una solicitud POST.

Esta es la vista:

<?=Html::beginForm([''controller/bulk''],''post'');?> <?=Html::dropDownList(''action'','''',[''''=>''Mark selected as: '',''c''=>''Confirmed'',''nc''=>''No Confirmed''],[''class''=>''dropdown'',])?> <?=Html::submitButton(''Send'', [''class'' => ''btn btn-info'',]);?> <?=GridView::widget([ ''dataProvider'' => $dataProvider, ''columns'' => [ [''class'' => ''yii/grid/CheckboxColumn''], ''id'', ], ]); ?> <?= Html::endForm();?>

Este es el controlador:

public function actionBulk(){ $action=Yii::$app->request->post(''action''); $selection=(array)Yii::$app->request->post(''selection'');//typecasting foreach($selection as $id){ $e=Evento::findOne((int)$id);//make a typecasting //do your stuff $e->save(); } }