Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Yii
Code

Создание стартапа: защита API

by
Difficulty:IntermediateLength:ShortLanguages:
This post is part of a series called Building Your Startup With PHP.
Building Your Startup: Leveraging Crowdfunding
Building Your Startup: Approaching Major Feature Enhancements

Russian (Pусский) translation by Masha Kolesnikova (you can also view the original English article)

Final product image
What You'll Be Creating

Добро пожаловать в серию статей Создаем свой стартап на  PHP, в которой мы рассматриваем создание реального стартапа, Meeting Planner. Каждый эпизод серии описывает различные проблемы, связанные с кодированием и бизнесом, с подробными примерами, которые вы можете использовать для изучения.

Введение

Недавно я познакомил вас с простой генерацией API REST в Yii и новым API-интерфейсом RESTful сервиса для Planner. В то время я упоминал, что эти API были слабо защищены. Несомненно, между клиентом и сервером был общий токен, но было несколько проблем.

Во-первых, тайные ключи и токены пользователя неоднократно передавались в параметрах запроса вызовов SSL. И не было никакой другой проверки подлинности данных, позволяющей реализовать атаку посредника.

В сегодняшнем эпизоде я расскажу, как я защитил свое API от этих слабых мест для более надежного API.

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

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

Напомним, что весь код Планировщика встреч написан в Yii2 Framework для PHP. Если вы хотите узнать больше о Yii2, ознакомьтесь с нашей параллельной серией Программирование с Yii2.

Начальная безопасность API

Давайте начнем с изучения ранней безопасности API, которую я использовал. Мы предположим, что есть мобильное приложение, с которым я делю $app_id и $app_secret. Принимаются вызови API только с этими ключами.

Например, приложение пытается зарегистрировать своего владельца, вероятно, нового пользователя Планировщика собраний:

Приложение вызывает приведенный выше метод actionRegister с помощью https://api.meetingplanner.io/user-token/register/ и аргументами следующим образом:

  • $app_id и $app_secret для аутентификации
  • $source = 'facebook' для сервиса OAuth, который мы используем, и сопровождающий $oauth_token от этого сервиса
  • $email, $firstname и $lastname, предоставленные через OAuth

Все это аргументы запроса, такие как:

Service::verifyAccess($app_id,$app_secret) ищет ключи для аутентификации вызова, как показано ниже:

Поскольку ключи и данные были отправлены через SSL, они довольно безопасны, но не неуязвимы. Так же как и ключ безопасности iPhone.

Как мы можем сделать все это более безопасным? Вот несколько идей:

  1. Никогда не передавайте секретный ключ через Интернет.
  2. Не передавайте какие-либо данные в виде параметров URL-адресов, которые могут отображаться в журналах сервера.
  3. Подпишите все данные, чтобы проверить их точность.

На самом деле это стандартные методы, используемые для защиты API.

Примечание. Примером риска передачи данных, которые могут отображаться в журналах сервера, будет адрес электронной почты и токен OAuth Facebook. Если они найдены в журналах, их можно использовать с API Facebook для доступа к чужой учетной записи Facebook.

Реализация улучшенной защиты API

Использование подписи Hash

Во-первых, я не собираюсь больше передавать $app_secret. Вместо этого мы будем подписывать исходящие данные перед вызовом API.

Таким образом, мы будем алфавитно перебирать переменные и объединять их в строку, например:

В результате чего:

Затем мы будем хранить данные с помощью PHP hash_hmac и алгоритма sha256, используя наш секретный ключ.

Building Your Startup Securing API - PHP hash_hmac docs

Это создает уникальный хеш-код на основе аргументов вызова API и нашего общего секретного ключа:

Теперь мы можем вызвать методы API без передачи секретного ключа. Вместо этого мы передаем подпись хешированных данных.

Я использую Postman для тестирования API, но вы также можете использовать cURL:

Building Your Startup Securing API - Testing the API with a signature

Вот код получающего API, который ответил на вызов выше:

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

Отправка данных в заголовках HTTPS

Затем мы перенесем отправку данных в заголовки. Вы можете сделать это легко с помощью Postman или cURL. Вот почтальон:

Building Your Startup Securing API - Testing the API sending data in the headers

И вот cURL:

Вот код получения, который получает данные API из заголовков HTTPS:

В заключение

Мы начали сегодня со следующих целей:

  1. Никогда не передавайте секретный ключ через Интернет.
  2. Не передавайте какие-либо данные в виде параметров URL-адресов, которые могут отображаться в журналах сервера.
  3. Подпишите все данные, чтобы проверить их достоверность.

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

Я регулярно отслеживаю комментарии, поэтому, пожалуйста, присоединяйтесь к обсуждению. Вы также можете связаться со мной в Twitter @lookahead_io напрямую. И, конечно же, следите за предстоящими учебниками здесь, в разделе «Создание своего стартапа с помощью PHP».

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

Ссылки по теме

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.