좋아 웹 양식을 사용하여 인증하고 그래서 세션 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를 사용하는 것으로 생각했다.
session_open에 세마포를 추가했는데 문제가 해결 되었습니까? LOCK_EX가 호출되는 스크립트의 여러 인스턴스에서 작동하는지 전혀 이해하지 못했습니다. 또한 CGI :: Session 어디서나 각 페이지의 세션 ID를 전달하고 기존 ID를 사용할 수있는 예제를 찾지 못했습니다. CGI에서 본 모든 예는 숨겨진 필드에 사용자 이름/암호를 항상 전달하고 사용자를 다시 기록합니다. 알고있는 자습서가 있습니까? – user105033
또한 다른 세션 정보도 기록 할 수 없으며 '세션'이 아니라 사용자가 로그인했는지 여부를 결정하기 위해 인코딩 된 비밀번호를 페이지간에 전송하지 않아도되는 메커니즘입니다. . 실제 세션 데이터를 저장할 필요가 없습니다. – user105033
@unknown'CGI :: Application :: Plugin :: Session' 예제 나'CGI : Session' 문서를 참조하십시오 : 현재'$ cgi' 인스턴스를'CGI :: Session' 생성자로 전달하십시오. 숨겨진 필드에 사용자 이름/암호 정보를 전달할 필요는 없습니다.또한 세션 정보를 저장할 필요가없는 경우 HTTP 인증을 사용하지 않는 이유는 무엇입니까? –