Блокирование запросов, не связанных с AJAX, PHP

Возможный дубликат:
Предотвращение прямого доступа к файлу, вызываемому функцией 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, и когда эта страница видит его и проверяет его, он дает доступ. Но даже этот уникальный ключ можно соскоблить со страницы.