Безопасность для AJAX-запросов со стороны клиента, обращающихся к API

#javascript #ajax #json #security #api

#javascript #ajax #json #Безопасность #API

Вопрос:

Допустим, вы хотите, чтобы сторонний сайт скопировал и вставил фрагмент кода javascript, который вы предоставляете. Этот код использует AJAX-запрос для доступа к JSON API на ваших серверах. Как бы вы реализовали безопасность, чтобы, связывая использование API с веб-сайтом, который зарегистрировался и получил ключ API, вы эффективно запрещали сайту злоупотреблять ключом / использованием API другого сайта? Разве эта безопасность невозможна со стороны клиента? Должен ли сайт получать доступ к API с сервера?

Ответ №1:

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

Реализация решения на стороне сервера возможна и не слишком сложна, но это остановит многие сайты от использования вашего скрипта.
Вы можете позволить им отправлять запрос со своих серверов
или позволить им хранить ключ на своих серверах, хэшировать ключ перед отправкой его клиенту (хэшированный ключ изменяется через интервал времени)…

Ответ №2:

Вы можете просто проверить window.location или какой-либо его компонент.

Комментарии:

1. Итак, вы говорите, что передаете результат window.location запроса AJAX на мои серверы?

2. Ну, вы все равно не можете использовать true AJAX из-за междоменных ограничений. Поэтому, как правило, сайты предоставляют API-оболочку (например google.com/jsapi?key=INSERT-YOUR-KEY ), который выполняет вызовы JSONP. Этот скрипт также может просматривать, window.location пока он работает. Тогда проблема заключается в том, что сайты пытаются выполнить вызов JSONP напрямую.

3. Да, и ничто не мешает сайту в любом случае изменить сценарий или отправить ложную информацию, основанную на том, как он видит, что другие сайты выполняют вызовы JSONP…

4. Есть идеи о том, как запретить сайтам напрямую вызывать JSONP?

5. @Justin, вы можете выполнить window.location проверку в своем ответе на вызов JSONP. Например, используя пример API Google, на каждый поисковый вызов отвечайте скриптом if(isValidDomain()){callback();} , но это приведет к снижению производительности.

Ответ №3:

Единственный способ, который я могу придумать для обеспечения такой безопасности, — это использовать IP-адрес, но это в лучшем случае рискованно, поскольку есть много причин, по которым это был бы плохой дизайн.

Это будет защита на стороне сервера, защищающая файл javascript. Вы могли бы просто попросить веб-службу обслуживать javascript, чтобы он мог выполнить проверку перед отправкой файла клиенту.

Комментарии:

1. Какой IP-адрес? Вы не можете жестко запрограммировать IP-адреса клиентов, потому что ни вы, ни сторонний сайт не знаете IP-адреса будущих пользователей.

2. @MatthewFlaschen — Тот факт, что вам нужно было бы знать, был бы сложной частью, и почему я думаю, что это может быть не идеальным решением, но это, вероятно, самый безопасный метод. Все, что вы делаете в javascript, может быть взломано.

3. @MatthewFlaschen — частью получения ключа API может быть указание, какие IP-адреса могут использоваться, чтобы можно было получить эту информацию. Это не помешает кому-либо скопировать файл javascript в браузере и просто поместить его на другой веб-сайт. Я думаю, что этот подход ошибочен, поскольку javascript изначально нелегко защитить.