Project

General

Profile

Actions

Backport #5105

closed

CGI::Session#session_id の生成方法について

Added by tommy (Masahiro Tomita) almost 13 years ago. Updated almost 5 years ago.

Status:
Closed
Assignee:
-
[ruby-dev:44254]

Description

とみたです。

古い話ですが、 r13672 で CGI::Session#session_id が SecureRandom が生成
した乱数を単純に使用するようになっています。それまではタイムスタンプ &
プロセスID & 乱数 & 固定文字から生成した MD5 ダイジェスト値が使用されて
いました。

このように生成した MD5 ダイジェスト値よりも、単純に乱数をそのまま使用す
る方が重複が発生しやすくなってしまっているんじゃないかと思うのですがど
うでしょう。

というか、実際に重複が発生してしまったので。

以下、SecureRandom を使いつつ元の挙動に戻すパッチです。

--- lib/cgi/session.rb.orig 2009-02-20 19:35:11.000000000 +0900
+++ lib/cgi/session.rb 2011-07-27 12:27:57.000000000 +0900
@@ -25,6 +25,8 @@

require 'cgi'
require 'tmpdir'
+require 'securerandom'
+require 'digest/md5'

class CGI

@@ -174,21 +176,15 @@
# is used internally for automatically generated
# session ids.
def create_new_id

  •  require 'securerandom'
    
  •  begin
    
  •    session_id = SecureRandom.hex(16)
    
  •  rescue NotImplementedError
    
  •    require 'digest/md5'
    
  •    md5 = Digest::MD5::new
    
  •    now = Time::now
    
  •    md5.update(now.to_s)
    
  •    md5.update(String(now.usec))
    
  •    md5.update(String(rand(0)))
    
  •    md5.update(String($$))
    
  •    md5.update('foobar')
    
  •    session_id = md5.hexdigest
    
  •  end
    
  •  session_id
    
  •  r = SecureRandom.random_bytes(16) rescue rand(0).to_s
    
  •  md5 = Digest::MD5::new
    
  •  now = Time::now
    
  •  md5.update(now.to_s)
    
  •  md5.update(String(now.usec))
    
  •  md5.update(r)
    
  •  md5.update(String($$))
    
  •  md5.update('foobar')
    
  •  md5.hexdigest
    
    end
    private :create_new_id
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0