【发布时间】:2015-07-21 03:11:43
【问题描述】:
我有一个ajax 函数触发从我的数据库中删除条目。
我也需要做CSRF 验证。我该怎么做?
我将 CSRF cookie 连同我的 post 请求一起发送,但 Yii 2.0 没有验证它,并且通过 ajax 传递的任何输入都到达了服务器。
我如何对 ajax 请求进行CSRF 验证。
我们是否需要手动设置cookie并检查?
【问题讨论】:
我有一个ajax 函数触发从我的数据库中删除条目。
我也需要做CSRF 验证。我该怎么做?
我将 CSRF cookie 连同我的 post 请求一起发送,但 Yii 2.0 没有验证它,并且通过 ajax 传递的任何输入都到达了服务器。
我如何对 ajax 请求进行CSRF 验证。
我们是否需要手动设置cookie并检查?
【问题讨论】:
你不需要手动设置cookie。
如果您使用的是 jQuery CSRF 令牌将自动发送。
例如对于 AngularJS,您可以手动添加它来请求这样的参数:
yii.getCsrfParam(): yii.getCsrfToken()
确保包含YiiAsset。
否则您可以从元标记中检索它们(这基本上就是这两种方法所做的):
$('meta[name=csrf-param]').prop('content'): $('meta[name=csrf-token]').prop('content')
还要注意,要启用 CSRF 验证,Controller 和 Request 的属性 enableCsrfValidation 属性必须设置为 true。
更新:
另一个需要理解的重要事项:
CSRF 令牌将仅在以下方法上进行验证:GET、HEAD、OPTIONS。
还要确保在主布局中有<?= Html::csrfMetaTags ?>。
【讨论】:
yii\web\Controller beforeAction())。
最后我发现只包括
<?= Html::csrfMetaTags() ?>
在邮件布局中,无论是否为ajax,都会自动为每个post/get请求添加csrf验证。我们不需要手动发送csrf令牌和aja
<?= Html::csrfMetaTags() ?>
请求失败并抛出异常..所以这是我的错误..只需添加
<?= Html::csrfMetaTags() ?>
无论是ajax还是非ajax请求/表单提交都会做csrf验证..
向 Yii 2.0 的发明者致敬#love-yii-2.0
【讨论】: