web-dev-qa-db-ja.com

Phpヘッダーディレクティブを使用してAccess-Control-Allow-Origin(CORS Origin)エラーを修正しても安全ですか?

私はWordPressサイトから他のサイトへFormidable Pro Formを見せようとしています。開発者のAPIとREST AP​​Iに従いましたが、CORSの問題に直面しました。

それから私はフォーラムのスレッドでこのコード行をオリジナルのフォームがあるサイトのfunctions.phpに追加することを提案する提案を見つけました:

header("Access-Control-Allow-Origin: *");

私はこのコードを試してみました、そしてそれは完全にうまくいきました。

私の質問は、次のとおりです。このコードはセキュリティ上のリスクまたはその他の脆弱性を引き起こしますか?

解決策は、多くの人々が直面する問題に対してはあまりにも単純すぎるようです。

あなたの意見は大歓迎です。

4
Atef Wagih

はい、あなたはあなたのサイトを開いてAJAX経由でウェブ全体の他のスクリプトにリクエストされます。

Originをoneに制限すると、APIを使用する特定のリモートドメイン、たとえば この例

header("Access-Control-Allow-Origin: http://mozilla.com");

しかし、Mozillaのドキュメントにあるように、クライアントはOriginをフォークできますが、それでもカジュアルなユーザーが接続できるサイトを制限することは、いくつかの攻撃の抑止力です。

さらに良いことに、リクエストを 実際に許可する必要があるメソッドのみ に制限できます。Gistはこのスニペットであり、複数のドメインで機能します$_SERVER['HTTP_Origin']変数が入力されました

add_action('rest_api_init', function() {

     /* unhook default function */
     remove_filter('rest_pre_serve_request', 'rest_send_cors_headers');

     /* then add your own filter */
     add_filter('rest_pre_serve_request', function( $value ) {
          $Origin = get_http_Origin();
          $my_sites = array( 'http://site1.org/', 'http://site2.net', );
          if ( in_array( $Origin, $my_sites ) ) {
              header( 'Access-Control-Allow-Origin: ' . esc_url_raw( $Origin ) );
          } else {
              header( 'Access-Control-Allow-Origin: ' . esc_url_raw( site_url() ) );
          }
          header( 'Access-Control-Allow-Methods: GET' );

          return $value;
     });
}, 15);

ご覧のとおり、このスニペットはWordPressが提供する関数 get_http_Origin を使用しますが、HTTP_Originキーが$_SERVER配列に設定されていない場合、nullまたは空を返します。そのため、使用しているcloudflareプロキシによってブロックされているため、PHPスクリプトでは使用できません。この変数が設定されている場合は、<?php phpinfo(); ?>を使用してスクリプトを使用してすばやく確認します。

たぶん、Originサイトはcloudflareによって別のヘッダーに取り込まれ、http_Originフィルターにフックされた関数で使用できます。これまでに行方不明になった場合は、ファイルシステムのパスまたはパスワードを除き、_SERVER変数の内容を投稿して元の質問を編集します。

喜んでお手伝いします。

4
Jesús Franco

バックグラウンド - ブラウザはスクリプトからのリモートアクセスをそれがロードされたサイトだけに制限しています。この種のチェックが行われていなければ、サイトXにアクセスしている間、ユーザーとパスワードを推測する必要もなく、ユーザーのパスワードを推測せずにgmailアカウントにデータを送信することができたでしょう。適切な認証クッキーをgmailに送信しました。

CORSの「プロトコル」は、必要に応じてこの制限を緩和するのに役立ちます。

それで、あなたがあなた自身に尋ねるべきである質問は、私がそれを必要としますか?一方では、なぜワードプレスサイトの99%がそれを必要とするのかわかりませんが、一方で、ワードプレスクッキーは比較的短命であり、ワードプレスサイトの99%はそのようなランダム攻撃の標的にはなりません。

Rest APIは変化するものであり、個人情報にアクセスできるので、corを有効にする必要がある場合はrest apiをソリューションに使用しないでください。独自の「読み取り専用」APIを作成した方がよいでしょう。

1
Mark Kaplun