スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

CGI::SessionのセッションIDの重複

CGI::SessionのセッションIDの重複については大丈夫なのかと気になって調べたところ、ここに複数サーバでの運用の場合重複の可能性があるということと、その解決法があった。

セッションIDの生成にはMD5を使ってて、その種が

$$ -> プロセスID
time() -> 1970年1月1日からの経過秒数
rand(time) -> 乱数

だから、単一サーバでは問題ないけど、複数サーバでは重複するかもしれないということ。

で、解決法では種にホスト名を追加してるみたい。

自分の環境では
/usr/lib/perl5/site_perl/5.8.5/CGI/Session/ID/md5.pm
なので、これを
/usr/lib/perl5/site_perl/5.8.5/CGI/Session/ID/md5_for_multi_server.pm
にコピーする。

で、↓みたいに変更する。
package CGI::Session::ID::md5_for_multi_server; ← md5をmd5_for_multi_serverに変更。

use strict;
use Digest::MD5;
use Sys::Hostname; ← 追加。
use CGI::Session::ErrorHandler;

$CGI::Session::ID::md5_for_multi_server::VERSION = '1.00'; ← md5をmd5_for_multi_serverに変更。バージョンは適当に。
@CGI::Session::ID::md5_for_multi_server::ISA = qw( CGI::Session::ErrorHandler ); ← md5をmd5_for_multi_serverに変更。

*generate = \&generate_id;
sub generate_id {
    my $md5 = new Digest::MD5();
    $md5->add($$ , time() , rand(time) , hostname()); ← hostname()を追加。
    return $md5->hexdigest();
}

1;

セッションIDを生成する時は、今まで例えば
my $session = CGI::Session->new(undef, undef, {Directory => '/hogeDir'});
みたいにしてたのを
my $session = CGI::Session->new('driver:file;serializer:default;id:md5_for_multi_server', undef, {Directory => '/hogeDir'});
に変更する。

第一引数がundefだと、デフォルトの
driver:file;serializer:default;id:md5
になるから
driver:file;serializer:default;id:md5_for_multi_server
に変更するわけだ。

この記事のトラックバックURL

http://ysmt.blog21.fc2.com/tb.php/252-87d5ba4f

コメント

管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます

コメントする

管理者にだけ表示を許可する

Template Designed by DW99

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。