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

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

7
задан Yossi 6 May 2010 в 21:09
поделиться

5 ответов

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

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

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

1
ответ дан 7 December 2019 в 03:12
поделиться

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

  1. На вашем сайте создайте секретную строку. Я использую HMAC($_SERVER['REMOTE_ADDR'], key).
  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.

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

8
ответ дан 7 December 2019 в 03:12
поделиться

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

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

2
ответ дан 7 December 2019 в 03:12
поделиться

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

0
ответ дан 7 December 2019 в 03:12
поделиться

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

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

-2
ответ дан 7 December 2019 в 03:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: