【问题标题】:Why get Unable to verify your data submission error in Yii2?为什么在 Yii2 中出现无法验证您的数据提交错误?
【发布时间】:2014-12-15 01:37:25
【问题描述】:

错误:

无法验证您的数据提交错误

在 Yii2 中创建一个公共函数。但是,在这种方法中提交数据不接受, 请参阅以下错误图像。为什么会这样?

【问题讨论】:

  • 无法验证 csrf 令牌
  • 请分享有关该问题的更多详细信息。是否有任何内容写入您的应用程序的日志?

标签: yii2


【解决方案1】:

将此添加到您的控制器中:

 public $enableCsrfValidation = false;

【讨论】:

  • 在我的书中绝对不是好建议...禁用安全措施,因为您无法立即弄清楚它们是如何工作的?
  • 我在某些情况下可能需要它。例如,如果您实施 Paypal IPN 通知 ...
  • 同意,我试图实现类似于 IPN 通知的功能,因此 CSRF 验证不适用于这种情况。
  • 这是一个很好的答案。在某些情况下可能需要禁用 CSRF(在我的情况下,为了接收 webhook 的 facebook POST)
【解决方案2】:

使用 CSRF 令牌检查表单中是否存在隐藏输入。它应该看起来像

<input type="hidden" name="_csrf" value="ZEZ6Y0xrY3ARGS42fTwhMQgkDgF6BCEGEx4SMXQMBR4CPy0iPCIwNQ==">

【讨论】:

  • 它有一个。那么现在我该怎么办?
  • 你可以将值设置为=Yii::$app->request->getCsrfToken()?>
【解决方案3】:

在布局的头部添加这个:&lt;?= Html::csrfMetaTags() ?&gt;

【讨论】:

  • 他不是在询问是否禁用 CSRF。
  • 正如@arogachev 已经说过的:这是您的评论不正确。除非您将 csrf 关闭,否则随时验证 csrf(它不存在也会导致失败),这确实不是所要求的。
  • 回滚 :) 伙计们干杯。
  • 如果我不使用 Yii 布局怎么办?我正在使用角度 $http.put() 并且在我的控制器中我有 public $enableCsrfValidation = false; ,这可行但听起来不太好。
  • 也许对某些人来说它不起作用,因为我忽略了它应该是 方法,其中配置了 csrf 参数的名称在设置 - components->request-> 'csrfParam' => '_frontendCsrf',
【解决方案4】:

如果您手动创建表单(即不使用 yii 表单方法),您应该添加这样的输入字段:

<input type="hidden" name="_csrf" value="<?=Yii::$app->request->getCsrfToken()?>" />

来源:http://zero-exception.blogspot.com/2015/01/yii2-using-csrf-token.html

【讨论】:

  • 当然,我想有很多人手动创建表单 - thx =)
  • 必须在设置中使用_frontendCsrf,components->request-> 'csrfParam' => '_frontendCsrf',
【解决方案5】:

由于 post_max_size、upload_max_filesize、max_input_time 有时您可能会在使用 Yii 2.0 时遇到此错误,也可能网络服务器可以修剪帖子,因此请在 nginx - client_max_body_size 上进行验证> 或在 apache - LimitRequestBody

