Php request header origin

Заголовки запросов 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);

>

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

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

Источник

How to get http request origin in php

If your REST server uses virtual hosts, this header is a must to route requests correctly. However, chances are if your users are behind firewall, proxies, they can strip off headers before request reaches you.

How I can get origin of request with PHP?

According to the article HTTP access control (CORS) by MDN:

All requests must be set Origin header to work correctly under CORS( Cross-origin resource sharing ) mechanism.

The » Origin » request header is part of RFC 6454 and describes it as part of CORS mechanism and is compatible with all browsers according to MDN.

The Origin request header indicates where a fetch originates from. It doesn’t include any path information, but only the server name. It is sent with CORS requests, as well as with POST requests. It is similar to the Referer header, but, unlike this header, it doesn’t disclose the whole path.

Source: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin

Example by MDN:

So, to get origin of the XHR request with PHP you can use:

And, in the case of a direct request, you can combine HTTP_REFERER and REMOTE_ADDR like:

if (array_key_exists('HTTP_REFERER', $_SERVER)) < $origin = $_SERVER['HTTP_REFERER']; >else

So, the possible final solution is:

if (array_key_exists('HTTP_ORIGIN', $_SERVER)) < $origin = $_SERVER['HTTP_ORIGIN']; >else if (array_key_exists('HTTP_REFERER', $_SERVER)) < $origin = $_SERVER['HTTP_REFERER']; >else

MDN is Mozilla Developer Network.

Thanks a lot for help @trine, @waseem-bashir, @p0lt10n, and others persons.

$_SERVER['HTTP_ORIGIN'] // HTTP Origin header $_SERVER['HTTP_HOST'] // HTTP Host header $_SERVER['HTTP_REFERER'] // HTTP Referer header $_SERVER['REMOTE_ADDR'] // HTTP Client's Public IP 

Let’s discuss above $_SERVER parameters.

First, XHR is at client side and it bounds with a http client. As Origin and Referer headers are not mandatory, a client other than standard web browser will not set that. Next Host header may not be mandatory. If your REST server uses virtual hosts, this header is a must to route requests correctly. But this header doesn’t have any detail about the client. Only unique thing for http client is Public IP. But this corresponds to many clients as ISP’s use network address translations or proxies.

Since everything is relative and within bounds, CORS like mechanisms are built on HTTP Origin header. Clients are assumed and advised to be using standard browsers.

In your case, my opinion is it’s OK to depend on Origin header. You can implement CORS mechanism if it suits for you.

in php you can get using $_SERVER[‘HTTP_REFERER’]. if you are using codeigniter then you can get the referrer using $this->agent->is_referral().

CORS not set when sending GET request,

Access-Control-Allow-Origin Response Header Explained (CORS)

In this video tutorial I’ll be explaining what the «Access-Control-Allow-Origin» HTTP Response Duration: 12:34

GET Request Origin

You would need to build a querystring. You can do this by sending something like «http://www.domain.com/welcome.php?referalname=site»

Display later by doing this:

Click here for Extra Help

Most browsers will send HTTP_REFERER. However, chances are if your users are behind firewall, proxies, they can strip off headers before request reaches you. Finally since you do have your own code embedded on various websites, why don’t you simply grab referrer site url and send it to your server like this:

where $ref is the actual referrer url. Isn’t that easy for you compared to not so reliable http referrer header.

$hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']); 

But if the request is from the user playing the game im not sure.

How to bypass Access-Control-Allow-Origin?, there is no way to baypass it. but you can put a file on your backend that performs the request. So you call per ajax the file on your own

PHP Curl — Send Origin Headers With Request

You use coma , instead of => into your array, so CURLOPT_HTTPHEADER is a value of the array, instead of a key.

curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_HEADER => true, // $headers, // 'http://www.example.com', CURLOPT_USERAGENT => 'Sample Request' )); 

PHP script executes even though the client gets a CORS error, The browser inspects the Access-Control-Allow-Origin header it got back from the PHP script. 6.1 a) If it includes the Origin domain (or is

PHP Cross-Origin-Request blocked

Inserting some lines into the Apache .conf file did it. If someone is interested, these lines can be found here. I still don’t know why it didn’t worked with the headers in PHP. Maybe I did something wrong with the client. But it’s working now 🙂

POST request origins, Whenever a POST request comes back to your server, check that the value from the hidden field, is the same as the one in the user’s session.

Источник

How to get http request origin in php

Use $_SERVER[‘HTTP_REFERER’] . It is the address of the page (if any) which referred the user agent to the current page. This is set by the user agent. Not all user agents will set this, and some provide the ability to modify HTTP_REFERER as a feature.

For further restrictions you can perform the following. example.com should be changed to your domain.

IIS set below in web config:

add name="Access-Control-Allow-Origin" value="http://www.example.com" 

Apache set below in httpd.conf/apache.conf

Header add Access-Control-Allow-Origin "http://www.example.com" 

Generally, this header should do the job. Having the domain name in this header

header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN'] . ""); // use domain name instead of $_SERVER['HTTP_ORIGIN'] above 

but if you want to check for more info, use something like the following snippet

$allowed = array('domain1', 'domain2', 'domain3'); if(isset($_SERVER['HTTP_ORIGIN']) && in_array($_SERVER['HTTP_ORIGIN'], $allowed))< // SELECT credentials for this user account from database if(isset($_GET['api_key'], $_GET['app_secret']) && $_GET['api_key'] == 'api_key_from_db' && $_GET['app_secret'] == 'app_secret_from_db' )< // all fine >else < // not allowed >>else < // not allowed >

If the users have to pass more data to your service, use POST instead of GET

Laravel 5: in request method controller:

$origin = request()->headers->get('origin'); 

Источник

Читайте также:  Примеры резюме разработчика python
Оцените статью