Запретить прямой доступ к странице PHP - PullRequest
16 голосов
/ 09 октября 2008

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

Передача ключа во время вызова ajax кажется решением, тогда как доступ без ключа не будет обрабатываться. Но это также легко изготовить ключ, нет? Проклятие источника зрения ...

p / s: использование Apache в качестве веб-сервера.

РЕДАКТИРОВАТЬ: Чтобы ответить почему, у меня есть jQuery ui-tabs в моем index.php, и внутри этих вкладок есть формы со скриптами, которые не будут работать, если к ним обращаются напрямую. Почему пользователь захочет это сделать, я не знаю, я просто думаю, что был бы более дружественным к пользователю, запретив прямой доступ к формам без сценариев проверки.

Ответы [ 10 ]

34 голосов
/ 09 октября 2008

Нет способа гарантировать, что они получают к нему доступ через AJAX. И прямой доступ, и AJAX-доступ исходят от клиента, поэтому его легко подделать.

Почему ты так хочешь?

Если это потому, что код PHP не очень безопасен, сделайте код PHP более безопасным. (Например, если ваш AJAX передает идентификатор пользователя в файл PHP, напишите код в файле PHP, чтобы убедиться, что это правильный идентификатор пользователя.)

21 голосов
/ 09 октября 2008

Как уже говорили другие, запрос Ajax можно эмулировать, создав надлежащие заголовки. Если вы хотите пройти базовую проверку, чтобы узнать, является ли запрос Ajax-запросом, вы можете использовать:

 if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
     //Request identified as ajax request
 }

Однако вы никогда не должны основывать свою безопасность на этом чеке. Это исключит прямой доступ к странице, если это то, что вам нужно.

8 голосов
/ 09 октября 2008

Звучит так, как будто вы все делаете неправильно. Вызов AJAX похож на стандартный запрос страницы, только условно ответ не предназначен для отображения пользователю.

Это, однако, запрос клиента, и поэтому вы должны быть рады, что клиент сможет увидеть ответ. Таким образом, запутывание доступа с использованием «ключа» только усложняет ситуацию.

Я бы сказал, что «проклятие» источника зрения - это маленькое оружие в борьбе с безопасностью через мрак.

Так в чем же причина вашего желания сделать это?

4 голосов
/ 09 октября 2008

Если браузер будет вызывать вашу страницу по обычному запросу или через ajax, то кто-то может вызвать ее вручную. На самом деле не существует четко определенной разницы между обычными и ajax-запросами в том, что касается взаимодействия сервер-клиент.

Распространенным случаем является передача на сервер заголовка с надписью "этот запрос был выполнен ajax". Если вы используете Prototype, он автоматически устанавливает заголовок http «X-Requested-With» в «XMLHttpRequest», а также некоторые другие заголовки, включая версию прототипа. (См. Больше в http://www.prototypejs.org/api/ajax/options в "requestHeaders")

Добавить: Если вы используете другую библиотеку AJAX, вы можете добавить свой собственный заголовок. Это полезно для того, чтобы узнать тип запроса на стороне сервера и избежать простых случаев, когда в браузере запрашивается страница ajax. Он не защищает ваш запрос от всех, потому что вы не можете.

1 голос
/ 17 февраля 2011

спасибо, хотя я использую

define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');

if(IS_AJAX) {
    //Request identified as ajax request
}

ура! * * 1004

1 голос
/ 25 сентября 2009

COOKIES небезопасны ... попробуйте $ _SESSION. Это в значительной степени одна из немногих вещей, на которую вы можете положиться на кросс-странице, которую нельзя подделать. Потому что, конечно, по сути, он никогда не покидает ваш контроль.

0 голосов
/ 03 февраля 2014

В файле JavaScript, который вызывает скрипт:

var url = "http://website.com/ajax.php?say=hello+world";
xmlHttp.open("GET", url, true);
xmlHttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

затем в php-файле ajax.php:

if($_SERVER['HTTP_X_REQUESTED_WITH'] != "XMLHttpRequest") {
    header("Location: http://website.com");
    die();
}

Вундеркинды все еще могут вызывать скрипт ajax.php, подделывая заголовок, но остальная часть моего скрипта требует сеансов, поэтому выполнение заканчивается, когда не обнаружен действительный сеанс. Мне нужно, чтобы это работало, чтобы перенаправить людей с просроченными гибридными сеансами на главный сайт, чтобы снова войти в систему, потому что они в конечном итоге были перенаправлены на сценарий ajax.

0 голосов
/ 26 марта 2010

Передайте ваши прямые запросы через index.php, а ваши ajax-запросы - через ajax.php, а затем не позволяйте пользователю напрямую переходить к любому другому исходному файлу - убедитесь, что index.php и ajax.php имеют соответствующую логику для включения код, который им нужен.

0 голосов
/ 15 августа 2009

Это определенно бесполезно для обеспечения безопасности ... но я думаю, что это может быть полезно, если вы хотите сказать, что страница php генерирует целую страницу, если страница не была запрошена ajax, а генерирует только ту часть, которая Вы должны были вернуться, когда использовался Ajax. Это позволит вам сделать ваш сайт не дружественным к AJAX, поэтому, если, скажем, они нажимают на ссылку, и он должен загрузить ящик комментариев, но у них нет AJAX, он все равно отправляет их страница, которая затем создается как целая страница с комментариями.

0 голосов
/ 09 октября 2008

Не уверены в этом, но, возможно, проверьте заголовок реферера? я думаю, что если кто-то введет ваш URL-адрес вручную, у него не будет заголовка реферера, в отличие от вызовов AJAX (по крайней мере, в быстром тесте, который я только что провел в моей системе).

Хотя это плохой способ проверки. Реферер может быть пустым по многим причинам. Вы пытаетесь помешать людям использовать ваш веб-сервис в качестве публичного сервиса или чего-то еще?

После прочтения ваших комментариев редактирования, если формы будут загружаться с помощью вызовов ajax, вы можете проверить window.location, чтобы увидеть, является ли url URL-адресом вашей формы ajax. если это так, перейдите на нужную страницу через document.location

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...