簡體   English   中英

聲明強參數中的值不能是數組或單一標量類型

[英]Declare that the value in strong params must NOT be an array or of a one scalar type

應用程序接受 GET 請求以索引產品並接受page參數(應該是整數)。

例如http://localhost/products?page=2

有沒有辦法確保它真的是 integer?

或者實際上問題是:有沒有辦法確保它不是數組?

例如http://localhost/products?page[]=2http://localhost/products?page[random_key]=2

這將導致代碼某處出錯。

現在,我知道有一種方法可以聲明它應該是一個數組或一個 json:

要聲明 params 中的值必須是允許標量值的數組,map 是空數組的鍵:

params.permit(id: [])

我能想到的最簡單的方法就是直接測試它是否不是數組:

run_the_code unless params[:page].is_a?(Array)
# or
run_the_code if params[:page].is_a?(Integer)

但是沒有更簡單的方法來使用 ActionParameters API 嗎?

例如

params.permit(page: :integer)

強參數 API 實際上只設計用於做一件事——將參數切分到白名單,以避免惡意用戶設法分配他們不應該分配的屬性的大規模分配漏洞。 它不關心驗證參數的存在或類型。 那不是它的工作。

如果您只使用.permit(:page) ,則不必擔心它是一個數組,因為允許的標量類型不包括哈希或 arrays。但這實際上更多地用於防止 setter 方法可以接受的漏洞利用a hash 然后驗證參數的類型。

還有一個小事實,即表單數據對(在查詢和請求正文中)都沒有類型化——它只是字符串,實際上只是將參數轉換為預期類型的后端。 params[:page].is_a?(Integer)因此將始終為假。 除了解析哈希和 arrays Rack 實際上沒有任何內置類型提示,例如?page(i)=2就像您在某些框架中會發現的那樣。

通常在 Rails 中,model 處理用戶輸入的類型轉換並提供驗證。

# this is ridiculously overkill
class Paginator
  include ActiveModel::Model
  include ActiveModel::Attributes
  attribute :page, :integer
  attribute :per_page, :integer
  validates :page, numericality: { only_integer: true }
  validates :per_page, numericality: { only_integer: true }

  def to_query
    attributes.symbolize_keys.compact_blank
  end
end
paginator = Paginator.new(params.permit(:page, :per_page))
if paginator.valid?
  Othermodel.paginate(**paginator.to_query)
end

然而,有些 gem 提供替代方法,例如干式驗證,或者您可以簡單地編寫一個方法,如果不能將參數強制轉換為非零值 integer 則拒絕該參數。

private 

def page
  params.permit(:page).to_i.then{ |n| n.zero? ? nil : n }
end 

暫無
暫無

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

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