Как обезопасить REST звонки, которые я делаю в приложении? - PullRequest
11 голосов
/ 23 мая 2011

У меня есть приложение, которое имеет "приватный" REST API; Я использую RESTful URL при выполнении вызовов Ajax со своих веб-страниц. Однако это небезопасно, и любой может сделать те же самые звонки, если знает шаблоны URL.

Каков наилучший (или стандартный) способ защиты этих вызовов? Стоит ли смотреть на что-то вроде OAuth сейчас, если я собираюсь выпустить API в будущем, или я смешиваю две отдельные стратегии вместе ?

Я использую Google App Engine для Python и Tipfy.

Ответы [ 3 ]

6 голосов
/ 23 мая 2011

Обязательно посмотрите OAuth

Он быстро становится стандартом де-факто для защиты REST API, и многие крупные компании используют его, в том числе Google , Twitter и Facebook , просто назвать несколько.

Для Python на GAE у вас есть два варианта:

Самый простой(IMHO) использует библиотеку Дэвида Ларлета для поддержки OAuth в Django , доступной в BitBucket.

Но поскольку вы не используете Django, возможно, вы захотите взглянуть на python-oauth2 библиотека, которая доступна на GitHub и считается самой современной и проверенной модулем реализацией OAuth для Python 2.4+.

В любом случае, я думаю, что вы будете оченьлучше использовать OAuth, чем использовать собственное решение для обеспечения безопасности услуг.

4 голосов
/ 23 мая 2011

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

SSL шифрует данные по проводам, но дешифрует по краям, так что это не поможет.Он предотвращает атаки «человек посередине», но ничего не делает для проверки легитимности исходного клиента.

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

Некоторые действия, которые вы можете сделать, чтобы смягчить API-очистку:

  • Создание краткосрочных файлов cookie сеанса, когда кто-то посещает ваш сайт.Требуется действительный файл cookie сеанса для вызова API REST.
  • Создание краткосрочных токенов запроса и включение их в HTML-код вашего веб-сайта;запрашивать действительный токен запроса внутри каждого запроса API.
  • Требовать, чтобы пользователи вашего веб-сайта входили в систему (Google Accounts / OpenID);проверьте подлинность cookie перед обработкой запросов API.
  • Ограничение скорости запросов API.Если вы видите слишком много запросов от одного клиента за короткий промежуток времени, заблокируйте их.
1 голос
/ 23 мая 2011

OAuth был бы излишним в вашем текущем сценарии ( потенциально небезопасен ), так как он предназначен для авторизации сторонней службы для доступа к ресурсам по поведению пользователя.

Защита запроса AJAX через авторизованного пользователя

AFAICT, вы управляете клиентом, ресурсами и аутентификацией; поэтому вам нужно только обеспечить безопасный доступ к URL-адресам и, возможно, связь между клиентом и сервером через SSL [2].

Итак, используйте расширение Tipfy для защиты ваших URL:

from tipfy import RequestHandler, Response
from tipfy.ext.auth import AppEngineAuthMixin, user_required

class MyHandler(RequestHandler, AppEngineAuthMixin):
    @user_required
    def get(self, **kwargs):
        return Response('Only logged in users can see this page.')

Защита запроса AJAX без авторизованного пользователя

Если пользователь неизвестен, то можно применить предупреждения CSRF, чтобы помочь защитить службу REST от вызова «неавторизованным» клиентом. У Tipfy это встроено в расширение WTForms , но это не AJAX. Вместо этого расширение сеанса может использоваться для применения «authenticity_token» ко всем вызовам, которые должны быть проверены на сервере.

...