Ruby rails安全性:将参数转换为符号以进行哈希查找

Ruby rails安全性:将参数转换为符号以进行哈希查找,ruby,ruby-on-rails-3,Ruby,Ruby On Rails 3,我在代码中引用了一组散列常量,如: CATEGORIES = { business: '1002', education: '1003', entertainment: '1004', # etc... } 在我的一个控制器中,我需要通过参数测试类别的存在性,因此通常我会执行以下操作: CATEGORIES.has_key? params[:category].to_sym def self.valid_category?(category) category =

我在代码中引用了一组散列常量,如:

CATEGORIES = {
  business:  '1002',
  education:  '1003',
  entertainment:  '1004',
  # etc...
}
在我的一个控制器中,我需要通过参数测试类别的存在性,因此通常我会执行以下操作:

CATEGORIES.has_key? params[:category].to_sym
def self.valid_category?(category)
  category = category.to_s
  CATEGORIES.keys.any? { |key| key.to_s == category }
end
然而,这似乎是对拒绝服务攻击的一种邀请,因为攻击者可以通过为
category
params提供随机字符串来轻易地破坏Ruby符号表

似乎最简单的解决方案是将
类别
键转换为字符串而不是符号:

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中有更好或更惯用的方法来实现这一点吗?

您只需检查
params[:category]
是否在。我不明白你为什么要担心这种情况下的散列键。。。看起来它们只是为了可读性

params[:category].in? CATEGORIES.values

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

在Rails中有更好或更惯用的方法来实现这一点吗

我见过的最常见的方法是您提供的第二种解决方案,即:

def self.valid_category(category_s)
  CATEGORIES.keys.any? { |key| key.to_s == category_s }
end
尽管如此,我还是将该方法命名为
self.valid\u category?
。也许我还可以将category变量上的.to_移到这个方法中,比如:

CATEGORIES.has_key? params[:category].to_sym
def self.valid_category?(category)
  category = category.to_s
  CATEGORIES.keys.any? { |key| key.to_s == category }
end

代表类别的是散列键,而不是它们的值。测试密钥是否存在就是验证该类别是否存在。公平的说,我误解了。我认为使用字符串作为键是一个很好的解决方案。