Подтвердить что ты не робот

Как защитить частный REST API в приложении AJAX

Я знаю, что есть много похожих вопросов, но ни один из них не ссылается на приложение HTML/javascript, где пользователь может получить доступ к этому коду.

У меня есть частный REST API, написанный в nodejs. Он является частным, потому что его единственная цель - сервер моих приложений для клиентов HTML5 (приложение Chrome и приложение Adobe Air). Таким образом, ключ API не является хорошим решением, поскольку любой пользователь может видеть код javascript.

Я хочу, чтобы боты не создавали учетные записи на моем сервере и не потребляли мои ресурсы.

Есть ли способ сделать это?

4b9b3361

Ответ 1

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

Вы можете улучшить безопасность этого механизма, используя специальную схему кодирования, такую ​​как код аутентификации сообщения хэш-кода (HMAC). Следующий ресурс ясно объясняет этот механизм:

http://cloud.dzone.com/news/using-api-keys-effectively

Ответ 2

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

Вот высокоуровневый подход. Создайте сертификат SSL с самозаверяющим сервером и разверните его на своем веб-сервере. Если вы используете Android, вы можете использовать keytool, входящий в комплект Android SDK для этой цели; если вы используете другую платформу приложений, аналогичные инструменты существуют и для них. Затем создайте самозаверяющий клиент и разверните его в своем приложении в пользовательском хранилище ключей, включенном в ваше приложение, в качестве ресурса (keytool также будет генерировать это приложение). Настройте сервер, требующий аутентификации на стороне клиента, и только принять сертификат клиента, который вы создали. Настройте клиента для использования этого сертификата на стороне клиента для идентификации себя и принимайте только тот серверный сертификат, который вы установили на своем сервере для этой части.

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

Шаг за шагом для этого является гораздо более длинным ответом, чем это требуется здесь. Я бы предложил сделать это поэтапно, так как в Интернете есть ресурсы о том, как работать с самоподписанным SSL-сертификатом в Android (я не так хорошо знаком с тем, как это сделать на других мобильных платформах), как на стороне сервера, так и на стороне клиента. В моей книге "Безопасность приложений для платформы Android", опубликованной O'Reilly, также есть полная версия.