From: Masahiro Tomita Date: 2011-07-27T12:48:35+09:00 Subject: [ruby-dev:44254] [Ruby 1.8 - Bug #5105][Open] CGI::Session#session_id の生成方法について Issue #5105 has been reported by Masahiro Tomita. ---------------------------------------- Bug #5105: CGI::Session#session_id の生成方法について http://redmine.ruby-lang.org/issues/5105 Author: Masahiro Tomita Status: Open Priority: Normal Assignee: Category: Target version: ruby -v: ruby 1.8.7 (2011-06-30 patchlevel 352) [i686-linux] とみたです。 古い話ですが、 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 -- http://redmine.ruby-lang.org