CSRF を有効にした後にデータを POST すると 400 エラーが発生する

WBOY
リリース: 2016-07-25 08:45:01
オリジナル
759 人が閲覧しました

最近このようなエラーが発生し、原因を探していたところ、解決した記事を見つけたので共有したいと思います。

最初の解決策は CSRF をオフにすることです

  1. public function init(){
  2. $this->enableCsrfValidation = false;
  3. }
コードをコピー

2 番目の解決策は、フォームに隠しフィールドを追加することです


3 番目の解決策は、AJAX に _csrf フィールドを追加することです

  1. var csrfToken = $('meta[name="csrf-token"]').attr("content");
  2. $.ajax({
  3. type: 'POST',
  4. url: url,
  5. データ: {_csrf:csrfToken},
  6. 成功: 成功,
  7. データタイプ: dataType
  8. });
コードをコピー

Yii マッチングプロセスと Yii::$app->request->csrfToken 値の保存場所の説明:

保管場所

  1. 保護関数 createCsrfCookie($token)
  2. {
  3. $options = $this->csrfCookie;
  4. $options['name'] = $this->csrfParam;
  5. $options['value'] = $token;
  6. return new Cookie($options);
  7. }
コードをコピー

認証方法

  1. public function validateCsrfToken($token = null)
  2. {
  3. $method = $this->getMethod();
  4. // 非「安全」なメソッドでのみ CSRF トークンを検証します http://www.w3 .org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1
  5. if (!$this->enableCsrfValidation || in_array($method, ['GET', 'HEAD', 'OPTIONS'], true)) {
  6. return true;
  7. }
  8. $trueToken = $this->loadCsrfToken();
  9. if ($token !== null) {
  10. return $this->validateCsrfTokenInternal($token, $trueToken);
  11. } else {
  12. return $this->validateCsrfTokenInternal($this->getBodyParam($this->csrfParam), $trueToken)
  13. || $this->validateCsrfTokenInternal($this->getCsrfTokenFromHeader(), $ trueToken);
  14. }
  15. }
コードをコピー

以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。

CSRF、投稿


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート