Получение домена, который вызывает файл PHP на вашем сервере через AJAX - PullRequest
4 голосов
/ 04 августа 2011

Я создаю API и у меня есть вопрос о том, как отслеживать / знать, какие домены используют вызов.

Вызов API построен на PHP и не требует никакой аутентификации. Скорее всего, пользователь будет использовать API в вызове AJAX на своем сервере.

Так, например, мой домен, который обслуживает файл API PHP, называется dev.yourmapper.com. Кто-то в домене www.metromapper.org создает страницу, которая создает карту Google, и вызывает мой файл, используя Ajax, чтобы наложить мои данные на их карту.

Вот этот пример в действии: http://www.metromapper.org/example/apitest.htm

(Нажмите на маркер центральной карты, чтобы увидеть всплывающее окно со всеми переменными PHP-сервера, доступными для сценария yourmapper.com.)

Обратите внимание, что HTTP_REFERER, скорее всего, будет «stackoverflow.com», если вы щелкнете ссылку (или пустым, если вы удалите и вставите ссылку). Я думаю, что реферером будет metromapper.org, так как этот домен вызывает скрипт yourmapper.com после загрузки, но, очевидно, нет.

Итог: какой метод я могу использовать, чтобы определить, какой домен вызывает мой скрипт yourmapper.com с Javascript? Я могу использовать другие языки, кроме PHP, если это необходимо. Спасибо.

Ответы [ 2 ]

3 голосов
/ 16 августа 2011

«Я думаю, что реферером будет metromapper.org, так как этот домен вызывает скрипт yourmapper.com после загрузки»

Это на самом деле неверно. Во-первых, вы никогда не должны полагаться на HTTP_REFERER, потому что это добровольный параметр, передаваемый большинством (не всеми) браузерами, и его можно легко подделать. Я могу отправлять запросы на ваш сайт, используя CURL, чтобы это выглядело так, как если бы я хотел, чтобы реферер был whitehouse.gov. Там нет никаких мер безопасности.

Это, как говорится. Браузер устанавливает этот параметр для страницы, которая направляла пользователя на текущую загруженную страницу. Не сценарий. Поэтому причина, по которой вы видите результат, кроется в том, что пользователь ссылался на metromapper.org по ссылке на stackoverflow.com

Наконец, давайте перейдем к сочной части. Вы используете JS для кодирования вещей в браузере. Это нормально, и с этим абсолютно никаких проблем. Но вы должны помнить, что JS с открытым исходным кодом. Так что люди могут (и будут) связываться с вашим кодом, чтобы играть с вашим API только потому, что они могут. Что, как говорится. Лучше всего, вероятно, передать URL-адрес сайта вместе с запросом в вашем JS API. Это лучший способ «отследить», какие сайты используют ваш скрипт. Вы можете проверить серверную часть, чтобы убедиться, что URL был передан. Это помешает пользователям изменять ваш API, чтобы удалить бит, который отправляет их URL на ваш сервер. Однако это не помешает им изменить его для использования чужого или случайного незарегистрированного URL в качестве параметра.

Конечно, вы можете создать PHP API, который они запускают на своем сервере. JS API соединяется с PHP API, а PHP API закодирован Zend-Guard (или какой-либо другой системой кода защиты исходного кода), но все равно найдутся люди, которые декодируют файл, чтобы вернуться к вашему источнику и связываться с вами. Конечно, было бы гораздо меньше людей, способных сделать это, и средний пользователь просто предпочел бы использовать ваш API как есть. Кроме того, у вас также есть проблема с людьми, которые не могут запустить ваш API на серверах, которые не имеют возможности запускать закодированные файлы PHP.

В конце концов, вам нужно определить уровень требуемой безопасности и аутентификации, но, поскольку ваш API работает в JavaScript в браузере клиента, очень мало доступно, кроме запутывания.

Я бы сказал, что лучшим вариантом будет просто зацепить ваш код JS URL текущей страницы и отправить его с запросом API. Оттуда ваш сервер может обработать URL, чтобы получить корневой домен и любую другую информацию, которую вы хотите сохранить.

Если вы хотите запретить людям «подделывать» запросы на URL-адреса веб-сайтов других пользователей, вы можете реализовать PHP API, который устанавливается на сервер пользователя в определенном месте. Например http://www.domain.com/my-app-name.php

Все вызовы JS API должны проходить через этот скрипт. Когда пользователь загружает ваш API, он должен ввести URL своего веб-сайта и некоторую другую информацию. Ваша система генерирует «ключ» и вставляет его в сценарий, прежде чем упаковать его для загрузки. Этот ключ действителен для их домена и используется для кодирования всей передачи в / из вашего API с использованием, скажем, blowfish или другого алгоритма двустороннего шифрования. Таким образом, когда ваш API получает запрос от своего PHP API-файла, вы получаете URL страницы, с которой был сделан запрос, закодированный ключом, который есть только у вас и у администратора этого сайта. Таким образом, запрос выглядит примерно так: metromapper.org/api?site=[url_encoded_page_address]&req=[encrypted_request]

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

Причина, по которой я предлагаю использовать файл PHP для шифрования, а не записывать шифрование в JS, заключается в том, что вы не хотите обременять клиента (каждого посетителя сайта) нагрузкой шифрования / дешифрования, и PHP собирается справиться с этим.это намного быстрее, чем JS, поскольку есть библиотеки, созданные для выполнения этих задач.

В любом случае, вы должны быть на правильном пути, чтобы иметь возможность отслеживать и проверять запросы на разные сайты по отношению к вашимAPI.

1 голос
/ 02 декабря 2015

Вы можете создать хеш на основе доменного имени и позволить пользователям вашего API отправлять доменное имя и хеш в каждом запросе.Теперь, поскольку ваш API использует PHP, вы должны установить «Access-Control-Allow-Origin» где-нибудь в заголовке.Если вы делаете это в PHP, вы можете немного поиграть с этим.Приведенный ниже скрипт представляет собой простой пример реализации, для которой не требуется php на стороне вызывающей стороны (домен, в котором используется ваш API).

Сторона вызывающей стороны (не требуется php):

<script type="text/javascript">
  function callA() {
    var xhttp = new XMLHttpRequest();
    xhttp.open("GET", "//ajaxdomain.com/call.php?"+
                      "dom=www.callerdomain.com&"+
                      "key=41f8201df6cf1322cc192025cc6c5013",
               true);
    xhttp.onreadystatechange = function() {
      if(xhttp.readyState == 4 && xhttp.status == 200) {
        handleResponse(xhttp.responseText);
      }
    }
    xhttp.send();
  }
</script>

Ajax Server Side (PHP):

<?php
  if($_GET['key']==md5($_GET['dom']."Salt")) {
    header("Access-Control-Allow-Origin: http://".$_GET['dom']);
  }
?>

Таким образом, заголовок также будет размещен, если вызов поступил из вредоносного домена, но остальные будут отклоняться из-за исключения Cross Origin, и, следовательно, нетбудет получен результат.

Для пространства кода ради я использовал хэш md5 в этом примере, но вы можете использовать более сложные хэши, если хотите.Обратите внимание, что вы должны (как всегда) хранить в секрете использованную соль.

Я разместил рабочий пример в Интернете на следующих (суб) доменах.Страницы идентичны.

cors1.serioushare.com - работает только с кнопкой «CORS 1».
cors2.serioushare.com - работает только сКнопка «CORS 2».

...