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

Программирование с помощью Yii2: безопасность

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called How to Program With Yii2.
Programming With Yii2: Using Ajax
Programming With Yii2: Automated Testing With Codeception

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

Если вы интересуетесь: «Что такое Yii?» то ознакомьтесь с Знакомство с Yii Framework, в котором рассматриваются преимущества Yii и которое включает обзор Yii 2.0.

В этой серии Программировании с помощью Yii2 я направляю читателей в использование Yii2 Framework для PHP. Если вы планируете поделиться своим приложением с общественностью, вам нужно, чтобы это было безопасно, и лучше всего планировать это с самого начала. К счастью, используя такой фреймворк, как Yii, это стало намного проще, чем было бы без него. Как указано в Особенности Yii:

Yii оснащен множеством мер безопасности, которые помогут предотвратить атаки ваших веб-приложений, такие как SQL-инъекция, межсайтовый скриптинг (XSS), подделка запросов на межсайтовый запрос (CSRF) и подделка файлов cookie.

В этом уроке я рассмотрю основные концепции безопасности в рамках приложения Yii. И, если вам интересно, будущие эпизоды будут посвящены теме безопасности в приложении Планировщик собраний, которое представлено в нашей серии Пишем стартап на PHP, поскольку он приближается к альфа-выпуску.

Прежде чем мы начнем, пожалуйста, помните, я стараюсь участвовать в обсуждениях ниже. Если у вас есть вопрос или предложение по теме, пожалуйста, напишите комментарий ниже или свяжитесь со мной в Twitter @reifman.

Примечание. Если вы заметили пробел между эпизодами Программирование серии Yii, это связано с тем, что в прошлом году мне пришлось провести операцию на головном мозге. Благодарю вас за терпение и поддержку. Приятно регулярно писать, и я с нетерпением жду продолжения освещения Yii2.

Основы безопасности с Yii

Если вы новичок в безопасности веб-приложений, есть много возможностей, которые предлагает Yii. Я сделаю все возможное, чтобы предложить обзор, основанный на лучшей документации Yii 2.0. Команда Yii делит безопасность на семь ключевых областей:

  1. Аутентификация
  2. Авторизация
  3. Работа с паролями
  4. Криптография
  5. Безопасность отображений
  6. Аутентификация клиентов
  7. Лучшие практики

Давайте начнем погружаться в них один за другим.

1. Аутентификация

В презентации Yii Framework от Ilko Kacharov представлены несколько полезных слайдов, которые суммируют цель аутентификации (и следующую подтему, авторизацию). По сути, вот те вопросы, на которые должны отвечать эти темы:

  • Кто является пользователем?
  • Является ли пользователь тем, кем он себя называет?
  • Есть ли у пользователя для доступа к ресурсу?
  • Разрешено ли пользователю выполнять действие?
  • Разрешено ли пользователю выполнять действие на ресурсе?

Пользовательская модель и интерфейс идентификации

Yii класс yii/web/User интегрируется с yii\web\IdentityInterface для управления статусом аутентификации пользователя в вашем приложении.

В ноябре прошлого года я написал учебное пособие о расширенном шаблоне приложений Yii. Одним из преимуществ расширенного шаблона является то, что он обеспечивает предварительно встроенную интеграцию модели User с ActiveRecord и вашей базой данных. Поэтому ваше приложение предлагает аутентификацию, основанную на базе данных, прямо из коробки.

Модель User позволяет вам программно входить в систему и выходить из системы:

  • login() устанавливает указанное имя и запоминает статус аутентификации в сеансе и cookie.
  • logout() отмечает пользователя как гостя и очищает соответствующую информацию от сеанса и файла cookie.
  • setIdentity(): изменяет идентификатор пользователя, не затрагивая сеанс или файл cookie, лучше всего подходит для функций API.

Свойство $isGuest определяет, был ли текущий пользователь залогинен или нет. Когда пользователь выйдет из системы, свойство имеет значение null, но в противном случае возвращает экземпляр IdentityInterface.

По сути, вам нужен класс User, который расширяет ActiveRecord и реализует методы для поддержки IdentityInterface, например:

Кроме того, перед созданием пользователя приложение генерирует случайную строку в качестве ключа авторизации. Его можно использовать в сообщениях «забыли пароль» или других ссылках на электронную почту:

Авторизация

Yii предоставляет два встроенных подхода к авторизации. Более простой список контроля доступа (ACL) определяет, каким пользователям или процессам разрешено выполнять действия на ресурсе, а более интенсивный контроль доступа на основе ролей (RBAC) помогает вам управлять доступом, определяя роли. В RBAC только определенные пользователем или системные задачи с определенными ролями могут выполнять определенные действия.

Список контроля доступа

ACL иногда также называют фильтром контроля доступа (ACF). Yii обеспечивает поддержку ACL внутри yii\filters\AccessControl. Он идеально подходит для приложений, которым требуется простой контроль доступа. Это то, что я использовал до сих пор в Meeting Planner.

Вот пример обычного SiteController, настраивающего поведение доступа для фильтрации доступа к доступным действиям, часто это просто страницы. В этом случае ACL действует при регистрации, входе в систему и выходе. «?» указывает, что любой пользователь может получить доступ к страницам входа и регистрации, тогда как «@» указывает, что разрешен доступ только для зарегистрированных пользователей или пользователей, прошедших проверку подлинности. В приведенном ниже примере только зарегистрированные пользователи могут выйти из системы:

По мере того, как растет контроллер, каждое новое действие должно быть определено в правилах AccessControl. И, по мере роста вашего приложения, каждый контроллер и все его действия должны интегрировать фильтрацию ACL для обеспечения безопасности.

Контроль доступа на основе ролей

Управление доступом на основе ролей (RBAC) обеспечивает более надежную систему аутентификации, но также требует гораздо большей предварительной разработки и реализации.

С RBAC вы определяете аутентификацию через роли, которые могут быть унаследованы (или нет), и вы применяете роли на пользователей. Вы также можете определить правила для ролей. Реализации RBAC могут стать довольно сложными.

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

Yii Framework Role Based Access Control Inheritance Illustration

Yii реализует то, что он называет «общим иерархическим RBAC, следуя модели NIST RBAC». Функциональность RBAC обеспечивается его компонентом приложения authManager.

Здесь я не буду слишком глубоко вдаваться в RBAC, но надеюсь, что сделаю это в одном из будущих учебников. Опять же, для редакционных богов:

Yii2 Security Editorial goddess NoOne at Envato Taking Care of Business
через PopSugar

В принципе, чтобы полностью реализовать RBAC, вы должны:

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

Вы можете увидеть код, необходимый для включения системы RBAC ниже:

Чтобы реализовать RBAC, вы должны быть готовы сразу написать много кода или по мере увеличения вашего приложения. И, если вы это сделаете, вы будете управлять аутентификацией в соответствии с установленной вами структурой проверки подлинности. Другими словами, дизайн и кодирование наперед обеспечивают надежную и подробную аутентификацию.

Работа с паролями

Как узнал Марк Цукерберг в июне, некоторые веб-сайты хранят пароли пользователей в текстовом виде, но ваш сайт не должен этого делать; чтобы быть справедливым к Цукербергу, моя учетная запись Facebook была однажды взломана из-за того, что PHPList сделал то же самое - до дней менеджеров паролей. Во всяком случае, Yii упрощает шифрование и надежную проверку паролей.

Функция crypt Yii использует bcrypt для генерации хэшей для вашего пароля. Когда люди регистрируются, создается хэш:

Затем, когда пользователь пытается войти в систему, пароль хэшируется и сравнивается с хешем в базе данных:

Но вы также можете использовать Yii для защиты данных с помощью криптографии.

Криптография

Yii Framework предоставляет ряд встроенных функций для защиты данных:

Безопасность в отображениях

Любые данные, поступающие от пользователей, могут быть заражены такими атаками, как SQL-инъекция или кросс-браузерные скрипты. Важно, чтобы любые данные, которые вы выводили пользователям в представлениях, были очищены. Yii предлагает несколько методов для этого.

Во-первых, есть Html::encode, который существенно разбивает любой SQL или скрипт:

И есть интеграция с библиотекой HtmlPurifier для больших текстовых блоков:

Вход через Auth Client

Yii также предоставляет возможность сторонней аутентификации, что особенно полезно для поддержки социального входа через Google, Facebook, Twitter и т.д.

Я написал несколько руководств для Envato Tuts + об использовании AuthClient в Yii Framework с социальными входами:

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

Лучшие практики

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

  1. Фильтрация ввода и вывода
  2. Избегаем инъекций SQL
  3. Предотвращение межсайтовых сценариев (XSS)
  4. Предотвращение подделки запроса (CSRF)
  5. Избегаем выполнения файлов
  6. Избегаем дебага
  7. Использование безопасного подключения через TLS

Первые три приведенные выше темы хорошо управляются кодированием, описанным выше в Views Security.

Yii также обеспечивает встроенную защиту CSRF для общих действий - и при необходимости ее можно отключить. В Планировщике собраний мне пришлось отключить CSRF, чтобы принимать сообщения, отправленные из служб API Mailgun.

Что касается воздействия файлов, фреймворк помогает свести к минимуму это, объединив все входные запросы в запрос к файлу web/index.php. Это значительно ограничивает необходимость написания кода приложения, который фильтрует запросы. Это хорошо управляется в одном месте.

Наконец, использование HTTPS может помочь защитить ваши подключения и работать с Yii для защиты пользователей. В начале этого года я написал о Let's Encrypt - вы можете использовать этот учебник для установки HTTPS для приложений Yii.

Хотите узнать больше?

Если вам интересно прочитать более подробный материал по этим темам, Yii 1.x Framework предлагает эти туториалы. Конечно, они старше и менее специфичны для Yii 2, но они остаются полезными.

В заключение

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

Следите за предстоящими учебниками в нашей серии Yii2, поскольку мы продолжаем погружаться в разные аспекты фреймворка. Я приветствую любые пожелания по темам. Вы можете опубликовать их в комментариях ниже или отправить мне по электронной почте на моем веб-сайте Lookahead Consulting.

Если вы хотите узнать, когда выйдет следующий учебник Yii2, подпишитесь на меня @reifman в Twitter или проверьте мою страницу инструктора. Моя страница инструктора будет включать все статьи из этой серии, как только они будут опубликованы.

Давайте работать вместе.

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

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.