【问题标题】:How to mask url parameters when using perl cgi redirect使用perl cgi重定向时如何屏蔽url参数
【发布时间】:2015-03-18 20:15:43
【问题描述】:

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

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

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

当我重定向到 myIndex.cgi 时,url 会显示 url bar 中的所有参数。 有没有办法屏蔽它们,以便参数及其值不会显示在 url 中。

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

认证.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);

【问题讨论】:

  • 使用 POST 提交数据。
  • @Geohut — 在重定向中?!
  • 我会重新组织您的代码以使用单个脚本作为入口点,然后根据需要路由到脚本的不同部分(因此您无需告诉浏览器请求完全不同的 URL)。 Catalyst 对此很有用,尽管我更倾向于 FastCGI 而不是普通的 CGI。
  • stackoverflow.com/questions/5576619/php-redirect-with-post-data 如果您不喜欢此方法,请考虑仅在单个页面上并对数据进行 Ajax 调用。同样的事情也适用于 perl。
  • @Quentin ---- 嗨,你能告诉我你将如何重组这段代码吗?

标签: perl redirect cgi


【解决方案1】:

如前所述 - 您不能在重定向的同时使用 POST 执行此操作。但是你也不能通过 get 来做到这一点,因为这会将身份验证凭据暴露给任何观看的人。 (如下所述 - 只是因为它已发布并不会以任何方式隐藏它 - 它仍然以明文形式发送,并且很容易被拦截。它只是在历史记录或代理日志中不明显)

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

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

所以从算法上你可以:

  • 创建公私密钥对。
  • 将公钥放在“验证者”服务器上。
  • 将私钥放在“目标”服务器上。
  • 当某人成功验证时,生成一个令牌,其中包括:
    • 时间戳
    • 源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 肯定已经内置了模块来执行此操作。

【讨论】:

  • 回复。 “你不能在重定向的同时使用 POST 来做到这一点。但你也不能用 get 来做到这一点,因为这会将身份验证凭据暴露给任何观看的人。”如果有人已经在观看 HTTP 请求,使用 POST 不会神奇地隐藏参数(尽管它会阻止它们出现在浏览器历史记录中)。
猜你喜欢
  • 2018-04-17
  • 2021-04-08
  • 1970-01-01
  • 2012-12-10
  • 2014-07-20
  • 2018-04-19
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
相关资源
最近更新 更多