Запретить прямой доступ к странице PHP

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

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

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

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

В этом случае не беспокойтесь о удобстве использования. На самом деле, я бы сказал, что вам лучше рано потерпеть неудачу, чем пытаться сделать это приятным. Например, предположим, что у вас есть перенаправление на index.php для посещений без использования AJAX. Результат: кто-то гарантированно добавит AJAX-скрипт в закладки, так как он попадет на вашу домашнюю страницу.

Kirk Strauser 09.10.2008 17:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
17
1
16 275
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

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

Зачем вы вообще хотите это делать?

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

Больше ничего нельзя сказать. Никогда, Когда-либо не доверяет тому, что вам отправляет клиент. Поскольку методы AJAX предназначены для возврата данных в браузер, убедитесь, что в бэкэнде могут быть возвращены только авторизованные данные.

Kirk Strauser 09.10.2008 04:47

Я сожалею только о том, что у меня есть только один голос, чтобы дать этот ответ.

Jacob Krall 09.10.2008 08:26

Сожалею только о том, что у меня косточка.

scronide 09.10.2008 10:41

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

Kzqai 25.09.2009 02:36

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

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

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

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

Мне нравится «маленькое оружие в борьбе с безопасностью через безвестность». часть - не возражаете, если я процитирую это когда-нибудь? :)

J.C. Inacio 25.09.2009 02:42

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

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

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

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

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

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

Подделать заголовок реферера очень просто.

Alex Weinstein 09.10.2008 08:15

@Alex Правильно, что было бы одной из причин, включенных в утверждение «может быть пустым по многим причинам». Когда-либо ответ на этой странице может быть подделан, потому что все они являются методами ввода клиента - данными, которые клиент отправляет на сервер. Отметьте каждый ответ на этой странице как отрицательный.

Eric Tuttleman 09.10.2008 08:19
Ответ принят как подходящий

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

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

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

Я получаю неопределенный индекс: HTTP_X_REQUESTED_WITH. Вы имеете в виду, что я должен сам присвоить это значение?

syaz 09.10.2008 07:32

Какую структуру вы используете для запросов Ajax? (Надеюсь, вы не используете самодельный раствор ...)

Eran Galperin 09.10.2008 07:59

Кроме того, этот параметр будет доступен ТОЛЬКО внутри запроса Ajax. Вы можете добавить проверку isset (), если вам не нужна неопределенная ошибка индекса.

Eran Galperin 09.10.2008 09:19

Видимо ты прав. Это именно то, что я хочу, базовая безопасность. Даже если пользователь подделает HTTP_X_REQUESTED_WITH (как это вообще можно сделать?), В моем случае это не имеет значения.

syaz 09.10.2008 14:59

Сяз, это не элементарная безопасность. Как правильно сказал Эран - «вы никогда не должны основывать свою безопасность на этой проверке». Было бы ОЧЕНЬ легко подделать (я уверен, что wget или многочисленные плагины firefox могут сделать это очень просто). Вы все еще не сказали, почему вам может понадобиться это - что тут обезопасить?

Draemon 09.10.2008 23:59

Я уже редактировал свой первый пост, чтобы заявить о том, чего я хочу достичь - удобстве для пользователя. Так просто. ;)

syaz 10.10.2008 03:40

также проверьте HTTP_REFFERER - это должен быть только ваш домен. Потому что ваш скрипт может быть включен, например, в iframe в другом домене

Tomas Šivickas 02.01.2017 16:55

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

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

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

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

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

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

ваше здоровье!

В файле 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.

Другие вопросы по теме