Yii2如何在gridview中为批量操作正确创建复选框列?

Yii2如何在gridview中为批量操作正确创建复选框列?,yii,csrf,yii2,csrf-protection,Yii,Csrf,Yii2,Csrf Protection,我需要创建类似于wordpress帖子管理的“批量操作”,以便您可以一次删除多个记录 这是我的方法,效果很好,但我确信这不是最好的方法,因为这种方法容易受到CSRF黑客的攻击 gridview中的复选框列: GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ ['class' => 'yii\grid\CheckboxColumn'], 'id'=>'grid', 'country'

我需要创建类似于wordpress帖子管理的“批量操作”,以便您可以一次删除多个记录

这是我的方法,效果很好,但我确信这不是最好的方法,因为这种方法容易受到CSRF黑客的攻击

gridview中的复选框列:

GridView::widget([
'dataProvider' => $dataProvider,    
'columns' => [
['class' => 'yii\grid\CheckboxColumn'],
'id'=>'grid',
'country',
],
]); 
触发函数的按钮

<a href="#" onclick="bulkAction('p');">
问题是 此方法易受CSRF黑客攻击(此处解释:)


那么,正确的方法是什么呢?

首先,不要做你所做的事情。就像你说的,这是向CRSF开放的。使用POST和not GET将值传递给控制器。阿罗加切夫的链接和答案可能会告诉你怎么做,我相信。1关于CRSF的另一件事,您可以从yii处获得该页面的CRSF,请查看此处,但不是已接受的答案(即我的:),而是另一个答案。

我自己这样解决了它:

通过这种方式,表单得到保护,不受CSRF的影响,所有内容都在POST请求中进行

这是一种观点:

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

我在这里回答了类似的问题:谢谢lalo,它帮助了我很多。在控制器文件中,为什么要声明
$action
变量?非常感谢,它对我来说很好。但是,如果用户单击按钮而不选中任何复选框,如何显示警报?谢谢,但是当您在表单中使用GridView时,您的过滤器将无法工作。你将如何解决这个问题?
index.php?r=mycontroller/bulk&action=1&ids=2,6,7,8
<?=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();?> 
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();
    }
    }