Как защитить частный REST API в приложении AJAX - PullRequest
21 голосов
/ 19 января 2012

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

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

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

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

Ответы [ 2 ]

15 голосов
/ 19 января 2012

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

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

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

1 голос
/ 19 января 2012

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

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

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

Пошаговое руководство для этого:гораздо более длинный ответ, чем здесь гарантировано.Я бы предложил сделать это поэтапно, так как в Интернете есть ресурсы о том, как работать с самозаверяющим SSL-сертификатом в Android (я не так хорошо знаю, как это делать на других мобильных платформах), как на стороне сервера, так и на стороне клиента.В моей книге «Безопасность приложений для платформы Android», опубликованной О'Рейли, есть полный обзор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...