Как запретить моим пользователям доступ напрямую к страницам, предназначенным только для вызовов ajax?
Передача ключа во время вызова ajax кажется решением, тогда как доступ без ключа не будет обработан. Но ведь и ключ изготовить легко, не так ли? Источник Проклятия Видения ...
p / s: Использование Apache в качестве веб-сервера.
Обновлено: Чтобы ответить, почему, у меня есть jQuery ui-tabs в моем index.php, а внутри этих вкладок находятся формы со сценариями, которые не будут работать, если к ним получить прямой доступ. Я не знаю, зачем пользователю это делать, я просто полагаю, что я был бы более удобным для пользователя, запретив прямой доступ к формам без сценариев проверки.






Невозможно гарантировать, что они получают доступ к нему через AJAX. И прямой доступ, и доступ AJAX исходят от клиента, поэтому его легко подделать.
Зачем вы вообще хотите это делать?
Если это связано с тем, что код PHP не очень безопасен, сделайте код PHP более безопасным. (Например, если ваш AJAX передает идентификатор пользователя в файл PHP, напишите код в файле PHP, чтобы убедиться, что это правильный идентификатор пользователя.)
Больше ничего нельзя сказать. Никогда, Когда-либо не доверяет тому, что вам отправляет клиент. Поскольку методы AJAX предназначены для возврата данных в браузер, убедитесь, что в бэкэнде могут быть возвращены только авторизованные данные.
Я сожалею только о том, что у меня есть только один голос, чтобы дать этот ответ.
Сожалею только о том, что у меня косточка.
Поскольку ему нужно только удобство использования, проверка XMLHttpRequest кажется прекрасным решением, если безопасность не имеет к этому никакого отношения.
Похоже, вы ошибаетесь. Вызов AJAX аналогичен стандартному запросу страницы, только по соглашению ответ не предназначен для отображения пользователю.
Однако это по-прежнему запрос клиента, и поэтому вы должны быть счастливы, если клиент сможет увидеть ответ. Такое запутывание доступа с помощью «ключа» только усложняет ситуацию.
На самом деле я бы сказал, что «проклятие» источника зрения - небольшое оружие в борьбе с безопасностью через безвестность.
Так в чем причина вашего желания это сделать?
Мне нравится «маленькое оружие в борьбе с безопасностью через безвестность». часть - не возражаете, если я процитирую это когда-нибудь? :)
Если браузер вызывает вашу страницу по обычному запросу или с помощью 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 Правильно, что было бы одной из причин, включенных в утверждение «может быть пустым по многим причинам». Когда-либо ответ на этой странице может быть подделан, потому что все они являются методами ввода клиента - данными, которые клиент отправляет на сервер. Отметьте каждый ответ на этой странице как отрицательный.
Как говорили другие, запрос Ajax можно эмулировать, создавая правильные заголовки. Если вы хотите выполнить базовую проверку, чтобы узнать, является ли запрос запросом Ajax, вы можете использовать:
if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
//Request identified as ajax request
}
Однако вы никогда не должны основывать свою безопасность на этой проверке. Это исключит прямой доступ к странице, если это то, что вам нужно.
Я получаю неопределенный индекс: HTTP_X_REQUESTED_WITH. Вы имеете в виду, что я должен сам присвоить это значение?
Какую структуру вы используете для запросов Ajax? (Надеюсь, вы не используете самодельный раствор ...)
Кроме того, этот параметр будет доступен ТОЛЬКО внутри запроса Ajax. Вы можете добавить проверку isset (), если вам не нужна неопределенная ошибка индекса.
Видимо ты прав. Это именно то, что я хочу, базовая безопасность. Даже если пользователь подделает HTTP_X_REQUESTED_WITH (как это вообще можно сделать?), В моем случае это не имеет значения.
Сяз, это не элементарная безопасность. Как правильно сказал Эран - «вы никогда не должны основывать свою безопасность на этой проверке». Было бы ОЧЕНЬ легко подделать (я уверен, что wget или многочисленные плагины firefox могут сделать это очень просто). Вы все еще не сказали, почему вам может понадобиться это - что тут обезопасить?
Я уже редактировал свой первый пост, чтобы заявить о том, чего я хочу достичь - удобстве для пользователя. Так просто. ;)
также проверьте HTTP_REFFERER - это должен быть только ваш домен. Потому что ваш скрипт может быть включен, например, в iframe в другом домене
Это определенно бесполезно для защиты чего-то ... но я думаю, что это может быть полезно, если вы хотите сказать, что 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.
В этом случае не беспокойтесь о удобстве использования. На самом деле, я бы сказал, что вам лучше рано потерпеть неудачу, чем пытаться сделать это приятным. Например, предположим, что у вас есть перенаправление на index.php для посещений без использования AJAX. Результат: кто-то гарантированно добавит AJAX-скрипт в закладки, так как он попадет на вашу домашнюю страницу.