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

我有一个常量的哈希值,我在整个代码中都提到了:

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

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

CATEGORIES.has_key? params[:category].to_sym

然而,这似乎是对拒绝服务攻击的邀请,因为攻击者可以通过为类别参数提供随机字符串来轻松炸毁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中有更好或更惯用的方法吗?

最佳答案

Is there a better or more idiomatic way to do this in 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
点赞