Строгие параметры
Безопасные параметры
«Строгие параметры» — бесплатный урок Ruby Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Ruby Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Ruby Academy содержит 4 уроков всего.
Проблема массового присваивания
Формы отправляют сразу много полей. Если без проверки передать их все модели, злоумышленник может добавить поля, которые вы не предусматривали, например установить admin: true. Это уязвимость массового присваивания.
- Данные пользователя нельзя считать доверенными.
- Необходимо явно разрешать только допустимые поля.
- Rails обеспечивает это с помощью строгих параметров.
Что такое строгие параметры
Строгие параметры требуют явно объявлять, какие параметры может принимать модель. Rails вызывает ошибку, если вы пытаетесь выполнить массовое присваивание неразрешённых параметров.
Так незаметная уязвимость превращается в явно разрешённый и проверенный список полей.
require и permit
Этот шаблон использует два метода:
require(:model)проверяет наличие ключа верхнего уровня.permit(:field, ...)разрешает указанные вложенные поля.
def article_params
params.require(:article).permit(:title, :body)
endИспользование вспомогательного метода
Определите приватный метод model_params и вызывайте его там, где создаёте или обновляете запись. Никогда не передавайте модели необработанные params.
def create
@article = Article.new(article_params)
@article.save
redirect_to @article
end
private
def article_params
params.require(:article).permit(:title, :body)
endЗачем нужен приватный метод
Если хранить список разрешённых полей в одном приватном методе:
createиupdateиспользуют одни и те же правила.- Разрешённые поля легко найти и проверить.
- Метод не становится действием контроллера (приватные методы недоступны через маршруты).
Что отфильтровывается
Любой переданный ключ, отсутствующий в списке permit, отбрасывается до передачи модели. Если форма каким-то образом содержит admin, но вы разрешили только title и body, значение admin молча игнорируется, и запись остаётся защищённой.
Разрешение массивов
Для списков флажков или полей множественного выбора, которые отправляют массивы, разрешите массив, передав пустой массив в качестве значения. Это позволяет передавать несколько значений для данного ключа.
params.require(:article).permit(:title, tag_ids: [])Разрешение вложенных хешей
Для вложенных атрибутов (формы, которая одновременно редактирует родительскую запись и её дочерние записи) разрешите вложенные ключи с помощью хеша, описывающего внутренние поля.
params.require(:order).permit(
:customer_name,
items_attributes: [:product_id, :quantity]
)Обработка отсутствующих параметров
Если обязательный ключ отсутствует, require вызывает ParameterMissing, а Rails возвращает ответ 400 с сообщением «Некорректный запрос». Это автоматически защищает действия от неправильно сформированных запросов.
# Missing :article key raises:
# ActionController::ParameterMissingpermit! опасен
Можно вызвать params.permit!, чтобы разрешить всё, но это снова открывает уязвимость массового присваивания. Избегайте этого, кроме доверенных внутренних сценариев. Всегда отдавайте предпочтение явному списку разрешённых полей.
Рекомендации
Безопасная работа с параметрами:
- Включайте в список разрешённых только минимальный набор полей.
- Никогда не разрешайте передавать конфиденциальные флаги вроде
roleилиadminиз общедоступной формы. - Задавайте такие поля явно в контроллере на основе логики на стороне сервера.
Быстрая проверка
Проверьте, насколько хорошо Вы понимаете строгие параметры.
Итоги: строгие параметры
Вы научились безопасно фильтровать входные данные:
- Массовое присваивание представляет реальный риск для безопасности.
requireтребует наличия верхнего ключа, аpermitформирует список разрешённых полей.- Храните список разрешённых полей в общем приватном методе.
- При необходимости разрешайте массивы и вложенные хеши.
- Избегайте
permit!и никогда не разрешайте конфиденциальные флаги.
Далее Вы будете возвращать ответы с помощью представлений и рендеринга.
Часто задаваемые вопросы
Урок «Строгие параметры» бесплатный?
Да — полный текст урока «Строгие параметры» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Ruby Academy, подпишись на CoddyKit PRO. Курс Ruby Academy содержит 4 уроков всего.
Чему я научусь в уроке «Строгие параметры»?
Безопасные параметры Ты практикуешь Ruby Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Ruby Academy?
Предыдущий опыт не требуется. Ruby Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Строгие параметры»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Ruby Academy?
Да. Каждый урок Ruby Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Маршруты и ресурсы
- Контроллеры и действия
- Строгие параметры
- Представления и отображение