我有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);
答案 0 :(得分:0)
正如已经指出的那样 - 你无法在重定向的同时使用POST来实现这一点。但是你也不能用get来做,因为这会让任何观看的人都知道auth凭证。 (如下所述 - 仅仅因为它的POSTed并没有以任何方式隐藏它 - 它仍然以明确的方式发送,并且很容易拦截。它只是在历史或代理日志中显然不明显)
您可以将凭据嵌入cookie中,但特别是跨站点cookie传递可能会令人不愉快。
所以我建议从Kerberos的书中拿一片叶子。 Kerberos所做的是通过传递加密和限时令牌来启用受信任的第三方身份验证。 http://en.wikipedia.org/wiki/Kerberos_%28protocol%29
所以算法上你可以:
目标服务器可以信任该令牌,因为它可以对其进行解密,并且它具有足够的信息(时间和源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肯定有内置模块来做到这一点。