Я создаю API и задаюсь вопросом, как отслеживать / знать, какие домены используют этот вызов.
Вызов API построен на PHP и не требует никакой аутентификации. Пользователь, скорее всего, будет использовать API в вызове AJAX на своем сервере.
Так, например, мой домен, обслуживающий PHP-файл API, называется dev.yourmapper.com. Кто-то из домена www.metromapper.org создает страницу, которая создает карту Google, и вызывает мой файл с помощью Ajax для наложения моих данных на их карту.
Вот этот пример в действии: http://www.metromapper.org/example/apitest.htm
(Щелкните маркер центральной карты, чтобы увидеть всплывающее окно всех переменных PHP Server, доступных для скрипта yourmapper.com.)
Обратите внимание, что HTTP_REFERER, вероятно, будет «stackoverflow.com», если вы нажмете ссылку (или пусто, если вы вырезаете и вставляете ссылку). Я бы подумал, что референтом будет metromapper.org, так как этот домен вызывает скрипт yourmapper.com после его загрузки, но, по-видимому, нет.
Итог: какой метод я могу использовать для определения того, какой домен вызывает мой скрипт mymapper.com с помощью Javascript? Я могу использовать другие языки помимо PHP, если это необходимо. Благодарю.
«Я бы подумал, что референтом будет metromapper.org, так как этот домен вызывает скрипт yourmapper.com после загрузки"
На самом деле это неправильно. Во-первых, вы никогда не должны полагаться на HTTP_REFERER, потому что это добровольный параметр, передаваемый большинством (не всех) браузеров, и его можно легко подделать. Я могу отправить ваши запросы на веб-сайт, используя CURL, которые сделают его похожим на то, что реферер был whitehouse.gov, если я захочу. Там нет мер безопасности.
Что, как говорится. Браузер устанавливает этот параметр на страницу, которая ссылается на пользователя на загруженную страницу. Не скрипт. Таким образом, причина, по которой вы видите результат, который вы видите, заключается в том, что пользователь был отправлен на metromapper.org по ссылке на stackoverflow.com
Наконец, давайте перейдем к сочной части. Вы используете JS для кодирования вещей в браузере. Это нормально, и с этим абсолютно нет проблем. Но вы должны помнить, что JS является открытым исходным кодом. Поэтому люди могут (и будут) возиться с вашим кодом, чтобы играть с вашим API только потому, что они могут. Что, как говорится. Лучше всего, вероятно, передать URL-адрес сайта вместе с запросом в вашем JS-апи. Это лучший способ «отслеживать», какие сайты используют ваш скрипт. Вы можете проверить серверную сторону, чтобы убедиться, что URL был передан. Это помешает людям изменить ваш API, чтобы удалить бит, который отправляет URL-адрес на ваш сервер. Однако это не мешает им модифицировать его, чтобы использовать в качестве параметра чужой URL-адрес или случайный незарегистрированный.
Конечно, вы можете создать API-интерфейс PHP, который они запускают на своем сервере. API JS соединяется с PHP API, а PHP API кодируется zend-защитой (или какой-либо другой системой защиты исходного кода), но тогда все еще будут люди, которые расшифруют файл, чтобы вернуться к вашему источнику и повеселиться с вами. Конечно, было бы намного меньше людей, которые могли бы это сделать, и средний пользователь просто использовал бы ваш API так, как есть. Тогда у вас также есть проблема, когда люди не могут запускать ваш API на серверах, которые не имеют возможности запускать закодированные PHP-файлы.
В конце концов вы должны определить свой уровень требуемой безопасности и аутентификации, но, поскольку ваш API работает в JavaScript в клиентском браузере, очень мало доступных за пределами обфускации.
Я бы сказал, что ваш лучший вариант будет состоять в том, чтобы просто заставить JS-код зацепить URL-адрес текущей страницы и отправить ее с помощью запроса API. Оттуда ваш сервер может обработать URL-адрес, чтобы получить корневой домен и любую другую информацию, которую вы хотите сохранить.
Если вы хотите, чтобы люди не «подменяли» запросы на URL-адреса других пользователей, вы могли бы реализовать PHP API, который устанавливается на сервере пользователя в определенном месте. Например, http://www.domain.com/my-app-name.php
Все вызовы API JS должны проходить через этот скрипт. Когда пользователь загружает ваш API, они должны ввести URL своего сайта и другую информацию. Ваша система генерирует «ключ» и вводит его в скрипт перед тем, как упаковать его для загрузки. Этот ключ действителен для своего домена и используется для кодирования всей передачи в / из вашего API, используя say blowfish или другой алгоритм двустороннего шифрования. Таким образом, когда ваш API получает запрос из своего файла API PHP, вы получаете URL-адрес страницы, на которую был сделан запрос, закодированный ключом, который есть только у вас и администратора этого сайта. Таким образом, запрос приходит через что-то вроде этого: metromapper.org/api?site=[url_encoded_page_address]&req=[encrypted_request]
Ваш сервер использует URL-адрес страницы, чтобы определить, какой ключ следует использовать для дешифрования данных. Затем он расшифровывает данные. Если данные повреждены или не дешифруются в ожидаемое, то это неверный запрос, и вы должны просто выйти из него.
Причина, по которой я предлагаю использовать файл PHP для шифрования в отличие от написания шифрования в JS, заключается в том, что вы не хотите обременять клиента (каждого посетителя сайта) загрузкой шифрования / дешифрования, а PHP будет обрабатывать его гораздо быстрее чем JS, так как есть библиотеки, созданные для решения этих задач для вас.
Во всяком случае, вы должны на правильном пути отслеживать и проверять запросы на разные сайты против вашего API.
Вы можете создать хэш на основе имени домена и позволить пользователям вашего API отправлять имя домена и хеш в каждом запросе. Теперь, когда вы используете API, вы установите «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 Exception, и поэтому результат не будет дан.
Для кода кода ради кода в этом примере я использовал хеш md5, но вы можете использовать более сложные хэши, если хотите. Обратите внимание, что вы должны (как всегда) сохранить секрет используемой соли.
Я помещаю рабочий пример онлайн в следующие (под) домены. Страницы идентичны.
cors1.serioushare.com – работает только на кнопке «CORS 1».
cors2.serioushare.com – работает только на кнопке CORS 2.