我的网络会话处理过程中是否存在缺陷?

use*_*033 0 perl session cgi

好吧,这样做的方式是用户通过Web表单进行身份验证并生成会话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;
}
Run Code Online (Sandbox Code Playgroud)

然后会话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;
}
Run Code Online (Sandbox Code Playgroud)

在后台我有一个cron作业,每5分钟运行一个脚本到期2个小时:

foreach (<../session/*>)
{
    unlink $_ if -M $_ > 0.08333;
}
Run Code Online (Sandbox Code Playgroud)

我在这里有任何瑕疵和不必要的步骤吗?我想使用user_agent和remote_addr,因为以这种方式插入会话ID会更难.

Ran*_*rtz 9

您不能假设用户和IP地址之间存在1-1对应关系.多个人可能来自同一个IP地址(代理后面).可能涉及多个IP地址(用户通过负载平衡或故障转移反向代理).

将IP地址混合到会话方案中的任何尝试最终会在您最不期望的时候中断,所以不要这样做.

如果您关心会话,请使用SSL.