Php header access control allow credentials

CORS с заголовками php

У меня есть простой скрипт PHP, который я пытаюсь выполнить междоменный запрос CORS:

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

Но я все еще получаю ошибку:

Поле заголовка запроса X-Requested-With не разрешено в Access-Control-Allow-Headers

Access-Control-Allow-Headers не разрешает * как принятое значение, см. Здесь документацию Mozilla.

Вместо звездочки вы должны отправить принятые заголовки (сначала X-Requested-With как говорит ошибка).

Обращение с запросами 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: "); 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: "); exit(0); > echo "You have CORS!"; > 

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

header (‘Access-Control-Allow-Origin: *’);

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

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

Мне просто удалось получить 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

Многие описания в Интернете не говорят о том, что указать Access-Control-Allow-Origin недостаточно. Вот полный пример, который работает для меня:

 header('Access-Control-Allow-Origin: *'); header('Content-Type: application/json'); $ret = [ 'result' => 'OK', ]; print json_encode($ret); 

Если вы хотите создать службу 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: "); > 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: "); //Just exit with 200 OK with the above headers for OPTIONS method exit(0); > //From here, handle the request as it is ok 

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 в качестве клиентской стороны и PHP в качестве серверной части.

Источник

Заголовки запросов Cross-Origin (CORS) с заголовками PHP

У меня есть простой скрипт PHP, в котором я пытаюсь выполнить междоменный запрос CORS:

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

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

.

Тем не менее я получаю сообщение об ошибке:

Поле заголовка запроса X-Requested-With не разрешено Access-Control-Allow-Headers

Что-то я делаю не правильно?

Ответ 1

Access-Control-Allow-Headers не допускает « *» приемлемого значения.

Вместо звездочки следует отправлять принятые заголовки (сначала X-Requested-With, как указано в ошибке).

Согласно MDN Web Docs 2021 :

Значение « *» считается специальным подстановочным знаком только для запросов без учетных данных (запросы без файлов cookie HTTP или информации аутентификации HTTP). В запросах с учетными данными оно рассматривается как буквальное имя заголовка « *» без специальной семантики. Обратите внимание, что заголовок авторизации не может содержать подстановочные знаки и всегда должен быть указан явно.

Ответ 2

Правильная обработка запросов CORS требует больше усилий. Вот функция, которая ответит более полно (и правильно).

/**

* Пример CORS-совместимого метода. Он разрешает любые запросы GET, POST или OPTIONS из любого

* места.

*

*/

function cors()

if (isset($_SERVER[‘HTTP_ORIGIN’]))

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

header(‘Access-Control-Allow-Credentials: true’);

header(‘Access-Control-Max-Age: 86400’); // кэш на 1 день

>

if ($_SERVER[‘REQUEST_METHOD’] == ‘OPTIONS’)

if (isset($_SERVER[‘HTTP_ACCESS_CONTROL_REQUEST_METHOD’]))

// можно использовать в PUT, PATCH, HEAD и т. п.

header(«Access-Control-Allow-Methods: GET, POST, OPTIONS»);

if (isset($_SERVER[‘HTTP_ACCESS_CONTROL_REQUEST_HEADERS’]))

header(«Access-Control-Allow-Headers: «);

exit(0);

>

echo «Это CORS!»;

>

Замечания по безопасности

Когда браузер хочет выполнить междоменный запрос, он сначала подтверждает, что это нормально, с помощью «специального» запроса к URL. Разрешив CORS, вы сообщаете браузеру, что ответы с этого URL-адреса могут быть переданы другим доменам.

CORS не защищает ваш сервер. CORS пытается защитить ваших пользователей, сообщая браузерам, какие ограничения должны быть на обмен ответами с другими доменами. Обычно такой обмен категорически запрещен, поэтому CORS — это способ проделать брешь в обычной политике безопасности браузера. Этих брешей должно быть как можно меньше, поэтому всегда сверяйте HTTP_ORIGIN с каким-то внутренним списком.

