XREAの共用SSLアクセスでCGI::Sessionの-ip_matchを機能させる

XREAの共用SSLサーバを使ってPerlCGIを使うとして、これってプロキシになっていて、スクリプト側からすると、非SSL通信になっていますので、$ENV{'REMOTE_ADDR'}は、XREAのサーバのIPアドレスになってしまいます。

CGI::Sessionの-ip_matchに影響が出るので、パッチします。

前提条件として、使っているXREACGI::Sessionのバージョンが3.95である事を確認。sshで入って、/usr/bin/less /usr/local/lib/perl5/site_perl/5.8.4/CGI/Session.pm でどうぞ。

バージョン上がるとpatchあてずdieします。4.0系になるとパッチを書き換えないといけないので注意。

#!/usr/bin/perl
use strict;
use warnings;
use CGI::Session qw(-ip_match);
cgi_session_fixup();


#メインルーチンここにかけ

exit;


# CGI::SessionをXREAの共通SSLに対応させるパッチ
sub cgi_session_fixup {
  # このpatchは、XREAにインストール済みのCGI::Session 3.95のみ対応
  die 'CGI::Session ga 3.95 yori new!'
    if CGI::Session->VERSION > 3.95;
  package CGI::Session;
  no warnings 'redefine';
  
  *__remote_addr = sub {
    # XREA SSLアクセス対策
    # XREAのhttps://ss1.xrea.com 経由でアクセスすると、
    # 内部的には XREAの内部サーバからアクセスされていることに
    # なるので、CGI::Session の -ip_matchの動きに影響が出ます。
    # XREAの内部サーバ経由時には、環境変数HTTP_X_FORWARDED_FOR
    # を入れることにします。
    if($ENV{'REMOTE_ADDR'} =~ /^192\.168\./ ||
       $ENV{'REMOTE_ADDR'} =~ /^219\.101\.229\./) {
      return $ENV{HTTP_X_FORWARDED_FOR};
    } else {
      return $ENV{REMOTE_ADDR};
    }
  };
  *_ip_matches = sub {
      return ( $_[0]->{_DATA}->{_SESSION_REMOTE_ADDR} eq __remote_addr() );
  };
  # _init_new_session() - initializes a new session
  *_init_new_session = sub {
      my $self = shift;
      
      my $currtime = time();
      $self->{_DATA} = {
          _SESSION_ID => $self->generate_id($self->{_OPTIONS}),
          _SESSION_CTIME => $currtime,
          _SESSION_ATIME => $currtime,
          _SESSION_ETIME => undef,
          _SESSION_REMOTE_ADDR => __remote_addr() || undef,
          _SESSION_EXPIRE_LIST => { },            
      };
      
      # to Chris Dolan's request:
          # I'm not sure if this information should be serialized (placed under _DATA),
          # but I don't see any desperate need for it. So let it be part of the object
          $self->{_IS_NEW} = 1;
      
      $self->{_STATUS} = MODIFIED;
      
      return 1;
  };
return 1;
}

このエントリを書くにあたって、

http://sb.xrea.com/showthread.php?&threadid=6646
http://sb.xrea.com/showthread.php?t=8531
404 Blog Not Found:perl - パッチなしでパッチする

を参考にしたよ。