У меня есть в моем веб-сайте страница PHP, которая получает данные из моей базы данных, которая будет представлена в моем веб-сайте. Эту страницу называют через Ajax. Как я могу ограничить доступ к нему только от страниц в моем веб-сайте так пользователи, кто хочет злоупотребить им и получить эти данные не от веб-сайта (например, Запрос HTTP регистрации с их сервера) самого не сможет сделать так?
JavaScript, запущенный на другом сайте, не сможет получить доступ к вашему сайту из-за Same-Origin Policy for XHR. Но ничто не мешает кому-то создать PHP+CURL-скрипт для "проксирования" данных из вашего ajax-бэкграунда, чтобы создать впечатление, что он работает на их сервере. Пытаться заносить клиентов в черный список - дело муторное, ip-адреса стоят дешево, а бесплатных http-прокси полно.
Короче говоря, в вашем javascript нет ничего особенного. Клиент может делать все, что захочет, и вы не можете заставить его вести себя хорошо, это основа "доверия к сайту клиента". Хакер может использовать что-то вроде tamperdata или даже firebug для идентификации HTTP-запросов, и он сможет воспроизвести их или подделать с помощью CURL.
Вы можете попробовать обфускацию вашего javascript. Но в конце концов злоумышленник просто воспроизведет http-запрос, и вы абсолютно ничего не сможете с этим поделать.
Вот что я делаю,
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=...×tamp=...
На 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.
Вы также можете проверить timestamp для валюты и nonce для воспроизведения (нужна сессия или хранилище данных).
. На самом деле это невозможно сделать, если указано, как указано выше, вам потребуется переработать и реализовать какую-то схему аутентификации, но даже ее можно эмулировать. Короткий ответ заключается в том, что если веб-браузер может получить к нему доступ, то все может получить к нему доступ, пока он притворяется браузером.
Есть вещи, которые могут усложнить кому-то, например, проверка полей заголовка HTTP, таких как Referer и User-Agent, и реализация проверки сеанса в вызовах AJAX.
Увы, это невозможно. Все, что может сделать Javascript, «злоумышленник» также может делать со своего сервера. Вы можете усложнить задачу, запутав javascript и протокол, усложнив их сниффинг. Доступны различные бесплатные и платные обфускаторы javascript (также известные как «минимизация»). Обфускация. протокол, который вы можете реализовать, реализовав простую схему шифрования (делая ее более продвинутой, это не поможет, поскольку ключ всегда должен быть встроен в ваш код) для отправляемых и получаемых данных.
Существует множество вариантов в зависимости от того, какова ваша основная потребность, будет ли это сервис, к которому вы предоставите доступ другим, или что-то только внутреннее. Вот статья с хорошим подробным объяснением вариантов.
http://java.sun.com/developer/technicalArticles/J2EE/usingapikeys/