【发布时间】: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。当您提交包含+字段的表单时,您会得到它。