AJAX CORS, эквивалентный этому запросу JSONP AJAX - позволяет читать файлы cookie и разрешать любой доступ к домену [дублировать]

91
задан rink.attendant.6 5 March 2014 в 02:14
поделиться

9 ответов

39
ответ дан KARASZI István 21 August 2018 в 08:50
поделиться

Обращение с запросами 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!";
}
211
ответ дан charlietfl 21 August 2018 в 08:50
поделиться
  • 1
    Обратите внимание, что отправка значения HTTP Origin назад, как разрешенное происхождение, позволит любому отправлять запросы вам с помощью куки-файлов, что может привести к краже сеанса от пользователя, который зашел на ваш сайт, а затем просмотрел страницу злоумышленника. Вы либо хотите отправить «*» (который запретит файлы cookie, тем самым предотвращая кражу сеанса), или определенные домены, для которых вы хотите, чтобы сайт работал. – Jules 7 July 2012 в 20:03
  • 2
    Согласовано. На практике вы, вероятно, не допустили бы, чтобы какой-либо старый домен использовал вашу службу CORS, вы бы ограничили ее набором, который вы решили доверять. – slashingweapon 31 August 2012 в 18:05
  • 3
    Спасибо за подробное объяснение. @slashingweapon – Bimal 5 June 2013 в 06:28
  • 4
    Спасибо! Должен отметить этот ответ. Слишком плохо, мы не можем отметить это как новый ответ – Ascherer 24 June 2015 в 07:26
  • 5
    Единственное, что действительно работает! .. Просто измените Access-Control-Allow-Origin: * TO Access-Control-Allow-Origin: {$ _SERVER ['HTTP_ORIGIN']} – Renan Franca 17 September 2015 в 18:06

Я получил ту же ошибку и исправил ее со следующим PHP в моем внутреннем скрипте:

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

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

header("Access-Control-Allow-Headers: X-Requested-With");
25
ответ дан Community 21 August 2018 в 08:50
поделиться

Многие описания в Интернете не упоминают, что указать 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);
10
ответ дан Csongor Halmai 21 August 2018 в 08:50
поделиться
  • 1
    Пожалуйста, объясните, почему этого недостаточно, а какой минимальный пример - . – halfpastfour.am 20 August 2018 в 19:09
  • 2
    – Csongor Halmai 26 August 2018 в 06:26

Мне просто удалось получить dropzone и другой плагин для работы с этим исправлением (angularjs + php backend)

 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 строки). Кроме того, если вы используете плагины / аддоны CORS в chrome / mozilla, обязательно переключите их более одного раза, чтобы включить CORS

9
ответ дан Fedeco 21 August 2018 в 08:50
поделиться

Если вы хотите создать службу CORS из PHP, вы можете использовать этот код в качестве первого шага в вашем файле, который обрабатывает запросы:

// 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
6
ответ дан Finn Johansen 21 August 2018 в 08:50
поделиться

Этот код работает для меня при использовании углового 4 в качестве клиентской стороны и PHP в качестве серверной части.

header («Access-Control-Allow-Origin: *»);

1
ответ дан Labib Hus'sain 21 August 2018 в 08:50
поделиться

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");
4
ответ дан shades3002 21 August 2018 в 08:50
поделиться

это должно работать

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");
1
ответ дан user8453321 21 August 2018 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: