Главная | Документаци для разраотчиков | Рекомендации по безопасности при работе с Yii 2

Рекомендации по безопасности при работе с Yii 2

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

CSRF - Межсайтовая подделка запроса

Yii 2 по-умолчанию добавляет CSRF-токен в meta атрибуты сайта. Этот токен необходим для подтверждения на сервере того, что запрос пришел с того же домена,а не с поддельного. Дополнительно CSRF-токен автоматически проверяется контроллером Yii 2 при POST, PUT, DELETE запросах. Если в момент проверки происходит несовпадение, то действие контроллера не может быть выполнено (#400 Bad Request). Также CSRF-токен автоматически добавляется во все формы, созданные с помощью ActiveForm.

Категорически запрещается отключение CSRF-токена в проектах.
Разрешается отключение CSRF-токена только при написании RESTful API , т.к. в этот момент его действительно невозможно проверить.

SQL-инъекции в Yii 2

Тема обширная. Самое главное понимать, что злоумышленник может вводить в поля все что угодно. Задача Yii 2 фильтровать запросы. Наша задача правильно составлять запросы для выборки данных. Запрещено при выборке данных использовать чистый SQL. Например, так делать запрещено:

  1. $model = Post::findOne(Yii::$app->request->get('id'));

Атакующий может составить запрос, позволяющий выполнить поиск по произвольному столбцу или даже SQL инъекцию. Еще пример:

  1. SELECT * FROM news WHERE MATCH(content) AGAINST('test') LIMIT 20

Вместо ‘test’ атакующий может передать с формы следующее:

  1. test');DELETE FROM authors WHERE id=15;

Тем самым у нас из таблицы authors пропадет запись с id=15

Еще пример:

  1. if (!$post = Post::find()->where('url = :url', [':url' => $url])->one()) {
  2. throw new NotFoundHttpException('Пост не найден!', 404);
  3. }

Если мы получаем данные из адресной строки, например $url = ‘moy-perviy-post’, то для составления запроса необходимо использовать привязанный параметр:

  1. ->where('url = :url', [':url' => $url])

Тем самым Yii 2 отфильтрует переменную $url и отсечет неблагоприятные данные.

Пароли

Пароли пользователей в БД должны храниться только в зашифрованном виде. Yii2 “из-коробки” позволяет это сделать. В PHP, начиная с версии 5.5, используется функция password_hash() или crypt() в более ранних. В результате получаем необратимую зашифрованную строку, состоящую из 60 символов. Устаревший метод хеширования MD5 использовать запрещено.