如何在使用perl cgi重定向时屏蔽url参数

时间:2015-01-20 14:42:16

标签: perl redirect cgi

我有authenticate.cgi脚本,它接收用户名/密码并验证它们。

如果是有效登录,我会通过发送一些参数(如开始日期/用户名等)将页面重定向到myIndex.cgi,并向用户显示报告。

如果登录无效,我会重定向到上一页,因此可以重新输入用户名/密码。

当我重定向到myIndex.cgi时,url显示url栏中的所有参数。 有没有办法掩盖它们,所以参数及其值不会显示在网址中。

有办法吗?请告诉我。感谢。

authenticate.cgi

#Redirect to login if invalid username/password or redirect to report page
if ( ( $username eq '' ) ||  ( $password eq '' ) )
{
        #print "not defined\n";
        $referrer = $ENV{HTTP_REFERER};
        print $query->redirect($referrer);
}
else
{
        $retStatus=verifyLogin($username,$password);
        my $myUser = $username;

        #Redirect to the caller
        if($retStatus eq "98")
        {

                $referrer = "http://projects.pjkeary.net/inspections_done_report/myIndex.cgi?start=2014-10-01&end=2014-10-31&exclude_dt=1&myUser=$myUser";
        }
        else
        {
                $referrer = $ENV{HTTP_REFERER};
        }
        print $query->redirect($referrer);
}
$referrer = $ENV{HTTP_REFERER};
print $query->redirect($referrer);

1 个答案:

答案 0 :(得分:0)

正如已经指出的那样 - 你无法在重定向的同时使用POST来实现这一点。但是你也不能用get来做,因为这会让任何观看的人都知道auth凭证。 (如下所述 - 仅仅因为它的POSTed并没有以任何方式隐藏它 - 它仍然以明确的方式发送,并且很容易拦截。它只是在历史或代理日志中显然不明显)

您可以将凭据嵌入cookie中,但特别是跨站点cookie传递可能会令人不愉快。

所以我建议从Kerberos的书中拿一片叶子。 Kerberos所做的是通过传递加密和限时令牌来启用受信任的第三方身份验证。 http://en.wikipedia.org/wiki/Kerberos_%28protocol%29

所以算法上你可以:

  • 创建公钥 - 私钥对。
  • 将公钥放在“身份验证器”服务器上。
  • 将私钥放在“目标”服务器上。
  • 当有人成功验证时,生成包含以下内容的令牌:
    • 时间戳
    • source ip
    • 用户名
    • 序列号或序列号(如果您想避免重复使用)
  • 使用公钥加密令牌。
  • Base 64对其进行编码,并将其作为URL中的参数传递给客户端。

目标服务器可以信任该令牌,因为它可以对其进行解密,并且它具有足够的信息(时间和源IP),使得窃取和重用加密令牌变得非常简单。然后它“知道”用户访问是有效的,并经过身份验证。

您可以扩展'令牌'以包含您想要传递的任何敏感参数,并留下任何您很乐意以明文形式发送的内容。

Perl模块可能存在这样做,但我对它们并不熟悉,所以相反:

openssl genrsa -out openssl_gen_rsa
openssl rsa -in openssl_gen_rsa -pubout -out openssl_gen_rsa.out 

然后使用“纯文本”文件并使用公钥对其进行加密:

openssl rsautl -inkey openssl_gen_rsa.out -pubin -in test_file.txt -encrypt -out test_file.openssl.pub.enc

Base 64对它进行编码。 (在Linux上有一个base64命令,但Perl内置了一些东西)。

然后使用私钥解密:

openssl rsautl -inkey openssl_gen_rsa -in test_file.openssl.pub.enc -decrypt

Perl肯定有内置模块来做到这一点。