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

Ключи API веб-сервисов и Ajax - Защита ключа

Это, вероятно, общий вопрос безопасности, но я думал, что задаю вопрос в том, что я разрабатываю.

Сценарий: веб-служба (WCF Web Api), которая использует ключ API для проверки и указания мне, кто является пользователем, и сочетание jQuery и приложения на передних концах.

С одной стороны, трафик может быть https, поэтому он не может быть проверен, но если я использую один и тот же ключ для каждого пользователя (скажем, guid), и я использую его как в том, так и в том случае, когда это возможно, кто-то может олицетворять пользователя.

Если я реализую что-то похожее на OAuth, тогда генерируется пользователь и ключ для каждого приложения, и это может сработать - но все же для стороны jQuery мне понадобится ключ API приложения в javascript.

Это будет проблемой только в том случае, если кто-то был на самом компьютере и сделал источник просмотра.

Что мне делать?

  • md5 или как-нибудь зашифровать ключ?
  • Поместите ключ в переменную сеанса, а затем при использовании ajax его получите?
  • Поверните это, это не та большая сделка/проблема.

Я уверен, что это, вероятно, общая проблема, поэтому любые указатели будут приветствоваться.

Чтобы сделать это более понятным - это мой API, я написал, что я запрашиваю, а не google и т.д. Поэтому я могу делать на токенах сеансов и т.д. Я просто пытаюсь выработайте лучший способ защитить токены/ключи клиентской стороны, которые я буду использовать.

Я немного чересчур осторожен, но просто использую это, чтобы узнать.

4b9b3361

Ответ 1

(Я предлагаю помечать эту запись "безопасность".)

Во-первых, вам должно быть ясно, о чем вы защищаете. Можете ли вы доверять клиенту вообще? Ловкий пользователь может использовать Greasemonkey script на вашей странице и называть именно код, который ваш пользовательский интерфейс вызывает для отправки запросов. Скрытие всего в закрытии Javascript означает, что вам нужен отладчик; он не делает атаку невозможной. Firebug может отслеживать запросы HTTPS. Также рассмотрите скомпрометированный клиент: установлен ли кейлоггер? Является ли вся система секретно запущенной виртуализированной так, чтобы злоумышленник мог проверять любую часть памяти в любое время на досуге? Безопасность, когда вы подвергаетесь воздействию webapp, действительно сложна.

Тем не менее, вот несколько вещей, которые вы можете рассмотреть:

  • Полагайте, что на самом деле не используются ключи, а скорее хэши HMAC, например, токен, который вы даете сразу после аутентификации.

  • Хранилище DOM может быть немного сложнее, чем файлы cookie.

  • Посмотрите Google для реализации OAuth 2 для примера модели безопасности. В основном вы используете токены, которые действительны только в течение ограниченного времени (и, возможно, для одного IP-адреса). Таким образом, даже если токен перехвачен или клонирован, он действителен только на короткий промежуток времени. Конечно, вам нужно быть осторожным в том, что вы делаете, когда заканчивается токен; может ли злоумышленник сделать то же самое, что и ваш код, и получить новый действительный токен?

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

Ответ 2

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

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

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

Ответ 3

Как правило, в таких случаях, если вы запрашиваете прокси-сервер через сервер, используя "AJAX", который проверяет, что браузер делает запрос на это. Если вы хотите вызвать службу непосредственно из JavaScript, вам понадобится какая-то система токенов, например JSON Web Tokens (JWT), и у вас будет для решения междоменных проблем, если служба находится где-то, кроме текущего домена.

Ответ 4

Как насчет использования jQuery для вызова кода на стороне сервера, который обрабатывает связь с API. Если вы используете MVC, вы можете вызвать действие контроллера, которое может содержать код и ключ API, чтобы попасть в вашу службу и вернуть частичный вид (или даже JSON) на ваш UX. Если вы используете веб-формы, вы можете создать страницу aspx, которая будет обрабатывать API в коде позади, а затем писать контент в поток ответов для вашего UX. Тогда ваш код UX может содержать только вызовы $.post() или $.load() для вашего кода на стороне сервера, и оба ключа API и конечная точка будут защищены.