Cross-Origin Request Headers (CORS) with PHP headers

Mam prosty skrypt PHP, który próbuję wykonać żądanie CORS między domenami:

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

Jednak nadal dostaję błąd:

Pole nagłówka żądania X-Requested-With nie jest dozwolone przez Access-Control-Allow-Headers

Coś mi umknęło?
Author: Machavity, 2012-01-03

11 answers

Access-Control-Allow-Headers nie pozwala * jako akceptowanej wartości, zobacz dokumentację Mozilli tutaj .

Zamiast gwiazdki należy wysłać zaakceptowane nagłówki (najpierw X-Requested-With Jak mówi błąd).

 62
Author: KARASZI István,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-29 10:34:22

Prawidłowa obsługa żądań Kors jest nieco bardziej zaangażowana. Oto funkcja, która odpowie pełniej (i prawidłowo).

/**
 *  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
 *  - https://fetch.spec.whatwg.org/#http-cors-protocol
 *
 */
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!";
}

Notatki Bezpieczeństwa

Gdy przeglądarka chce wykonać żądanie między witrynami, najpierw potwierdza, że jest to w porządku z żądaniem "pre-flight" do adresu URL. Zezwalając CORS mówisz przeglądarce, że odpowiedzi z tego adresu URL mogą być współdzielone z innymi domenami.

CORS nie chroni Twojego serwera. CORS stara się chronić użytkowników poprzez informowanie przeglądarek, jakie powinny być ograniczenia dotyczące udostępniania odpowiedzi innym domenom. Zwykle tego rodzaju udostępnianie jest całkowicie zabronione, więc CORS jest sposobem na przebicie dziury w normalnej polityce bezpieczeństwa przeglądarki. Otwory te powinny być jak najmniejsze, więc zawsze sprawdzaj http_origin na jakiejś wewnętrznej liście.

Istnieją pewne zagrożenia , zwłaszcza jeśli dane serwowane przez adres URL są normalnie chronione. Skutecznie zezwalasz na zawartość przeglądarki, która powstały na innym serwerze, aby odczytać (i ewentualnie manipulować) dane na twoim serwerze.

Jeśli zamierzasz używać CORS, przeczytaj uważnie protokół (jest dość mały) i spróbuj zrozumieć, co robisz. W tym celu w próbce kodu podany jest adres URL odniesienia.

Header security

Zaobserwowano, że nagłówek HTTP_ORIGIN jest niepewny i to prawda. W rzeczywistości wszystkie nagłówki HTTP nie są bezpieczne dla różnych znaczeń tego terminu. Chyba że nagłówek zawiera weryfikowalny podpis/hmac, lub cała rozmowa jest uwierzytelniona przez TLS, nagłówki są po prostu "coś, co powiedziała mi przeglądarka".

W tym przypadku przeglądarka mówi: "obiekt z domeny x chce uzyskać odpowiedź z tego adresu URL. W porządku?"Chodzi o to, aby CORS był w stanie odpowiedzieć: "tak, pozwolę na to".

 315
Author: slashingweapon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-06 22:49:16

Dostałem ten sam błąd i naprawiłem go za pomocą następującego PHP w moim skrypcie zaplecza:

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

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

header("Access-Control-Allow-Headers: X-Requested-With");
 78
Author: Fiach Reid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-30 20:43:21

Wiele opisów w Internecie nie wspomina, że określenie Access-Control-Allow-Origin nie wystarczy. Oto kompletny przykład, który działa dla mnie:

<?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);
 40
Author: Csongor Halmai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-26 14:23:50

Po prostu udało mi się uruchomić dropzone i inne wtyczki do pracy z tą poprawką (angularjs + backend 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');

Dodaj to do swojego uploadu.php lub gdzie można wysłać żądanie (na przykład, jeśli masz upload.html i musisz załączyć pliki do przesłania.php, następnie skopiuj i wklej te 4 linie). Jeśli używasz wtyczek/dodatków CORS w chrome / Mozilli, upewnij się, że przełączasz je więcej niż jeden raz, aby CORS był włączony

 25
Author: Fedeco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-23 15:52:57

Jeśli chcesz utworzyć usługę CORS z PHP, możesz użyć tego kodu jako pierwszego kroku w pliku, który obsługuje żądania:

// 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
 18
Author: Finn Johansen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-19 14:15:01

Kors może stać się bólem głowy, jeśli nie dobrze rozumiemy jego funkcjonowanie. Używam ich w PHP i działają bez problemów. reference here

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");
 11
Author: shades3002,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-13 19:24:38

Ten kod działa na mnie, gdy używam angular 4 jako strony klienta i PHP jako strony serwera.

header("Access-Control-Allow-Origin: *");
 7
Author: Labib Hussain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-16 13:32:09

To powinno zadziałać

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");
 5
Author: user8453321,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-19 00:31:35

Dodaj ten kod w .htaccess

Dodaj niestandardowy klucz uwierzytelniania w nagłówku, takim jak 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"
 0
Author: Rakyesh Kadadas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-11 16:33:50

W Windows, wklej to polecenie w Uruchom okno tylko na czas, aby przetestować kod

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

 -4
Author: Fazil Raza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-16 11:57:59