Perl CGI::Session->load() 는 호출마다 최종 액세스 시간이 갱신된다(몰랐다

9637 단어 Perl

WebSocket과 CGI :: 세션 하이브리드 시스템에서 발생하는 괴기 현상



이전에 만든 Perl Net::WebSocket::Server + CGI::Session으로 인증된 소켓 만들기 의 시스템에서, 접속중의 모든 세션의 타임 아웃 처리에 CGI::Session->load() 를 사용해 타임 아웃 판별을 실시하고 있었습니다.

이런 시스템에서 세션 관리와 만료일 판별에 CGI::Session을 이용.
誰かがWeb認証経由でWebSocketへアクセスする 
   -> セッションの有効期限が切れてる他のメンバーがいれば強制切断

세션 체크 부분
sub check_session {
    # IPアドレスとポートからセッションIDを取り出す
    my $conn = $_ && $_->can("socket") || !$_[1] ? $_: $_[0];
    my $addr = $conn->socket->peerhost(). ":". $conn->socket->peerport();
    my $sid = $_ && $_->can("socket") || !$_[1] ? $clients{$addr} : $_[1];
    my $session = CGI::Session->load(undef, $sid, {Directory=>'/.session'});
    # 生存チェック
    if (!(defined $session->id) || $sid ne $session->id) {
        $conn->disconnect($conn->socket); #お前はもう死んでいる
        print "dead session: ",$sid,"\n";
        undef $user_ids{$sid};
        undef $clients{$addr}; #セッションIDも消す
        return 0;
    }
    if(!defined($user_ids{$sid})){
        $user_ids{$sid} = $session->param('u');
    }
    return 1;
}

그러나 세션의 유효 시간 동안 다른 계정이 액세스하면 연결 중인 모든 세션의 _SESSION_ATIME이 업데이트되어 아무도 시간 초과되지 않습니다.

load() 함수는 유효기간을 연장시키지 않는다」라고 과신하고 있었던 것이 재해했습니다.


이런 느낌으로 전원 같은 시간에 갱신되고 있습니다. orz

역시 "Node.js에서 Perl CGI::Session에서 생성 된 SessionID에서 세션 가져 오기" 에서 했듯이, perl에서도 CGI::Session을 통하지 않고 직접 세션 파일을 읽는 것이 확실할지도 모르겠네요.

이런 용도에 CGI::Session 사용하는 사람은 적다고 생각합니다만, 액세스 시간을 갱신하지 않는 메소드를 추가해 주었으면 합니다.

추가

CGI-Session 없이 세션 읽기
sub getSession {
    my ($sid, $dir) = @_;
    my $filename = $dir . '/cgisess_' . $sid;
    my $text;
    if (-e $filename) {
        open (my $FILE, "<$filename") or die;
        $text = do { local $/; <$FILE> };
        close($FILE);
    }
    if($text && length($text) > 0){
        my $session = eval($text);
        #現在時刻
        my $now = time;
        #制限時間
        my $limit = $session->{_SESSION_ATIME} + $session->{_SESSION_ETIME};
        #現在時刻が制限時間を超えていたらアウト
        if($now >= $limit){
            return undef;
        }
        return $session;
    } else {
        return undef;
    }
}

그래, 괜찮아. . . 다른 좋은 방법은 없습니까?

좋은 웹페이지 즐겨찾기