我想将序列化的Perl数据结构作为GET变量传递给CGI应用程序。我尝试 Data :: Serializer 作为我的第一选择。不幸的是,除了包含由'^'(插入符号)连接的选项之外,序列化字符串太长了以至于我的舒适度。

有没有办法可以从perl数据结构创建短编码字符串,以便我可以安全地将它们作为GET变量传递给perl CGI应用程序?

我还要感谢被告知这个(序列化的,编码的字符串)是将复杂的数据结构传递给Web应用程序的一种不好的方法,以及关于如何实现这一点的建议

有帮助吗?

解决方案

如果您需要向包含几个关键数据点的用户发送URL,并且您希望确保它不能伪造,您可以使用摘要(例如来自Digest :: SHA)和共享密钥来执行此操作。这使您可以将数据放在消息中,而无需保留本地数据库来跟踪所有数据。我的示例不包含时间元素,但如果您愿意,可以轻松添加。

use Digest::SHA qw(sha1_base64);
my $base_url = 'http://example.com/thing.cgi';

my $email = 'guy@somewhere.com';
my $msg_id = '123411';

my $secret = 'mysecret';
my $data = join(":", $email, $msg_id, $secret);
my $digest = sha1_base64($data);

my $url = $base_url . '?email=' . $email . '&msg_id=' . $msg_id' . '&sign=' . $digest;

然后发送它。

在你的“thing.cgi”中脚本你只需要提取参数,看看脚本中提交的摘要是否与你本地重新生成的摘要匹配(使用$ email和$ msg_id,当然还有你的$ secret)。如果他们不匹配,请不要授权他们,如果他们这样做,那么您有合法授权的请求。

脚注:结果 我写了“原始” Data :: Serializer中的方法使序列化器之间的转换变得更加容易,实际上确实有助于在语言之间进行转换(到某一点)。但这当然是一个单独的讨论,因为你真的不应该使用序列化程序在网络表单上交换数据。

其他提示

该方法的一个缺点 - 使用perl特定的序列化程序,即 - 如果你想使用perl以外的东西在客户端和服务器之间进行通信,那么它可能比JSON或甚至XML也会。您已经运行的GET请求的大小限制,但这对任何编码方案都有问题。

对于未来的下一个维护此代码的人来说,这可能是一个问题,而不是对你而言。我现在有一种情况,在我开始之前,在我决定将几个重要的数据存储为perl Storable对象之前,开发人员在大型系统上工作。这本身并不是一个可怕的决定,但是使用非perl编写的工具来访问数据会变得更加困难。

传递序列化编码字符串是将复杂数据结构传递给Web应用程序的一种不好方法。

如果您尝试将状态从一个页面传递到另一个页面,则可以使用服务器端会话只需要你传递一个会话密钥。

如果您需要通过电子邮件发送给某人的链接,您仍然可以创建具有合理到期时间的服务器端会话(您还需要确定是否需要进行其他身份验证),然后在链接中发送会话ID 。一旦采取了请求的操作,您就可以/应该立即使会话到期。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top