Предотвращение прямого доступа к странице PHP

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

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

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

EDIT: Чтобы ответить на вопрос, у меня есть jQuery ui-tabs в моем index.php, и внутри этих вкладок есть формы со сценариями, которые не будут работать, если к ним обращаются напрямую. Почему пользователь хотел бы это сделать, я не знаю, я просто считаю, что я был бы более удобным для пользователя, предотвращая прямой доступ к формам без скриптов проверки.

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

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

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

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

Почему вы так хотите?

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

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

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

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

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

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

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

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

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

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

 define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); if(IS_AJAX) { //Request identified as ajax request } 

ура!

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

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

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

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

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

В 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.