加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 使用Symbol vs String作为params散列中的键的R

发布时间:2020-12-16 19:04:47 所属栏目:百科 来源:网络整理
导读:如果我们使用字符串作为Hash键,Ruby需要评估字符串并查看它的内容(并在其上计算散列函数)并将结果与??已存储在Hash中的键的(散列)值进行比较. 如果我们使用一个符号作为Hash键,它隐含它是不可变的,所以Ruby基本上只是将object-id的(哈希函数)与已经存储在其
如果我们使用字符串作为Hash键,Ruby需要评估字符串并查看它的内容(并在其上计算散列函数)并将结果与??已存储在Hash中的键的(散列)值进行比较.

如果我们使用一个符号作为Hash键,它隐含它是不可变的,所以Ruby基本上只是将object-id的(哈希函数)与已经存储在其中的键的(哈希)对象-id进行比较.哈希. (快多了).

但事情是在Rails params中,它是HashWithIndifferentAccess的实例,如果我们写params [:some_key]它将:some_key转换为’some_key’然后它会尝试在params hash中查找键.
line 159

def convert_key(key)
    key.kind_of?(Symbol) ? key.to_s : key
  end

因此,如果在Hash中将String作为键,查找速度很慢,为什么HashWithIndifferentAccess会将符号键转换为字符串.

解决方法

原因之一是安全性.它在Ruby 2.2或更高版本中已不再适用.

在Ruby 2.2符号没有被垃圾收集之前.这意味着一旦通过文字(:my_symbol)或#to_sym创建符号,它就会永远存在.

如果Rails使用符号而不是字符串,那么它将创建与请求中的params名称相对应的符号.攻击者可以使用名为param1,param2,…的params发送请求,并通过使应用程序分配数十万个符号来耗尽服务器内存.

在Ruby 2.2或更高版本中不再是这种情况

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读