При обнаружении Ajax в PHP и проверке запрос был от моего собственного сайта

Я использую свой бэкенд PHP для обнаружения запросов Ajax путем проверки на значение в $_SERVER['HTTP_X_REQUESTED_WITH'].

Это дает мне надежное обнаружение, удостоверяясь, что запрос выполнен, использовав методы Ajax.

Как я могу удостовериться, что запрос прибыл из моего собственного домена и не внешнего домена/робота?

www.example.com/ajax?true мог позволить любому выполнять вызов Ajax и сокращать информацию.

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

Это даже имеет значение в эти дни?

46
задан Sᴀᴍ Onᴇᴌᴀ 12 June 2017 в 15:47
поделиться

6 ответов

Позволяет контроллеру

  • сгенерировать токен доступа
  • , сохранить в сеансе для последующего сравнения

В вашем представлении

  • объявить токен доступа как переменную JS
  • отправить токен с каждым запросом

Снова в вашем контроллере

  • проверяйте HTTP_X_REQUESTED_WITH
  • проверяйте токен

Проверяйте эти рекомендации по безопасности от OpenAjax .
Также прочтите статью на codinghorror.com, по ссылке Энни.

32
ответ дан 26 November 2019 в 20:34
поделиться

Вы можете проверить HTTP_REFERRER, но не все браузеры устанавливают его. Лучший способ - написать оболочку для ваших вызовов ajax на стороне JavaScript, которая отправляет часть document.cookie обратно на сервер - только ваш домен имеет доступ к cookie. Вы можете сравнить файл cookie в заголовках запроса с файлом cookie в вызове AJAX в php.

В ответ на «имеет ли это значение в наши дни» - ДА, имеет значение! Прочтите .

23
ответ дан 26 November 2019 в 20:34
поделиться

У Дэвида Уолша есть хорошее решение

/* decide what the content should be up here .... */
$content = get_content(); //generic function;

/* AJAX check  */
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    /* special ajax here */
    die($content);
}

/* not ajax, do more.... */
3
ответ дан 26 November 2019 в 20:34
поделиться

Проверьте $ _ SERVER ['HTTP_REFERER'] . Это будет работать во многих случаях, но не следует путать с полностью безопасным решением.

0
ответ дан 26 November 2019 в 20:34
поделиться

Относительно вашего последнего вопроса: "Имеет ли это хоть какое-то значение в наши дни?" Это индивидуальный вопрос. Если запрос ajax делает что-то, что не требует обеспечения безопасности (например, загрузка последних котировок акций), то это действительно не имеет значения IMHO. Если запрос загружает информацию, которая должна быть защищена (например, возвращает идентифицирующую информацию или делает что-то на сервере), то вы должны относиться к этому как к таковому. Лично я не использую переменные сервера, чтобы знать, когда что-то является ajax-запросом. Вместо этого я просто добавляю параметр запроса к вызову ajax (например, http://domain.com/?ajax=true). Если мне нужно обезопасить вызов ajax, то я буду использовать те же методы, что и обычный запрос страницы (используя и клиента, и сервер). Как отметил Лукас Оман, все, что находится на стороне клиента, может быть подделано. В итоге, я не доверяю ни одному запросу, даже если вы думаете, что он поступает с вашего сайта или базы данных. Всегда следуйте мантре "входной фильтр - выходной эвакуационный".

6
ответ дан 26 November 2019 в 20:34
поделиться

На самом деле, самый безопасный способ сделать это - это, как вы предложили, использовать сеансы на стороне сервера, так как они не могут быть созданы как cookies.

Разрешено, кто-то все еще может перехватить идентификатор сеанса, но если вы также сохраните IP-адрес пользователя в его сеансе и будете проверять его на каждом запросе, вы сможете вычистить много перехватов. Только кто-то в той же сети или прокси может перехватить его.

Любой другой упомянутый метод - cookies, javascript, http referer - зависит от данных на стороне клиента, которые небезопасны и всегда должны подозреваться в подделке, подделке, перехвате и вредоносной сконструированности.

.
2
ответ дан 26 November 2019 в 20:34
поделиться
Другие вопросы по тегам:

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