为什么无法在Yii2中验证您的数据提交错误?

为什么无法在Yii2中验证您的数据提交错误?,yii2,Yii2,错误: 无法验证您的数据提交错误 在Yii2中创建一个公共函数。但是,在此方法中提交数据不被接受, 请参阅以下错误图像。为什么会发生这种情况?将其添加到您的控制器中: public $enableCsrfValidation = false; 使用CSRF令牌检查表单中是否存在隐藏输入。应该是这样的 <input type="hidden" name="_csrf" value="ZEZ6Y0xrY3ARGS42fTwhMQgkDgF6BCEGEx4SMXQMBR4CPy0iPCIwN

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

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

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

 public $enableCsrfValidation = false;

使用CSRF令牌检查表单中是否存在隐藏输入。应该是这样的

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


在布局的标题部分添加以下内容:
如果手动创建表单(即不使用yii表单方法),则应添加如下输入字段:

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

有时您也可以使用Yii 2.0获得此错误,因为post_max_大小、upload_max_文件大小、,max_input_time也可能Web服务器可以修剪帖子,因此在nginx-client_max_body_sizeapache-LimitRequestBody

中验证是否存在各种解决此问题的方法,我想首先了解它发生的原因有助于解决此问题

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

  • 当您尝试上载多个文件,而web服务器无法处理负载时,会出现另一个原因。为确保正确,需要检查的一些属性是:计算试图上载的文件的大小,并检查web服务器的post_max_大小和upload_max_文件大小
  • 如果您运行的是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在某种程度上不确定ajax请求。我已经多次遇到这个问题


    因此,当您通过ajax通过POST发送数据时,请记住发送_csrf键。

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

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

    与dchakarov的答案略有不同,因为Yii2层使用而不是
    \u csrf
    变量
    \u前端csrf


    从yii 2.0.12更新到2.0.30

    有此错误的请求错误400

    • 在标题布局中获得了
      Html::csrfMetaTags()
    • 因此,使用activeform并不是由于 形式。并已通过检查
    我通过将下面的代码添加到
    后端/config/main.php
    解决了这个问题

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


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

    无法验证csrf令牌。请共享有关该问题的更多详细信息。您的应用程序日志中是否有任何内容?他不是在询问禁用CSRF。正如@arogachev已经说过的:您的评论是不正确的。csrf在任何时候都会被验证(不存在也会导致失败),除非你关闭它,这确实不是要求的。回滚:)干杯,伙计们。如果我没有使用Yii布局呢?我正在使用angular
    $http.put()
    ,在我的控制器中我有
    public$enableCsrfValidation=false,这很管用,但听起来不太好。也许对某些人来说,它不管用,因为我忽略了它,这在我的书中肯定不是一个好建议。。。禁用安全措施是因为您无法立即了解它们是如何工作的?我认为在某些情况下可能需要禁用安全措施。例如,如果您实现Paypal IPN通知…同意,我尝试实现类似于IPN通知的功能,因此CSRF验证不是本案例的选项。这是一个很好的答案。在某些情况下禁用CSRF可能是必要的(在我的情况下,为一个webhook接收facebook帖子),它有一个。那么现在我该怎么办呢?您可以将值设置为。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能无效。-谢谢你的指导,如果下次需要的话我会做的。顺便说一下,在我下面的回答中,我在最后一句话中给出了我的情况的正确答案。谢谢你救了我!感谢它救了我一天,我正在检查所有CSRF问题,但这是因为文件上载。很高兴能提供帮助很高兴能提供帮助,您可以将此作为答案进行投票。:)在我的例子中,我使用的是activeForm,csrf也在生成,但仍然会出现这个错误。当然,我想有很多人是手动创建表单的——thx=)必须在设置
    \u frontendCsrf
    ,组件->请求->'csrfParam'=>'\u frontendCsrf'中使用,为什么要在一个可公开访问的web应用程序中禁用csrf令牌验证?只是为了一个变通解决方案,否则我建议保持它的启用状态,否则会有巨大的安全风险,也是一个替代方案
    'components' => [
        'request' => [
            'csrfParam' => '_backend_csrf',
        ],