Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在使用perl cgi重定向时屏蔽url参数_Perl_Redirect_Cgi - Fatal编程技术网

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

如何在使用perl cgi重定向时屏蔽url参数,perl,redirect,cgi,Perl,Redirect,Cgi,我有authenticate.cgi脚本,它接收用户名/密码并验证它们 如果它是一个有效的登录名,我将通过发送一些参数(如开始日期/用户名等)将页面重定向到myIndex.cgi,其中会向用户显示报告 如果登录无效,我将重定向到上一页,以便重新输入用户名/密码 当我重定向到myIndex.cgi时,url会显示url栏中的所有参数。 有没有办法屏蔽它们,使参数及其值不会显示在url中 有办法吗?请让我知道。谢谢 authenticate.cgi #Redirect to login if inv

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

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

如果登录无效,我将重定向到上一页,以便重新输入用户名/密码

当我重定向到myIndex.cgi时,url会显示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);

正如已经提到的,你不能在重定向的同时用一篇文章来实现这一点。但是,您也不能使用get来执行此操作,因为这会向任何观看的人公开身份验证凭据。正如下面提到的——仅仅因为它被发布并不会使它以任何方式被隐藏——它仍然以清晰的方式发送,并且非常容易被拦截。它在历史记录或代理日志中的表现并不明显

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

因此,我建议大家学习一下Kerberos的书。Kerberos所做的是通过传递加密的和有时间限制的令牌来启用受信任的第三方身份验证

所以从算法上你可以:

创建一个公私密钥对。 将公钥放在“authenticator”服务器上。 将私钥放在“目标”服务器上。 当某人成功进行身份验证时,生成一个令牌,该令牌包括: 时间戳 源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
base64编码它。Linux上有一个base64命令,但Perl是内置的

然后使用私钥解密:

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

Perl显然已经内置了模块来实现这一点

在提交数据时使用POST。@Geohut-在重定向中?!我会重新组织您的代码,以使用单个脚本作为入口点,然后根据需要路由到脚本的不同部分,这样您根本不需要告诉浏览器请求不同的URL。Catalyst在这方面很好,尽管我希望使用FastCGI而不是普通CGI。如果您不喜欢这种方法,那么可以只在单个页面上对数据进行Ajax调用。perl也同样适用。@Quentin嗨,你能告诉我你将如何重新组织这段代码吗。你真的不能在重定向的同时用帖子来做这件事。但是,您也不能使用get来执行此操作,因为这会向任何观看的人公开身份验证凭据。如果有人已经在监视HTTP请求,使用POST不会神奇地隐藏参数,尽管它会阻止这些参数出现在浏览器历史记录中。