4

我有一个我在整个代码中引用的常量哈希,例如:

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

在我的一个控制器中,我需要通过参数测试类别的存在,所以通常我会做类似的事情:

CATEGORIES.has_key? params[:category].to_sym

然而,这似乎是对拒绝服务攻击的邀请,因为攻击者可以通过为参数提供随机字符串来轻松炸毁 Ruby 符号表category

似乎最简单的解决方案是将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 中是否有更好或更惯用的方法来做到这一点?

4

2 回答 2

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
于 2014-07-30T09:27:02.050 回答
0

你可以只检查是否params[:category]CATEGORIES.values. 我不明白为什么在这种情况下你需要担心哈希键......看起来它们只是为了可读性。

params[:category].in? CATEGORIES.values

或者

CATEGORIES.values.include? params[:category]

我应该提到它in?是由 ActiveSupport 提供的,而include?它是由 Ruby 标准库提供的。

于 2013-05-18T16:01:27.680 回答