PHPヘッダーを使用したクロスオリジンリクエストヘッダー(CORS)


146

クロスドメインCORSリクエストを試行する単純なPHPスクリプトがあります。

<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
...

それでも私はまだエラーが発生します:

リクエストヘッダーフィールドX-Requested-Withは許可されていませんAccess-Control-Allow-Headers

不足しているものはありますか?

回答:


59

Access-Control-Allow-Headers*受け入れられた値を許可しません。MozillaDocumentation hereを参照してください

アスタリスクの代わりに、受け入れられたヘッダーを送信する必要があります(最初X-Requested-Withにエラーが示すように)。


289

CORSリクエストを適切に処理することは、少し複雑になります。これは、より完全に(そして適切に)応答する関数です。

/**
 *  An example CORS-compliant method.  It will allow any GET, POST, or OPTIONS requests from any
 *  origin.
 *
 *  In a production environment, you probably want to be more restrictive, but this gives you
 *  the general idea of what is involved.  For the nitty-gritty low-down, read:
 *
 *  - https://developer.mozilla.org/en/HTTP_access_control
 *  - http://www.w3.org/TR/cors/
 *
 */
function cors() {

    // Allow from any origin
    if (isset($_SERVER['HTTP_ORIGIN'])) {
        // Decide if the origin in $_SERVER['HTTP_ORIGIN'] is one
        // you want to allow, and if so:
        header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Max-Age: 86400');    // cache for 1 day
    }

    // Access-Control headers are received during OPTIONS requests
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
            // may also be using PUT, PATCH, HEAD etc
            header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         

        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
            header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

        exit(0);
    }

    echo "You have CORS!";
}

32
許可されたオリジンとしてHTTPオリジン値を送り返すと、誰でもCookieを使用してリクエストを送信できるため、サイトにログインして攻撃者のページを表示したユーザーからセッションを盗む可能性があることに注意してください。'*'(Cookieを許可しないため、セッションの盗用を防止します)またはサイトを機能させたい特定のドメインを送信します。
Jules

1
同意した。実際には、おそらく古いドメインだけがCORSサービスを使用することを許可せず、信頼することに決めたセットに制限します。
武器の斬撃

ちなみに、このソリューションはでのみ機能Linux serverIIS、何らかの理由で機能しませんでした。私のホスティングが適しているのか、それとも適切でないのかわかりませんIIS
ncubica

1
ありがとうございました!この回答をブックマークする必要があります。残念ながら、これを新しい回答としてマークすることはできません
Ascherer

1
唯一の真の仕事だと...ただ、変更アクセス制御-許可-起源:* TOアクセス制御-許可-起源:!{$ _SERVER [「HTTP_ORIGIN」]}
ルナンフランカ

60

同じエラーが発生し、次のPHPでバックエンドスクリプトを修正しました。

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

header('Access-Control-Allow-Methods: GET, POST');

header("Access-Control-Allow-Headers: X-Requested-With");

35

インターネット全体の多くの記述は、指定するAccess-Control-Allow-Originだけでは不十分であることを述べていません。ここに私のために働く完全な例があります:

<?php
    if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: POST, GET, DELETE, PUT, PATCH, OPTIONS');
        header('Access-Control-Allow-Headers: token, Content-Type');
        header('Access-Control-Max-Age: 1728000');
        header('Content-Length: 0');
        header('Content-Type: text/plain');
        die();
    }

    header('Access-Control-Allow-Origin: *');
    header('Content-Type: application/json');

    $ret = [
        'result' => 'OK',
    ];
    print json_encode($ret);

1
なぜそれが十分ではなく、どのような最小限の例十分かを説明してください。
halfpastfour.am 2018

残念ながら、正確には覚えていませんし、もう一度調査する時間もありませんが、覚えている限り、Webサーバー/ブラウザー側からいくつかの基本的な前提があり、機能していません。これは私にとって有効な最小限のコードでした。
Csongor Halmai

24

ドロップゾーンと他のプラグインをこの修正(angularjs + phpバックエンド)で動作させることができました

 header('Access-Control-Allow-Origin: *'); 
    header("Access-Control-Allow-Credentials: true");
    header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
    header('Access-Control-Max-Age: 1000');
    header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token , Authorization');

これをupload.phpまたはリクエストの送信先に追加します(たとえば、upload.htmlがあり、upload.phpにファイルを添付する必要がある場合、これらの4行をコピーして貼り付けます)。また、Chrome / mozillaでCORSプラグイン/アドオンを使用している場合は、CORSを有効にするために、それらを複数回切り替えてください。


15

PHPからCORSサービスを作成する場合は、リクエストを処理するファイルの最初のステップとして次のコードを使用できます。

// Allow from any origin
if(isset($_SERVER["HTTP_ORIGIN"]))
{
    // You can decide if the origin in $_SERVER['HTTP_ORIGIN'] is something you want to allow, or as we do here, just allow all
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
}
else
{
    //No HTTP_ORIGIN set, so we allow any. You can disallow if needed here
    header("Access-Control-Allow-Origin: *");
}

header("Access-Control-Allow-Credentials: true");
header("Access-Control-Max-Age: 600");    // cache for 10 minutes

if($_SERVER["REQUEST_METHOD"] == "OPTIONS")
{
    if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_METHOD"]))
        header("Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT"); //Make sure you remove those you do not want to support

    if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_HEADERS"]))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

    //Just exit with 200 OK with the above headers for OPTIONS method
    exit(0);
}
//From here, handle the request as it is ok

8

CORSの機能を正しく理解しないと、CORSは頭痛の種になる可能性があります。私はそれらをPHPで使用しており、問題なく動作します。ここを参照

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Max-Age: 1000");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");
header("Access-Control-Allow-Methods: PUT, POST, GET, OPTIONS, DELETE");

7

Angular 4をクライアント側、PHPをサーバー側として使用する場合、この多くのコードはうまく機能しません。

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

3

これはうまくいくはずです

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");

0

このコードを.htaccessに追加します

app_key、auth_key..etcのようなヘッダーにカスタム認証キーを追加します

Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Headers: "customKey1,customKey2, headers, Origin, X-Requested-With, Content-Type, Accept, Authorization"

-1

Windowsでは、このコマンドを実行時に貼り付けますとりあえずコードをテストするためにウィンドウます

chrome.exe --user-data-dir = "C:/ Chrome dev session" --disable-web-security


一時的にであっても、ブラウザのWebセキュリティを無効にするのはひどい考えです
Machavity
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.