スポンサーサイト
上記の広告は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
にコピーする。
で、↓みたいに変更する。
セッション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
に変更するわけだ。
セッション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
に変更するわけだ。
スポンサーサイト