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

Как защитить вызовы API REST?

Я разрабатываю успокаивающее веб-приложение, использующее некоторые популярные веб-структуры на бэкэнде, скажем (рельсы, синатра, фляжка, express.js). В идеале, я хочу развивать клиентскую сторону с Backbone.js. Как мне разрешить взаимодействовать только с моей клиентской стороной javascript с этими вызовами API? Я не хочу, чтобы эти вызовы API были общедоступными и вызывались с помощью curl или просто путем ввода ссылки в браузере.

4b9b3361

Ответ 1

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

Тем не менее, если я правильно прочитал ваш вопрос, это не то, чего вы хотите избежать: то, что вы действительно не хотите, - это то, что ваш API потребляется (на регулярной основе) без вашего JS-клиента участвует. Вот некоторые идеи о том, как не применять, а затем поощрять использование вашего клиента:

  • Я уверен, ваш API имеет какое-то поле аутентификации (например, Hash, вычисленное на клиенте). Если нет, посмотрите Этот вопрос SO. Убедитесь, что вы используете соль (или даже ключ API), которая предоставляется вашему JS-клиенту на основе сеанса (a.o.t. hardcoded). Таким образом, несанкционированный потребитель вашего API вынужден работать гораздо больше.

  • При загрузке JS-клиента помните о некоторых HTTP-заголовках (пользовательский агент приходит на ум) и IP-адрес и запрашивают повторную аутентификацию, если они меняются, используя черные списки для обычных подозреваемых. Это заставляет атакующего делать свою домашнюю работу более тщательно.

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

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

Ответ 2

Вы должны внедрить некоторую систему аутентификации. Один хороший способ справиться с этим - определить некоторые ожидаемые переменные заголовка. Например, у вас может быть вызов API auth/login, который возвращает токен сеанса. Последующие вызовы вашего API ожидают, что токен сеанса будет установлен в переменной заголовка HTTP с определенным именем, таким как "ваш-api-токен".

В качестве альтернативы, многие системы создают маркеры доступа или ключи, которые ожидаются (например, YouTube, Facebook или Twitter), используя какую-то систему учетных записей api. В этих случаях ваш клиент должен будет каким-то образом сохранить их в клиенте.

Тогда это просто вопрос добавления проверки для сессии в вашу структуру REST и исключения исключения. Если это вообще возможно, код состояния (чтобы быть спокойным) был бы ошибкой 401.

Ответ 3

Там есть открытый стандарт, который теперь называется "JSON Web Token",

см. https://jwt.io/ и https://en.wikipedia.org/wiki/JSON_Web_Token

JSON Web Token (JWT) - открытый стандарт JSON (RFC 7519) для создавая токены, которые утверждают некоторое количество претензий. Например, сервер может генерировать токен, который имеет претензию "зарегистрирован как администратор", и предоставить это клиенту. Затем клиент может использовать этот токен для докажите, что они вошли в систему как admin. Знаки подписываются сервер, поэтому сервер может проверить, что токен законны. Эти же маркеры предназначены для компактности, надежности URL-адресов и использования особенно в контексте единого входа в веб-браузер (SSO). Заявки JWT могут обычно используется для передачи личности аутентифицированных пользователей между провайдера идентификации и поставщика услуг или любого другого типа претензий в соответствии с требованиями бизнес-процессов. [1] [2] Токены также могут быть аутентифицированы и зашифрованы. [3] [4]

Ответ 4

Извините меня @MarkAmery и Eugene, но это неверно.

Ваше js + html (клиентское) приложение, работающее в браузере, может быть настроено для исключения несанкционированных прямых вызовов API, как показано ниже:

  • Первый шаг: настройте API для проверки подлинности. Клиент должен сначала пройти аутентификацию через сервер (или какой-либо другой сервер безопасности), например, попросить человека предоставить правильный пароль.

До аутентификации вызовы API не принимаются.

Во время аутентификации возвращается "токен".

После аутентификации будут приняты только вызовы API с аутентификацией "токен".

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

  1. Второй шаг: теперь настройте дополнительный API безопасности, который должен вызываться в течение короткого промежутка времени после того, как клиентское приложение js + html было первоначально запрошено с сервера. Этот "обратный вызов" сообщает серверу, что клиент был загружен успешно. Ограничьте вызовы API REST для работы, только если клиент был запрошен в последнее время и успешно.

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

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

(Название вопроса: "Как я могу защищать вызовы API REST", и от большинства из того, что вы говорите, это ваша главная проблема, а не буквальный вопрос о том, как вы называете ваш API, а скорее WH WHOM, правильно?)