Как я могу ограничить доступ к некоторым страницам PHP только со страниц моего сайта?

У меня на моем веб-сайте есть страница PHP, которая извлекает данные из моей базы данных, которые будут представлены на моем веб-сайте. Эта страница вызывается через AJAX. Как я могу ограничить доступ к нему только со страниц моего веб-сайта, поэтому пользователи, которые хотят злоупотреблять им и получать эти данные не с веб-сайта (например, отправлять HTTP-запрос со своего сервера), не смогут это сделать?

Solutions Collecting From Web of "Как я могу ограничить доступ к некоторым страницам PHP только со страниц моего сайта?"

JavaScript, запущенный на другом сайте, не сможет получить доступ к вашему сайту из -за политики одинакового происхождения для XHR . Но ничто не мешает кому-либо создавать скрипт PHP + CURL для «прокси» данных из вашего ajax, чтобы он выглядел так, как будто он работал на своем сервере. Попытка черных списков клиентов беспорядочна, ip-адрес дешевый и бесплатный HTTP-прокси в изобилии.

Короче, нет ничего особенного в вашем javascript. Клиент может делать все, что захочет, и вы не можете заставить его вести себя, это основа «доверия к клиентскому сайту». Хакер может использовать что-то вроде tamperdata или даже firebug для определения HTTP-запросов, и он сможет воспроизвести их или подделать их с помощью CURL.

Вы можете попробовать обфускацию вашего javascript. Но в конце концов злоумышленник просто собирается перепрограммировать HTTP-запрос, и есть абсолютно то, что вы можете с этим поделать.

Вот что я делаю,

  1. Создайте секретную строку на своем веб-сайте. Я использую HMAC (ключ $ _ SERVER ['REMOTE_ADDR']).
  2. Напишите секрет в Javascript var.
  3. В вызове AJAX передайте эту строку в качестве параметра.
  4. На сервере AJAX снова сделайте хэш. Если он совпадает с параметром, вызов выполняется с вашей страницы.

EDIT: примеры кода,

На вашем веб-сайте вы делаете это,

$key = 'supersecretkey'; // This is your security, don't expose this $nonce = rand(); $timestamp = time(); $signature = hash_hmac('sha1', $_SERVER['REMOTE_ADDR'] . $nonce . $timestamp, $key); 

Распечатайте vars на странице,

 <script type="text/javascript"> <?php echo " var signature = '" . $signature . "';\n"; echo " var nonce = '" . $nonce . "';\n"; echo " var timestamp = '" . $timestamp . "';\n"; ?> </script> 

Когда вы совершаете вызов AJAX, передайте 3 параметра на сервер,

  http://example.com?signature=...&nonce=...&timestamp=... 

На сервере AJAX выполните вычисления снова,

 $key = 'supersecretkey'; // This is your security, don't expose this $nonce = $_REQUEST['nonce']; $timestamp = $_REQUEST['timestamp']; $signature = hash_hmac('sha1', $_SERVER['REMOTE_ADDR'] . $nonce . $timestamp, $key); if ($signature == $_REQUEST['signature']) // the call if from my page. 

Вы также можете отмечать временную метку для валюты и nonce для воспроизведения (требуется сеанс или хранилище данных).

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

Есть вещи, которые вы можете сделать, чтобы сделать его труднее для кого-то, например, проверить поля заголовка HTTP, такие как Referer и User-Agent, и реализовать проверку сеанса в вызовах AJAX.

Увы, это невозможно. Все, что может сделать Javascript, «злоумышленник» может также делать со своего сервера. Вы можете сделать это более трудным, запутывая javascript и протокол, делая его более трудным нюхать. Существуют различные бесплатные и несвободные javacript obfuscators (также известные как «минимизация»). Обфускация протокола, который вы можете сделать, путем внедрения простой схемы шифрования (что делает ее более продвинутой, не поможет, поскольку ключ всегда должен быть встроен в ваш код) для отправленных и полученных данных.

Аналогично @ ZZ-кодеру ответ, но вы можете сделать это с помощью файлов cookie.

1) Установите файл cookie на сервере (хэш «ip-address + secret»), непостоянный файл cookie, который длится только 1 сеанс, после входа пользователя в систему.

2) Проверяйте файл cookie на сервере во время запросов AJAX (поскольку файлы cookie также отправляются с запросами AJAX)

Это похоже на ответ @ ZZ-кодера, но вы можете полностью пропустить часть JS.

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

http://java.sun.com/developer/technicalArticles/J2EE/usingapikeys/