我在代码中引用的常量哈希值如下:
CATEGORIES = {
business: '1002',
education: '1003',
entertainment: '1004',
# etc...
}
在我的一个控制器中,我需要通过参数测试现有的类别,所以通常我会做类似的事情:
CATEGORIES.has_key? params[:category].to_sym
然而,这似乎是对拒绝服务攻击的邀请,因为攻击者可以通过为category
参数提供随机字符串来轻松炸毁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中有更好或更惯用的方法吗?
答案 0 :(得分: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
答案 1 :(得分:0)
您只需检查params[:category]
是否在CATEGORIES.values
。在这种情况下,我不明白为什么你需要担心哈希键......看起来它们只是为了可读性。
params[:category].in? CATEGORIES.values
或
CATEGORIES.values.include? params[:category]
我应该提到,in?
由ActiveSupport提供,而include?
由Ruby标准库提供。