3 回答

TA貢獻1829條經驗 獲得超7個贊
您帶來的第一個解決方案是一個很好的解決方案。一些眾所周知的框架用于實現類似的邏輯。
例如,最新的 Rails 版本帶有一個內置的解決方案,以防止用戶在請求中添加額外的數據,從而導致服務器更新數據庫中的錯誤字段。它是一種由ActionController::Parameters類實現的白名單。
假設我們有一個如下所示的控制器類。出于本說明的目的,它包含兩個update操作。但是你不會在真正的代碼中看到它。
class PeopleController < ActionController::Base
? # 1st version - Unsafe, it will rise an exception. Don't do it
? def update
? ? person = current_account.people.find(params[:id])
? ? person.update!(params[:person])
? ? redirect_to person
? end
? # 2nd version - Updates only permitted parameters
? def update
? ? person = current_account.people.find(params[:id])
? ? person.update!(person_params) # call to person_params method
? ? redirect_to person
? end
? private
? def person_params
? ? params.require(:person).permit(:name, :age)
? end
end
由于第二個版本只允許允許的值,它會阻止用戶更改有效負載并發送包含新密碼值的 JSON:
{ name: "acme", age: 25, password: 'account-hacked' }

TA貢獻1890條經驗 獲得超9個贊
如果無法寫入名稱,則無法為任何更新請求提供該名稱。如果名稱存在,我會拒絕該請求。如果我想要更寬容,我可能會考慮僅在 name 與當前 name 不同時拒絕請求。
我不會默默地忽略與當前名稱不同的名稱。
- 3 回答
- 0 關注
- 448 瀏覽
添加回答
舉報