2013-05-18 43 views
4

我有常數我指的是在我的代碼一樣的哈希值:導軌安全:轉換參數符號哈希查找

CATEGORIES = { 
    business: '1002', 
    education: '1003', 
    entertainment: '1004', 
    # etc... 
} 

在我的控制器之一,我需要測試通過一個類別的現有參數,所以通常我會做這樣的事情:

CATEGORIES.has_key? params[:category].to_sym 

但是這似乎是邀請服務拒絕攻擊,因爲攻擊者可以很容易地通過category PARAMS提供隨機字符串炸燬了Ruby符號表。

似乎是最簡單的解決方案是將CATEGORY鍵轉換爲字符串,而不是符號:

CATEGORIES = { 
    'business' => '1002', 
    'education' => '1003', 
    'entertainment' => '1004', 
    # etc... 
} 

或許:

def self.valid_category(category_s) 
    CATEGORIES.keys.any? { |key| key.to_s == category_s } 
end 

有沒有更好的或者更地道方式來做到這一點Rails的?

回答

2

在Rails中有更好或更習慣的方式來做到這一點嗎?

最常用的方法,我所看到的是你提供的第二個解決方案,即:

def self.valid_category(category_s) 
    CATEGORIES.keys.any? { |key| key.to_s == category_s } 
end 

雖然,我會命名方法self.valid_category?。也許我也會將類別變量上的.to_s移動到這個方法,所以類似於:

def self.valid_category?(category) 
    category = category.to_s 
    CATEGORIES.keys.any? { |key| key.to_s == category } 
end 
0

您可以檢查params[:category]是否在CATEGORIES.values。我不明白爲什麼你需要在這種情況下擔心散列鍵......它看起來像只是爲了可讀性。

params[:category].in? CATEGORIES.values 

CATEGORIES.values.include? params[:category] 

我應該指出,in?通過的ActiveSupport提供的,而include?由紅寶石標準庫提供。

+0

這是代表類別的哈希鍵,而不是它們的值。測試密鑰是否存在是驗證該類別是否存在。 –

+0

夠公平,我誤解了。我認爲使用字符串作爲鍵是一個很好的解決方案。 –