Как обезопасить REST-звонки, которые я делаю в приложении?
У меня есть приложение, которое имеет "частный" REST API; Я использую RESTful URL при выполнении вызовов Ajax со своих веб-страниц. Однако это небезопасно, и любой может сделать те же самые звонки, если знает шаблоны URL.
Какой лучший (или стандартный) способ защитить эти звонки? Стоит ли смотреть на что-то вроде OAuth сейчас, если я собираюсь выпустить API в будущем, или я смешиваю две отдельные стратегии вместе?
Я использую Google App Engine для Python и Tipfy.
3 ответа
Определенно посмотрите на OAuth
Он быстро становится стандартом де-факто для защиты REST API, и многие крупные компании используют его, в том числе Google, Twitter и Facebook, и это лишь некоторые из них.
Для Python на GAE у вас есть два варианта:
Самый простой способ (IMHO) - использовать библиотеку Дэвида Ларлета для поддержки OAuth в Django, доступную в BitBucket.
Но поскольку вы не используете Django, возможно, вы захотите взглянуть на библиотеку python-oauth2, которая доступна на GitHub и считается самой современной и проверенной модулем реализацией OAuth для Python 2.4+.
В любом случае, я думаю, что с OAuth вам будет намного лучше, чем использовать собственное решение для обеспечения безопасности услуг.
Обеспечение безопасности клиента JavaScript практически невозможно; на сервере у вас нет надежного способа отличить человека, использующего веб-браузер, и хорошо разработанный скрипт.
SSL шифрует данные по проводам, но дешифрует по краям, так что это не поможет. Он предотвращает атаки по принципу "человек посередине", но ничего не делает для проверки законности первоначального клиента.
OAuth хорош для защиты запросов между двумя серверами, но для клиента Javascript это не очень помогает: любой, кто читает ваш код javascript, может найти ваш ключ / секретный ключ потребителя, а затем подделать подписанные запросы.
Некоторые вещи, которые вы можете сделать, чтобы уменьшить API-очистку:
- Создавайте краткосрочные куки-файлы сеанса, когда кто-то посещает ваш сайт Требовать действительный файл cookie сеанса для вызова API REST.
- Сгенерируйте краткосрочные токены запроса и включите их в HTML своего сайта; требовать действительный токен запроса внутри каждого запроса API.
- Требовать от пользователей вашего сайта авторизацию (Google Accounts / OpenID); проверьте auth cookie перед обработкой запросов API.
- API-запросы с ограничением скорости. Если вы видите слишком много запросов от одного клиента за короткий промежуток времени, заблокируйте их.
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" ко всем вызовам, которые должны быть проверены на сервере.