web-dev-qa-db-ja.com

Yii2でデータ送信エラーを検証できないのはなぜですか?

enter image description here

エラー:

データ送信エラーを確認できません

Yii2で1つのパブリック関数を作成します。ただし、このメソッドでは受け入れられないデータを送信します。次のエラー画像を参照してください。なぜこれが起こるのですか?

32
Bharat Chauhan

これをレイアウトのheadセクションに追加します:<?= Html::csrfMetaTags() ?>

18
WCO

フォームを手動で作成する場合(つまり、yiiフォームメソッドを使用せずに)、次のような入力フィールドを追加する必要があります。

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

ソース: http://zero-exception.blogspot.com/2015/01/yii2-using-csrf-token.html

45
dchakarov

この問題にはさまざまな解決策がありますが、そもそもなぜそれが起こったのかを理解することが問題の解決に役立つと思います。

  1. これは、無効なcsrfトークン、ユーザーが生成したcsrfトークン、期限切れのcsrfトークンが原因で発生します。これらすべての「csrf」の問題は、「ActiveForm」クラスを使用せずにカスタムフォームを構築した場合に発生します。

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パラメーターを調整し、テストします。同様の問題があり、解決しました。

14
Amos Kosgei

アプリケーション全体でcsrf検証を永続的に無効にするには、構成に以下のコードを追加します。

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

また、post_max_size、upload_max_filesize、max_input_timeが原因でYii 2.0投稿をトリミングすることができるので、nginx-client_max_body_sizeまたはApache-LimitRequestBody

3

ここで長い話が議論されました github

そのため、csrfを無効にすると、ajaxリクエストがどうなるかわかりません。私はこの問題に何度も遭遇しました。

したがって、POST ajaxを使用してデータを送信する場合は、_csrfキーを送信することを忘れないでください。

3
ThangTD

CSRFトークンを使用してフォームに非表示の入力があるかどうかを確認します。次のようになります

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

$ csrf =\yii :: $ app-> request-> csrfParam;

$ token =\yii :: $ app-> request-> csrfToken;

//から始まる

echo Html :: hiddenInput($ csrf、$ token);

//から終了

0