Как проверить, поступает ли запрос с того же сервера или с другого сервера? - PullRequest
16 голосов
/ 23 марта 2011

Как я могу проверить, отправляется ли полученный запрос с того же сервера ??

Скажем, у меня есть мой домен на www.domain.com. Теперь у меня есть php-файлы для обработки форм, размещенных в этом домене. Эти процессы будут выполняться, только если запросы отправляются из домена, т.е. www.domain.com и любые другие запросы, отправленные с других доменов, будут отклонены.

Ответы [ 3 ]

58 голосов
/ 23 марта 2011

В основном: вы не можете.
При использовании протокола HTTP каждый запрос не зависит от других.


Первой идеей было бы проверить заголовок HTTP Referer, но учтите, что:

  • Может быть подделано (отправлено браузером)
  • Это не всегда присутствует.

Итак: не надежное решение.


Возможное и гораздо лучшее, чем идея Referer, решение может заключаться в использовании nonce :

  • При отображении формы введитескрытое поле ввода, содержащее случайное значение
  • Одновременно сохраните это случайное значение в сеансе, соответствующем пользователю.
  • Когда форма отправлена, убедитесь, чтоскрытое поле имеет то же значение, что и то, которое хранится в сеансе.

Если эти два значения не совпадают, откажитесь от использования отправленных данных.

Примечание: эта идеячасто используется для помощи в борьбе против CSRF - и интегрируется в «форму» cкомпонент некоторых фреймворков (например, Zend Framework ) .

8 голосов
/ 23 августа 2017

это проверит, есть ли реферер, затем сравнит его с текущим доменом, если он отличается от внешнего реферера

if ((isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER']))) {
if (strtolower(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST)) != strtolower($_SERVER['HTTP_HOST'])) {
// referer not from the same domain
}
}
2 голосов
/ 09 декабря 2015

Я знаю, что это старая тема, но кто-то еще может найти ее актуальной.

Ответ: Да, вы можете .Но это зависит от того, настроен ли ваш сервер Apache / nginx для заполнения переменной $ _SERVER необходимой информацией.Большинство серверов являются серверами, поэтому, вероятно, вы можете использовать этот подход.

Вам нужно извлечь HTTP_REFERER из переменной $ _SERVER и сравнить с вашим доменом.

<?php
function requestedByTheSameDomain() {
    $myDomain       = $_SERVER['SCRIPT_URI'];
    $requestsSource = $_SERVER['HTTP_REFERER'];

    return parse_url($myDomain, PHP_URL_HOST) === parse_url($requestsSource, PHP_URL_HOST);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...