Здесь есть некоторые опасности , особенно если данные, которые обслуживает URL, обычно защищены. Вы фактически разрешаете контенту браузера, который был создан на каком-то другом сервере, читать (и, возможно, манипулировать) данны е на вашем сервере.

Если вы собираетесь использовать CORS, внимательно прочтите протокол (он довольно маленький) и попытайтесь понять, что вы делаете. Для этой цели в образце кода приведен ссылочный URL.

Безопасность заголовка

Было замечено, что заголовок HTTP_ORIGIN небезопасен, и это так. Фактически все заголовки HTTP небезопасны для различных значений этого термина. Если заголовок не включает проверяемую подпись/hmac или весь разговор не аутентифицирован через TLS, заголовки — это просто «то, что было отправлено браузеру».

В этом случае браузер сообщает: « О бъект из домена X хочет получить ответ от этого URL-адреса. Это нормально?» . Суть CORS состоит в том, чтобы иметь возможность ответить: «Да, я разрешаю это».

Ответ 3

Многие описания не упоминают, что элемент ов Access-Control-Allow-Origin недостаточно. Вот полный пример, который мне подходит:

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);

Ответ 4

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

if(isset($_SERVER[«HTTP_ORIGIN»]))

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

> else

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

>

header(«Access-Control-Allow-Credentials: true»);

header(«Access-Control-Max-Age: 600»); // кэш на 10 минут

if($_SERVER[«REQUEST_METHOD»] == «OPTIONS»)

if (isset($_SERVER[«HTTP_ACCESS_CONTROL_REQUEST_METHOD»]))

header(«Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT»);

if (isset($_SERVER[«HTTP_ACCESS_CONTROL_REQUEST_HEADERS»]))

header(«Access-Control-Allow-Headers: «);

exit(0);

>

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Источник

Кроссдоменные запросы (CORS) простая реализация

Несколько раз у меня уже возникала мысль о реализации кроссдоменных запросов между своими сервисами, однако толково настроить получалось плохо. Давайте уже наконец-то разберемся в этой теме.

Для начала, рассмотрим пример:

У вас есть сайт «А», на пример, реализованный на Laravel и vue.js, который реализует определенную логику работы с какими-либо данными. Сейчас вы, в рамках одного сервиса (в данном случае, несколько микро сервисов решающих разные задачи для одного большого проекта), создаете сайт «Б», которому необходимо работать с той же базой данных и использовать часть функционала сайта «А».

Как решить этот вопрос? Естественно вы можете повторно реализовать необходимый функционал на сайте «Б» и подключиться к базе сайта «А». Но в этом есть свои существенные минусы, как минимум это:

  1. Вы, в рамках одной системы, дублируете код, который вы написали ранее.
  2. Вы используете прямой доступ к БД из двух разных мест, это существенно усложнит поиск ошибок, если такие возникнут и такой подход считается далеко не «лучшей практикой».

Так же, у вас есть ещё один вариант реализации (да, это первое, что пришло вам в голову) — jsonp. Но особенности этого метода заключаются в некоторой сложности реализации:

  1. Высокие требования к безопасности данного подхода
  2. Требования к изменению кода уже написанного ранее для сайта «А».
  3. Метод позволят только получить данные, если вам, к примеру требуется отправить информацию методом POST, при помощи jsonp вы этого сделать не сможете.
  4. Уязвимость к инъекциям — вы должны полностью доверять серверу, от которого получаете данные, ведь вы будете выполнять весь код, который вам от него приходит.

Но есть вариант лучше, проще, так как не требует внесения изменений на сайте «А» и является более безопасным подходом, это кроссдоменные запросы или CORS — Cross-origin resource sharing (в переводе: совместное использование ресурсов между разными источниками).

Суть метода очень проста: для того, чтобы серверу «А» получить или отправить данные на сервер «Б», достаточно на сервере «Б» установить «разрешение» на получение и ответ на запросы с сервера «А». Делается это следующим образом: в заголовках ответа на сервере «Б» вам необходимо установить следующие записи:

Источник

Читайте также:  What is stripslashes in php
Оцените статью