Как защитить звонки REST, которые я делаю в приложении?

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

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

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

Ответ 1

Определенно взгляните на OAuth

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

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

Итак, используйте Tipfy расширение auth для защиты ваших 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" ко всем вызовам, которые должны быть проверены на сервере.