2012-01-18 2 views
20

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

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

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

Есть ли способ исправить это?

+2

Я не уверен, удовлетворены ли какие-либо ответы на ваш вопрос. Пожалуйста, сообщите, как вы подошли к описанной вами проблеме. Я создаю веб-приложение на основе REST + AJAX, которое можно использовать для незарегистрированных пользователей. Как и я, я хочу защитить ресурсы от ботов. –

+0

Логически не существует способа сделать API по-настоящему частным, если он вызывается с веб-страницы, где каждый может просматривать источник и/или отслеживать данные, отправляемые на сервер. Чтобы поймать ботов, у вас есть обычные трюки, такие как Captcha, но в конечном итоге вам нужна поддержка на заднем плане (WAF, быстрое автоматическое масштабирование и т. Д.), Чтобы иметь дело с возможностью автоматических атак типа DDOS. До тех пор, пока вы обнаружите вероятные атаки DDOS как можно раньше (до создания соединений с БД и т. Д.), Это ничем не отличается от обработки ботов, пытающихся загрузить страницу в первую очередь. –

ответ

15

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

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

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

+2

Важно также отметить, что ключевое решение API работает для десятков других API, включая Google Maps, Flickr, Facebook и т. Д. Трюк заключается в реализации. –

+0

Я не могу контролировать, откуда пришли мои пользователи, это общедоступное приложение. Карты Google, Flickr и т. Д. Используют ключи API, но я не уверен, что они беспокоятся о том, кто использует ключи. Я думаю, что я могу скопировать и использовать любой ключ карты Google (не пробовал). – aartiles

+0

Вы не можете просто скопировать ключ API Карт Google и использовать его в другом домене, поскольку API Карт Google связывает каждый сгенерированный ключ API с определенным классом домена (например, mydomain.com), и каждый запрос, который входит, проверяется на URL ссылки и другую информацию, закодированную в ключе API. Опять же, типичным механизмом кодирования является HMAC. В противном случае ключи API были бы бесполезны. –

1

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

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

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

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

+0

Мое веб-приложение чистый javascript и HTML, а не android – aartiles

+0

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

+0

Как это сделать для стандартного веб-браузера? Скажем, Google Chrome. – aartiles

Смежные вопросы