Issue #5105 has been reported by Masahiro T…
Bug #5105: CGI::Session#session_id の生成方法について
Author: Masahiro T.
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')
-
endmd5.hexdigest
private :create_new_id