Я использую свой бэкенд PHP для обнаружения запросов Ajax путем проверки на значение в $_SERVER['HTTP_X_REQUESTED_WITH']
.
Это дает мне надежное обнаружение, удостоверяясь, что запрос выполнен, использовав методы Ajax.
Как я могу удостовериться, что запрос прибыл из моего собственного домена и не внешнего домена/робота?
www.example.com/ajax?true мог позволить любому выполнять вызов Ajax и сокращать информацию.
Я мог сделать сессии для всех, которые обычно вводят мой веб-сайт, и затем позвольте вызовы Ajax.. но это может фальсифицироваться также.
Это даже имеет значение в эти дни?
Позволяет контроллеру
В вашем представлении
Снова в вашем контроллере
Проверяйте эти рекомендации по безопасности от OpenAjax .
Также прочтите статью на codinghorror.com, по ссылке Энни.
Вы можете проверить HTTP_REFERRER, но не все браузеры устанавливают его. Лучший способ - написать оболочку для ваших вызовов ajax на стороне JavaScript, которая отправляет часть document.cookie обратно на сервер - только ваш домен имеет доступ к cookie. Вы можете сравнить файл cookie в заголовках запроса с файлом cookie в вызове AJAX в php.
В ответ на «имеет ли это значение в наши дни» - ДА, имеет значение! Прочтите .
У Дэвида Уолша есть хорошее решение
/* 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.... */
Проверьте $ _ SERVER ['HTTP_REFERER']
. Это будет работать во многих случаях, но не следует путать с полностью безопасным решением.
Относительно вашего последнего вопроса: "Имеет ли это хоть какое-то значение в наши дни?" Это индивидуальный вопрос. Если запрос ajax делает что-то, что не требует обеспечения безопасности (например, загрузка последних котировок акций), то это действительно не имеет значения IMHO. Если запрос загружает информацию, которая должна быть защищена (например, возвращает идентифицирующую информацию или делает что-то на сервере), то вы должны относиться к этому как к таковому. Лично я не использую переменные сервера, чтобы знать, когда что-то является ajax-запросом. Вместо этого я просто добавляю параметр запроса к вызову ajax (например, http://domain.com/?ajax=true). Если мне нужно обезопасить вызов ajax, то я буду использовать те же методы, что и обычный запрос страницы (используя и клиента, и сервер). Как отметил Лукас Оман, все, что находится на стороне клиента, может быть подделано. В итоге, я не доверяю ни одному запросу, даже если вы думаете, что он поступает с вашего сайта или базы данных. Всегда следуйте мантре "входной фильтр - выходной эвакуационный".
На самом деле, самый безопасный способ сделать это - это, как вы предложили, использовать сеансы на стороне сервера, так как они не могут быть созданы как cookies.
Разрешено, кто-то все еще может перехватить идентификатор сеанса, но если вы также сохраните IP-адрес пользователя в его сеансе и будете проверять его на каждом запросе, вы сможете вычистить много перехватов. Только кто-то в той же сети или прокси может перехватить его.
Любой другой упомянутый метод - cookies, javascript, http referer - зависит от данных на стороне клиента, которые небезопасны и всегда должны подозреваться в подделке, подделке, перехвате и вредоносной сконструированности.
.