Параметры являются частью HTTP-запросов.HTTP-запросы не имеют ограничений на то, что может быть отправлено в качестве параметра (вне размера отправляемых данных).Таким образом, вы можете отправить запрос на любой маршрут на вашем сервере с параметрами.
Rails пытается предотвратить попадание злых, подлых людей в параметры и значения, к которым они не принадлежат.Мы можем сделать это, создав метод, который упаковывает наш объект params в указанную структуру:
params.require(:user).permit(:name, :email, :password, :password_confirmation)
Это означает, что params
должен быть отправлен в следующем формате:
user: {
name: "name",
password: "password",
password_confirmation: "password"
}
Если выпроверяя ваши логи в разработке, Rails будет отображать ваши параметры (если они будут отправлены) в каждом запросе.Если ваши параметры не в этом формате (с пользователем на корневом уровне), и вы используете метод user_params
, он выдаст ошибку.user
является обязательным .И если кто-то отправит параметры:
user: {
name: "name",
pseudonym: "sneaky param",
password: "password",
password_confirmation: "password"
}
Rails по-прежнему будет принимать name
, password
и password_confirmation
, но отклонит pseudonym
, поскольку это не разрешено вашим методом user_params
.
В большом количестве кода вы увидите, что люди получают значение params[:id]
напрямую.Это потому, что мы часто используем это только для чтения или уничтожения элемента.Методы *_params
обычно зарезервированы для действий CREATE и UPDATE в контроллере, потому что именно здесь мы вводим параметры.
Это не является технически необходимым.Rails уже очищает пользовательский ввод в запросах Active Record.Таким образом, это не прямое требование для безопасного приложения.Вы можете извлечь параметры непосредственно из хеша параметров, а не использовать этот метод.Но это, безусловно, держит ваш код сухим.Это также гарантирует, что вы не предоставляете пользователю доступ к важным метаданным в вашей модели.Например, если вы ТАК, у вас (хотя и маловероятно) есть колонка upvote для моего поста.Если вы внесете белый список всех параметров и просто примете все параметры в методе Post.update(params)
, я мог бы отправить запрос POST
с параметрами upvotes: 1,000,000
.Я не думаю, что им это вообще понравится.