Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Почему вы все равно хотите сделать это?

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

Ответ 3

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

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

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

Итак, какова ваша причина для этого?

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

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

ура!

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

В javascript файле, который вызывает script:

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 script, создавая заголовок, но остальные мои script требуют сеансов, поэтому выполнение завершается, когда не обнаружен действительный сеанс. Мне нужно было работать, чтобы перенаправить людей с истекшими гибридными сеансами на главный сайт, чтобы снова войти в систему, потому что они были перенаправлены на ajax script.