【问题标题】:perl cgi::param error with single plus sign in Taint modeperl cgi::param 错误与污染模式中的单加号
【发布时间】:2012-12-26 11:07:35
【问题描述】:

我在一个基于 Perl CGI 的网站上工作。它使用 Perl -T(污染模式)运行。我注意到文本输入只包含一个加号,没有其他内容(“+”)导致 CGI::param() 给出此错误:

在 ....../CGI.pm 第 533 行使用 -T 开关运行时,require 中的依赖关系不安全。 BEGIN 失败——编译中止。

这不适用于其他单号或带有前导或尾随空格的加号(“-”、“+”、“?”)。

虽然用户通常不会输入单个加号作为输入,但我希望在这里有一个解决方法,以便我的脚本能够很好地拒绝输入,而不是在浏览器中打印一个丑陋的“软件错误”。

REQUEST_METHOD=GET QUERY_STRING='page=%2B' perl -s -T -E'
use strict;
use CGI qw( :standard  );
CGI->new();
my $page;
eval { $page = param("page"); };
print "[ $@ ]\n";

'

这会打印一个编译错误:

[ 在 ../..../CGI.pm 第 xxx 行使用 -T 开关运行时,require 中的依赖关系不安全。 BEGIN 失败——编译中止。 ]

如果我跳过 CGI->new() 将不会出错。但根据我们的要求,这不是一个选项。

我希望这更清楚。感谢大家的帮助!

YJ

【问题讨论】:

  • "+" 用于表示 URL 中的空格。如果表示“+”,则需要将其编码为“%2B”。所以你想检查用户是否只是发送了一个空格?
  • 嗨,鲍里斯,不完全是。我无法控制用户发送的内容。但我想确保网站能很好地处理用户输入“+”(没有空格)。即使“+”应该被拒绝,我也不希望它看起来像我的网站坏了。
  • 也许您应该展示一些与您正在谈论的内容有关的代码。
  • 我尝试重现该问题,但当我毫无怨言地调用param 时,我的测试脚本在污点模式下接受了%2B
  • @user1970978 – 我在 URL 中输入了%2B。当您提交包含+ 字段的表单时,您会得到它。

标签: perl cgi param taint


【解决方案1】:

如果您创建一个 CGI 对象,请使用它。

my $cgi = CGI->new();
my $page = $cgi->param("page");

param("page");

但不要混搭。

【讨论】:

  • 我按照你的建议做了,问题就消失了。您能否详细说明错误是如何产生的(或指出一些读数)?那会很有帮助。
  • 这个问题是由于尝试解析请求两次造成的,但是对于为什么会具体给出该错误,您必须通过 CGI.pm 进行跟踪
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
相关资源
最近更新 更多