【讨论】:

    【解决方案6】:

    这个问题有多种解决方案,我想首先理解它为什么会发生有助于解决问题。

    1. 这可能是由无效的 csrf 令牌、用户生成的 csrf 令牌、过期的 csrf 令牌引起的,当您有不使用“ActiveForm”类构建的自定义表单时,所有这些“csrf”问题都会出现。

    如果 CSRF 不是问题,

    1. 当您尝试上传多个文件并且 Web 服务器无法处理负载时,会出现其他原因。一些要检查的属性以确保您在正确的轨道上是确定一个尝试上传的文件的大小并检查 Web 服务器的 post_max_size 和 upload_max_filesize

    如果您运行的是 linux,请检查 php.ini 文件中的以下输入:

    ; Maximum size of POST data that PHP will accept.
    ; Its value may be 0 to disable the limit. It is ignored if POST data    reading
    ; is disabled through enable_post_data_reading.
    ; http://php.net/post-max-size
    post_max_size = 8M
    
    ; Whether to allow HTTP file uploads.
    ; http://php.net/file-uploads
    file_uploads = On
    
    ; Maximum allowed size for uploaded files.
    ; http://php.net/upload-max-filesize
    upload_max_filesize = 2M
    

    根据您的计算,调整上述 php.ini 参数以满足您的需求,然后进行测试。 我遇到了类似的问题,我解决了。

    【讨论】:

    • 谢谢它拯救了我的一天,正在检查所有 CSRF 问题,但这是因为文件上传。
    • 很高兴有帮助
    • 很高兴为您提供帮助,您可以投票作为答案。 :)
    • 在我的情况下,我正在使用 activeForm 并且 csrf 也正在生成但仍然出现此错误
    • @AmosKosgei 我有 CSRF,但我没有上传文件。知道如何解决这个问题吗? stackoverflow.com/questions/70031633/…
    【解决方案7】:

    这里讨论了一个很长的故事github

    所以禁用 csrf 以某种方式不确定 ajax 请求。这个问题我遇到过很多次了。

    所以当你通过 ajax POST 发送数据时记得发送 _csrf 键。

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • 感谢您的指导,下次如果需要我会这样做。顺便说一句,在我下面的回答中,我在最后一句话中给出了我的情况的正确答案。
    • 谢谢你救了我!
    • @ThangTD 不能只使用 $.ajaxSetup({}); 在标头中设置 CSRF 吗?
    【解决方案8】:

    要在整个应用程序中永久禁用 csrf 验证,请在您的配置中添加以下代码。

    $config = [
        'components' => [
            'request' => [
                'enableCsrfValidation' => false,
            ],
        ],
    ];
    

    【讨论】:

    • 为什么要在可公开访问的 Web 应用程序中禁用 csrf 令牌验证?
    • 只是为了解决方案,否则我建议保持启用它,否则将是巨大的安全风险
    【解决方案9】:
    $csrf = \yii::$app->request->csrfParam;
    
    $token = \yii::$app->request->csrfToken;        
    
    //start from 
    
    echo Html::hiddenInput($csrf,$token);
    
    //end from
    

    【讨论】:

    • 也可以选择
    【解决方案10】:

    由于 Yii2 层使用而不是 _csrf变量_frontendCsrf

    &lt;input type="hidden" name="_frontendCsrf" value="&lt;?=Yii::$app-&gt;request-&gt;getCsrfToken()?&gt;" /&gt;

    这是第二次这个问题对我没有帮助,即使我之前发表了评论,所以我必须发表回复。

    【讨论】:

      【解决方案11】:

      从 yii 2.0.12 更新到 2.0.30

      有这个错误的请求错误 400

      • 在标题布局中获得了Html::csrfMetaTags()
      • 使用activeform,因此不是由于缺少csrf令牌引起的 形式。并且已经通过检查进行了检查。

      我通过将以下代码添加到backend/config/main.php 解决了这个问题。

      'components' => [
          'request' => [
              'csrfParam' => '_backend_csrf',
          ],
      

      这是正确的方法还是会导致安全问题?

      【讨论】:

        【解决方案12】:

        仅对特定操作禁用

        /**
         * @inheritdoc
         */
        public function beforeAction($action)
        {            
            if ($action->id == 'my-action') {
                $this->enableCsrfValidation = false;
            }
        
            return parent::beforeAction($action);
        }
        

        【讨论】:

        • 这是一个很好的解决方案,当人们接受来自其他站点(例如支付提供商)的发布数据并且因此通过替代方式执行验证时 - 通常不受接收站点/操作的控制.
        猜你喜欢
        • 1970-01-01
        • 2017-06-20
        • 2015-10-15
        • 2017-02-12
        • 2015-09-27
        • 2021-12-30
        • 2021-12-04
        • 2014-09-09
        • 2021-05-10
        相关资源
        最近更新 更多