簡體   English   中英

Rails:是否可以使用HTTP請求(Devise,protect_from_forgery)更新外鍵?

[英]Rails: is it possible to update a foreign key with a HTTP request (Devise, protect_from_forgery)?

我正在編寫一個模塊,該模塊限制用戶僅對其資源進行操作。 說,只有房客1 belongs_to他/她,房東才能執行GET /tenants/1

在租戶控制器的更新操作中,我具有以下代碼塊

respond_to do |format|
  if @tenant.update_attributes(params[:tenant])
    format.html { redirect_to @tenant, notice: 'Tenant was successfully updated.' }
    format.json { render json: @tenant }
  # else ...
end

landlord是否可以更新其tenant的外鍵,以便tenant的記錄有可能移至其他landlord的帳戶? 我在應用程序控制器中使用Devise通過protect_from_forgery進行身份驗證。 我可以從瀏覽器的HTML頁面源中提取authenticity_token ,但是帶有該令牌的cURL請求失敗-警告:無法驗證CSRF令牌的真實性。

是否可以通過HTTP請求偽造記錄上的外鍵? 我需要檢查在params哈希中傳遞的外鍵嗎?

如果您不想這樣做,則應使用強參數。

在您的控制器中:

def tenant_params
   params.require(:tenant).permit(:name, :address ... ) # make sure  :landlord_id is not there
end

並在您的更新操作中:

respond_to do |format|
    if @tenant.update_attributes(tenant_params)
    ...

這樣,即使在不太可能的情況下,有人成功地誘使用戶訪問了一個如此復雜的頁面,實際上該頁面實際上能夠繞過csrf令牌並將landlord_id參數發送到update操作,該參數也將被忽略,因為它顯然不是允許的。

還有另一種方法,例如,如果您的字段列表太長而無法處理,或者由於您自己的任何其他原因,則可以使用后置字符串中的一個參數作為替代,而不使用強參數:

在您的更新操作中:

params[:tenant].except!(:landlord_id) if !params[:tenant][:landlord_id].nil? #don't forget to use the "bang" (!)
respond_to do |format|
    if @tenant.update_attributes(params[:tenant])
    ....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM