Advertisement
  1. Code
  2. Yii

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

by
Read Time:5 minsLanguages:
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 imageFinal product imageFinal 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 docsBuilding Your Startup Securing API - PHP hash_hmac docsBuilding Your Startup Securing API - PHP hash_hmac docs

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

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

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

Building Your Startup Securing API - Testing the API with a signatureBuilding Your Startup Securing API - Testing the API with a signatureBuilding 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 headersBuilding Your Startup Securing API - Testing the API sending data in the headersBuilding 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
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.