Как проверить, есть ли запрос, поступающий с того же сервера или другого сервера?

Как проверить, отправляется ли запрос от одного сервера?

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

Ответ 1

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


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

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

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


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

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

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

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

Ответ 2

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

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
}
}

Ответ 3

Я знаю, что это старый поток, но кто-то, возможно, найдет его актуальным.

Ответ: Да, вы можете. Но это зависит от того, установлен ли ваш сервер 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);
}