针对AJAX请求的Yii 2.0 CSRF验证

时间:2015-05-10 16:21:38

标签: php yii2 csrf

我有一个ajax函数,可以触发从我的数据库中删除条目。

我需要对此进行CSRF验证。我怎么能这样做?

我发送了CSRF cookie以及我的帖子请求,但是Yii 2.0没有验证它,并且通过ajax传递的任何输入都到达了服务器。

如何对ajax请求进行CSRF验证。

我们是否需要手动设置cookie并检查?

2 个答案:

答案 0 :(得分:4)

您无需手动设置Cookie。

如果您正在使用jQuery CSRF令牌将自动发送。

例如对于AngularJS,您可以手动添加它以请求这样的参数:

yii.getCsrfParam(): yii.getCsrfToken()

确保包含YiiAsset

否则你可以从元标记中检索它们(这基本上就是这两种方法的作用):

$('meta[name=csrf-param]').prop('content'): $('meta[name=csrf-token]').prop('content')

另请注意,要启用CSRF验证,ControllerRequest的属性enableCsrfValidation属性必须设置为true

<强>更新

另一个要理解的重要事项:

仅对此方法验证CSRF令牌:GETHEADOPTIONS

还要确保主布局中有<?= Html::csrfMetaTags ?>

答案 1 :(得分:0)

最后我发现只包括

&#13;
&#13;
    <?= Html::csrfMetaTags() ?>
&#13;
&#13;
&#13;

邮件布局中的

会自动为每个发布/获取请求添加csrf验证,无论是否是ajax。我们不需要手动发送csrf令牌和aja

&#13;
&#13;
    <?= Html::csrfMetaTags() ?>
&#13;
&#13;
&#13;

请求失败并抛出异常。所以这是我的错误。只需添加 <?= Html::csrfMetaTags() ?>

无论是ajax还是非ajax请求/表单提交,

都会进行csrf验证。

向Yii 2.0发明家致敬,感谢他们这样一个非常棒的东西#love-yii-2.0