我不確定我是否正確理解了強引數的概念。我應該對僅用于編輯某些資料的引數使用強引數嗎?或者我應該將它們用于我想在控制器中獲得的每個引數?例如我想獲取兩個日期之間的資料,所以我需要 date1 和 date2 作為引數。我應該在這里使用強引數嗎?
uj5u.com熱心網友回復:
了解何時應該使用強引數的最簡單方法是了解質量分配易損性是什么。在 Rails 3 中,您可以執行以下操作:
class CreateUsers < ActiveRecord::Migration[3.0]
def change
create_table :users do |t|
t.string :email
t.string :encrypted_password
t.boolean :admin
t.timestamps
end
end
end
class UserController < ApplicationController
def create
@user = User.new(params[:user])
if @user.save
redirect_to @user
else
render :new
end
end
end
這里我們只是將一個“哈希”(它實際上是一個 ActionController::Parameters 實體)直接傳遞到模型中。惡意用戶在這里要做的就是請求:
POST /users?users[admin]=1
他們已經創建了一個管理員帳戶。2012 年,Egor Homakov 著名地利用了 Github 中的一個此類漏洞提交到 Rails 存盤庫。
使用 cURL 或通過使用 web 檢查器來操作表單來執行此類攻擊是微不足道的。
如果我們將用戶應該能夠傳遞的屬性列入白名單:
class UserController < ApplicationController
def create
@user = User.new(
params.require(:user)
.permit(:email, :password, :password_confirmation)
)
if @user.save
redirect_to @user
else
render :new
end
end
end
這樣就避免了這個漏洞——強引數實際上只是一個簡單的 DSL,用于對嵌套散列狀結構進行切片和切塊。Rail 4 中的變化是,當您將 的實體傳遞ActionController::Parameters給模型時,除非呼叫#permitted?引數物件回傳 true,否則會引發例外。這避免了僅僅由于程式員的懶惰或無知而發生的大規模賦值漏洞。
它不會以任何其他方式清理您的輸入。例如,如果您不小心處理用戶輸入,它不會阻止 SQL 注入或遠程代碼執行。
You don't need strong parameters if you're passing parameters one by one like in this very contrived example:
class UserController < ApplicationController
def create
@user = User.new do |u|
u.email = params[:user][:email]
u.password = params[:user][:password]
u.password_confirmation = params[:user][:password_confirmation]
end
if @user.save
redirect_to @user
else
render :new
end
end
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/314937.html
上一篇:從實體方法呼叫中初始化
下一篇:Rails-對加密欄位求和
