Я разрабатываю успокаивающее веб-приложение, использующее какую-нибудь популярную веб-структуру на бэкэнде, скажем (rails, sinatra, flask, express.js). В идеале я хочу разработать клиентскую часть с помощью Backbone.js. Как разрешить только моей стороне клиента javascript взаимодействовать с этими вызовами API? Я не хочу, чтобы эти вызовы API были общедоступными и вызывались curl
просто путем ввода ссылки в браузере.
92
Ответы:
В качестве первого принципа, если ваш API-интерфейс используется вашим JS-клиентом, вы должны предположить, что он является общедоступным: простой отладчик JS помещает злоумышленника в позицию, в которой он может послать побайтный идентичный запрос от инструмент по его выбору.
Тем не менее, если я правильно прочитал ваш вопрос, это не то, чего вы хотите избежать: чего вы действительно не хотите, так это того, что ваш API используется (на регулярной основе) без участия вашего JS-клиента. Вот несколько идей, как если не принуждать, то хотя бы поощрять использование вашего клиента:
Я уверен, что у вашего API есть какое-то поле аутентификации (например, хеш, вычисленный на клиенте). Если нет, взгляните на этот вопрос SO . Убедитесь, что вы используете соль (или даже ключ API), которая предоставляется вашему JS-клиенту для каждого сеанса (не жестко запрограммирована). Таким образом, неавторизованный потребитель вашего API будет вынужден выполнять гораздо больше работы.
При загрузке клиента JS запомните некоторые заголовки HTTP (на ум приходит пользовательский агент) и IP-адрес и попросите повторную аутентификацию, если они изменятся, используя черные списки для обычных подозреваемых. Это заставляет злоумышленника снова более тщательно выполнять домашнюю работу.
На стороне сервера запомните несколько последних вызовов API и, прежде чем разрешить еще один, проверьте, позволяет ли бизнес-логика использовать новый прямо сейчас: это лишает злоумышленника возможности сконцентрировать многие из своих сеансов в одном сеансе с вашим сервером: в сочетании с другими мерами это позволит легко обнаружить обидчика.
Я мог бы не сказать это с необходимой ясностью: я считаю невозможным полностью лишить нарушителя возможности потреблять ваши услуги, но вы можете сделать это настолько сложно, что это может не стоить хлопот.
источник
Вы должны внедрить какую-то систему аутентификации. Один из хороших способов справиться с этим - определить некоторые ожидаемые переменные заголовка. Например, у вас может быть вызов API аутентификации / входа, который возвращает токен сеанса. Последующие вызовы вашего API будут ожидать, что токен сеанса будет установлен в переменной заголовка HTTP с определенным именем, например your-api-token.
В качестве альтернативы многие системы создают ожидаемые токены доступа или ключи (например, youtube, facebook или twitter), используя какую-то систему учетных записей api. В таких случаях ваш клиент должен каким-то образом хранить их в клиенте.
Затем нужно просто добавить проверку сеанса в вашу структуру REST и выбросить исключение. Если это вообще возможно, код состояния (для успокоения) будет ошибкой 401.
источник
Сейчас существует открытый стандарт под названием «JSON Web Token»,
см. https://jwt.io/ и https://en.wikipedia.org/wiki/JSON_Web_Token
источник
Простите @MarkAmery и Евгения, но это неверно.
Ваше js + html (клиентское) приложение, работающее в браузере, МОЖЕТ быть настроено для исключения несанкционированных прямых вызовов API следующим образом:
Во время аутентификации возвращается «токен».
После аутентификации будут приниматься только вызовы API с "токеном" аутентификации.
Конечно, на этом этапе только авторизованные пользователи, у которых есть пароль, могут получить доступ к API, хотя, если они программисты, отлаживающие приложение, они могут получить доступ к нему напрямую для целей тестирования.
Теперь, чтобы использовать ваш API, они должны сначала загрузить клиент и фактически запустить его в браузере. API будет принимать вызовы только после успешного получения обратного вызова и последующего ввода пользователя в течение короткого промежутка времени.
Так что вам не нужно беспокоиться о том, что это может быть неавторизованный пользователь без учетных данных.
(Заголовок вопроса: «Как мне защитить вызовы REST API», и, судя по большей части того, что вы говорите, это ваша главная проблема, а не буквальный вопрос, КАК вызывается ваш API, а скорее КЕМ, правильно? )
источник
Установите переменную SESSION на сервере, когда клиент впервые загружает ваш
index.html
(илиbackbone.js
т. Д.)Проверяйте эту переменную на стороне сервера при каждом вызове API.
PS это не "защитное" решение !!! Это сделано для того, чтобы облегчить нагрузку на ваш сервер, чтобы люди не злоупотребляли им или не связывали ваш API с других веб-сайтов и приложений.
источник
Вот что я делаю:
Защитите API с помощью HTTP-заголовка с такими вызовами, как X-APITOKEN:
Используйте переменные сеанса в PHP. Создайте систему входа в систему и сохраните токен пользователя в переменных сеанса.
Вызовите код JS с Ajax в PHP и используйте переменную сеанса с curl для вызова API. Таким образом, если переменная сеанса не установлена, она не будет вызывать, а код PHP содержит токен доступа к API.
источник