Как я могу ограничить доступ к некоторым страницам PHP только со страниц моего сайта? - PullRequest
7 голосов
/ 07 мая 2010

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

Ответы [ 6 ]

8 голосов
/ 07 мая 2010

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

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

РЕДАКТИРОВАТЬ: примеры кода,

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

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

Распечатайте переменные на страницу,

<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 для воспроизведения (необходим сеанс или хранилище данных).

2 голосов
/ 07 мая 2010

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

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

1 голос
/ 07 мая 2010

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

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

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

0 голосов
/ 05 декабря 2014

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

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

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

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

0 голосов
/ 07 мая 2010

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

0 голосов
/ 07 мая 2010

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

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

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