rails security:将参数转换为符号以进行哈希查找

时间:2013-05-18 15:55:37

标签: ruby ruby-on-rails-3

我在代码中引用的常量哈希值如下:

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中有更好或更惯用的方法吗?

2 个答案:

答案 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标准库提供。