Возможный дубликат:
Предотвращение прямого доступа к файлу, вызываемому функцией ajax
Я создаю сайт, который полагается на вызовы AJAX на страницу PHP. Есть ли способ предотвратить доступ к необработанным данным? (т.е. доступ к файлу php через собственные почтовые запросы).
Я бы предположил, что лучший способ сделать это (если возможно) будет состоять в том, чтобы помешать PHP отправлять данные во все, что не исходит от AJAX (так как это должно происходить из того же домена). Какие-либо предложения?
if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { //allow access } else die("Direct access restricted");
Это жуткий, хотя
Вы можете просто ничего не вернуть, если у запроса нет соответствующих переменных GET или POST.
С учетом сказанного, честно говоря, не о чем беспокоиться, так как любой, кто действительно просматривает страницу, на которую вы отправляете запросы ajax, вероятно, пытается сделать что-то злонамеренное, и они получают то, что отправлено через ajax, ничего не получают. Нет обычного пользователя в каждом представлении источника …
Библиотеки Ajax добавляют в свои запросы заголовок X-Requested-With: XmlHttpRequest
, поэтому вы можете проверить его наличие:
if (!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XmlHttpRequest')) { // not an ajax request }
Однако злоумышленник может также легко отправить этот заголовок, поэтому не используйте его для защиты конфиденциальных данных.
Как отметил @Evan в своем комментарии, вы можете обнаруживать запросы XmlHttpRequest, ища HTTP_X_REQUESTED_WITH
в $_SERVER
. Но это значение происходит от отправки заголовка клиентом. Как и любая информация от пользователя, это может быть подделано.
Практически невозможно блокировать не-XmlHttpRequest. Если вам действительно важно блокировать API, вы можете выпустить уникальный ключ для Javascript (и сохранить его в сеансе) по запросу на главную страницу. Он передается в XmlHttpRequest, и когда эта страница видит его и проверяет его, он дает доступ. Но даже этот уникальный ключ можно соскоблить со страницы.