簡體   English   中英

ActiveSupport :: CoreExtensions :: String :: Inflections.constantize可以安全地與用戶提供的數據一起使用嗎?

[英]Is ActiveSupport::CoreExtensions::String::Inflections.constantize safe to use with user-supplied data?

背景

目前,我正在研究Rails應用程序。 我有不同的產品可以通過不同的供應商進行處理。 所有供應商都需要特定格式的文本文件才能處理訂單。

我決定使用Factory類生成Formatter類的實例,這些實例將以正確的格式呈現訂單信息。

在工廠類中,我正在考慮使用以下代碼:

class ExportFactory
  def self.exporter_class_for_vendor(vendor_name)
    class_name = "ProductExporter#{vendor_name}".gsub(' ','').camelize
    class_name.constantize
  end
end

在用戶提交的數據上使用ActiveSupport :: CoreExtensions :: String :: Inflections.constantize會保存嗎? 或者,我應該只是硬編碼類名。

注意:在此特定應用程序中,唯一能夠更改給定數據的用戶將是在整個系統中具有完全控制權的管理員用戶。

它應該是安全的,但這取決於你之后用它做什么。

例如,如果您稍后在類上調用#delete ,則File的輸入將是危險的。

我首選的方法是將所有用戶可訪問的類保留在模塊中,然后根據該模塊的#constants驗證用戶輸入。 這可以確保您只為用戶打開ruby命名空間的一個小子部分,並且還允許您創建下拉菜單,以便用戶可以選擇模塊,而不僅僅是猜測名稱。

提供這種相同安全級別的另一種方法是在用戶輸入的開頭為該模塊的名稱添加前綴,其中包含可用的類。

module AvailableClasses
  Foo = ::Foo
  Bar = ::Bar
end

validates_inclusion_of :user_input, :in => AvailableClasses.constants

AvailableClasses.const_get(user_input)

"AvailableClasses::#{user_input}".constantize

暫無
暫無

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

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