【问题标题】:Yii 2.0 CSRF validation for AJAX requestYii 2.0 CSRF 验证 AJAX 请求
【发布时间】:2015-07-21 03:11:43
【问题描述】:

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

我也需要做CSRF 验证。我该怎么做?

我将 CSRF cookie 连同我的 post 请求一起发送,但 Yii 2.0 没有验证它,并且通过 ajax 传递的任何输入都到达了服务器。

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

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

【问题讨论】:

    标签: php yii2 csrf


    【解决方案1】:

    你不需要手动设置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 ?>

    【讨论】:

    • 但是它将如何验证..我应该在控制器操作中写什么来检查它是否被验证?
    • 验证是什么意思?
    • 我的意思是当有人发送没有正确 csrf 数据的数据时,他应该无法执行控制器操作
    • 每个请求都会自动完成。默认情况下启用 CSRF 验证。 Here 是验证的确切位置 (yii\web\Controller beforeAction())。
    • 但在我的情况下,即使我没有发送令牌,我也可以访问该操作
    【解决方案2】:

    最后我发现只包括

        <?= Html::csrfMetaTags() ?>

    在邮件布局中,无论是否为ajax,都会自动为每个post/get请求添加csrf验证。我们不需要手动发送csrf令牌和aja

        <?= Html::csrfMetaTags() ?>

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

    无论是ajax还是非ajax请求/表单提交都会做csrf验证..

    向 Yii 2.0 的发明者致敬#love-yii-2.0

    【讨论】:

      猜你喜欢
      • 2013-09-07
      • 2018-07-16
      • 1970-01-01
      • 2015-02-28
      • 2012-09-12
      • 2012-05-10
      • 2017-06-17
      • 2014-11-16
      • 1970-01-01
      相关资源
      最近更新 更多