2010-01-28 2 views
0

좋아 웹 양식을 사용하여 인증하고 그래서 세션 ID를 생성웹 세션 처리 프로세스에 결함이 있습니까? 이 작동하는 방식은 사용자가 그래서

sub session_open 
{ 
    my $sid; 
    my $user = shift; 

    if (open(SEMA, "> ../sema/sess")) 
    { 
     flock SEMA, LOCK_EX; 
     do 
     { 
      $sid = generate_session_id(); 
     } 
     while (-d "$SDIR/$sid"); 
     my $sstr = "$user:$ENV{'HTTP_USER_AGENT'}"; 
     write_file('>', "$SDIR/$sid", $sstr); 
     close SEMA; 
    } 

    return $sid; 
} 

세션 파일이 존재하고 있는지 체크 세션 ID는 다음 URL에 모든 페이지에 전달됩니다 배경에서

sub check_sid 
{ 
    my $sid = shift; 
    return 0 if $sid =~ /[^\w\d]/; 
    return 0 if !open(SID, "< $SDIR/$pid"); 
    my ($user, $agent) = split /:/, <SID>, 2; 
    close SID; 
    return 0 if $agent ne $ENV{'HTTP_USER_AGENT'}"; 
    return $user; 
} 

I 스크립트 2 시간 이전 세션 만료 5 분마다 실행되는 cron 작업이 :

foreach (<../session/*>) 
{ 
    unlink $_ if -M $_ > 0.08333; 
} 
을 자신의 사용자 에이전트 및 원격 요지에 대하여 밖으로는 사용자가 계속 할 수 있습니다

여기에있는 모든 결함, 불필요한 단계가 있습니까? 나는 someones 세션 ID를 그런 식으로 잭하는 것이 더 어려울 것이므로 user_agent와 remote_addr를 사용하는 것으로 생각했다.

답변

4

CGI::Session을 사용하십시오. CGI::Application::Plugin::Session을 참조하십시오.

  • session_open에 경쟁 조건이 있습니다.

  • 세션 처리 코드로 세션 파일에 다른 세션 정보를 쓸 수 있습니까?

  • check_sid에는 my $sid = shift;이 있지만 "$SDIR/$pid"을 열어보십시오.

  • 변수의 이름을 파일 이름에 올바르게 지정 했더라도 세션 ID를 잃지 않는 명백한 결함이 있습니다 (즉, 확인되지 않은 입력을 신뢰하고 있음). 이것을 두 개의 인수 형식 인 open을 사용한다는 사실과 결합하면 흥미로운 가능성을 제시 할 수 있습니다.

어떤 경우에도 세션 처리 코드를 작성해야 할 이유가 없습니다. 그 일은 당신을 위해 이루어졌습니다. 바퀴를 재발 명하지 마십시오.

+0

session_open에 세마포를 추가했는데 문제가 해결 되었습니까? LOCK_EX가 호출되는 스크립트의 여러 인스턴스에서 작동하는지 전혀 이해하지 못했습니다. 또한 CGI :: Session 어디서나 각 페이지의 세션 ID를 전달하고 기존 ID를 사용할 수있는 예제를 찾지 못했습니다. CGI에서 본 모든 예는 숨겨진 필드에 사용자 이름/암호를 항상 전달하고 사용자를 다시 기록합니다. 알고있는 자습서가 있습니까? – user105033

+0

또한 다른 세션 정보도 기록 할 수 없으며 '세션'이 아니라 사용자가 로그인했는지 여부를 결정하기 위해 인코딩 된 비밀번호를 페이지간에 전송하지 않아도되는 메커니즘입니다. . 실제 세션 데이터를 저장할 필요가 없습니다. – user105033

+1

@unknown'CGI :: Application :: Plugin :: Session' 예제 나'CGI : Session' 문서를 참조하십시오 : 현재'$ cgi' 인스턴스를'CGI :: Session' 생성자로 전달하십시오. 숨겨진 필드에 사용자 이름/암호 정보를 전달할 필요는 없습니다.또한 세션 정보를 저장할 필요가없는 경우 HTTP 인증을 사용하지 않는 이유는 무엇입니까? –

9

사용자와 IP 주소간에 1-1 대응을 가정 할 수 없습니다. 동일한 IP 주소 (프록시 뒤)에서 여러 명이 들어올 수 있습니다. 여러 IP 주소가 관련 될 수 있습니다 (사용자가 부하 분산 또는 장애 조치 역방향 프록시를 통해 들어오는 사용자).

IP 주소를 세션 스키마에 혼합하려는 시도는 예상치 못한 경우 결국 중단됩니다. 그러지 마십시오.

세션에 신경 쓰면 SSL을 사용하십시오.

+0

ADDR의 요점은 1-1 coorepondence를 제공하는 것이 아니라 다른 보안 계층을 추가하는 것이 었습니다. 누군가 세션 ID를 보유하고 있다면 IP 및 사용자 클라이언트도 알고 있어야합니다. (그들이 세션 ID를 가지고 있다면 그들은 아마도 IP를 이미 알고있을 것입니다 ...) – user105033

+0

랜달 (Randal)의 지적은 단일 사용자가 단일 세션 동안 하나의 IP를 가질 수 있다는 것입니다. 특정 IP 주소로 세션을 연결하면 해당 사용자에게 문제가 발생합니다. – cjm

+0

오 ~ 알았어. – user105033

관련 문제