Как убедиться, что человек не просматривает результаты по URL-адресу скрипта PHP? - PullRequest
3 голосов
/ 09 августа 2009

Как убедиться, что человек не просматривает результаты по URL-адресу скрипта PHP?

Недавно при просмотре источника сайта, который делал AJAX-вызов, я попытался перейти по ссылке в браузере

www.site.com/script.php?query=value

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

Как вы ограничиваете скрипт только тем, чтобы разрешить скрипту доступ к нему?

UPDATE:

вот эта страница ДЕМО-страница

Ответы [ 8 ]

10 голосов
/ 09 августа 2009

Краткий ответ: вы не можете.

Длинный ответ: Вы можете усложнить задачу, потребовав специальные значения заголовка в HTTP-запросе (часто встречается настройка Accept to application / json) На стороне сервера просто убедитесь, что в заголовке установлено ожидаемое вами значение. Это позволит обычным пользователям получать упомянутое вами сообщение, и ваши сценарии будут работать нормально. Конечно, продвинутые пользователи смогут легко обойти подобные ограничения, поэтому не полагайтесь на них в плане безопасности.

9 голосов
/ 09 августа 2009

с php вы можете проверять и отображать результаты, только если страница вызывается через ajax

function isAjax() {
    return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'));
}

if(isAjax()) {
    // display content
} else {
    // not ajax, dont show
    echo 'Invalid Request';
}
6 голосов
/ 09 августа 2009

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

4 голосов
/ 09 августа 2009

Одним из возможных решений является проверка HTTP-запроса на его происхождение. Другим решением является отправка «пароля» с каждым запросом. Посмотрите этот урок , как это сделать.

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

1 голос
/ 09 августа 2009

Как сказал Тим, этот сценарий почти наверняка ищет этот заголовок запроса, который отправляется с каждым запросом к rpc.php (естественно, через панель net в firebug):

X-Requested-With    : XMLHttpRequest

Что касается кросс-браузерной совместимости, метод setRequestHeader представляется доступным как для соединений activex, так и для xmlhttprequest, поэтому он должен работать во всех основных современных браузерах.

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

Вы можете установить секретное значение в сеансе php с помощью скрипта 'view' и проверить его с помощью скриптов ajax.

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

Это гарантирует, что только аутентифицированные браузеры могут делать запросы AJAX.

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

http://us.php.net/manual/en/book.session.php

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

Многие приложения с открытым исходным кодом используют разные варианты в верхней части каждого php-файла:

if (!defined('SOMETHING')) {
    die('only scripts have direct access');
}

Затем в index.php они определяют что-то:

define("SOMETHING", "access granted.");

редактировать: я не говорю, что это хороший подход, кстати

edit2: Кажется, я пропустил часть о том, что это ajax-запрос. Я согласен, что в этом случае это не решение.

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

Если вы вызываете скрипт с помощью AJAX, то он ДОЛЖЕН быть доступен вам, потому что вызов AJAX аналогичен вашему браузеру, запрашивающему страницу, поэтому он не только доступен для скрипта, но и доступен любому.

Если бы он был вызван PHP или каким-либо другим способом, вы могли бы «возможно» использовать правила Apache или сценарии PHP для уменьшения доступности.

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