Perl CGI:除非URL是硬编码的,否则请求不起作用

时间:2013-01-10 19:44:29

标签: string perl url cgi get-request

我正在尝试在URL获取请求期间识别两个字符串之间的差异(使用LWP :: Simple)。
我有一个网址,比如说http://www.example.com?param1=x&param2=y&param3=z
我确保任何空白输入也都要处理,但这一点无关紧要,因为我确保所有参数完全相同。
此外,从生成的URL复制并粘贴硬编码的URL。
当我执行以下操作时,此URL可用:

my $url = "http://www.example.com?param1=x&param2=y&param3=z";
my $content = get($url);

然而,当我从用户提供的参数构建URL时,get请求不起作用(来自站点的错误:500)。
我通过打印它们来比较两个URL,并看到零差异。我已经尝试删除所有潜在的隐形字符。

生成的代码和静态字符串的输出,假设用户输入与静态字符串相同(这是我确实要做的):

http://www.example.com?param1=x&param2=y&param3=z
http://www.example.com?param1=x&param2=y&param3=z

我假设打印输出删除了我看不到的字符。 我也在http://www.perlmonks.org/?node_id=882590处遵循了一个解决方案,它指出了差异,但我不知道为什么,考虑到我根本没有看到。
有没有人遇到过这个问题?如果我需要澄清任何内容或需要提供其他信息,请与我们联系。




编辑:问题和解决方案
因此,在使用mob的建议识别差异后,我发现生成的URL中有一个空字符未在输出中打印。即:http://www.example.com?param1=x&param2=y&param3=z实际上是http://www.example.com?param1=x&param2=y&param3=\000z
我使用了一个简单的正则表达式:$url =~ s/\000//g;来删除那个(以及任何其他)空值。

2 个答案:

答案 0 :(得分:2)

显然,您构建的字符串与硬编码的字符串不同。如果你写这样的代码

my $ss = 'http://www.example.com?param1=x&param2=y&param3=z';
print join(' ', map " $_", $ss =~ /./g), "\n";
print join(' ', map sprintf('%02X', ord), $ss =~ /./g), "\n";

然后您将能够看到字符串中每个字符的十六进制值,并且您可以更准确地比较它们中的两个字符。例如,上面的代码输出

 h  t  t  p  :  /  /  w  w  w  .  e  x  a  m  p  l  e  .  c  o  m  ?  p  a  r  a  m  1  =  x  &  p  a  r  a  m  2  =  y  &  p  a  r  a  m  3  =  z
68 74 74 70 3A 2F 2F 77 77 77 2E 65 78 61 6D 70 6C 65 2E 63 6F 6D 3F 70 61 72 61 6D 31 3D 78 26 70 61 72 61 6D 32 3D 79 26 70 61 72 61 6D 33 3D 7A

答案 1 :(得分:2)

使用数据序列化功能检查字符串是否有隐藏字符。

$url1 = "http://www.example.com?param1=x&param2=y";
$url2 = "http://www.example.com?param1=x&param2=y\0";
$url3 = "http://www.example.com?param1=x&param2=y\n";

use JSON;
print JSON->new->pretty(1)->encode( [$url1,$url2,$url3] );
# Result:
# [
#   "http://www.example.com?param1=x&param2=y",
#   "http://www.example.com?param1=x&param2=y\u0000",
#   "http://www.example.com?param1=x&param2=y\n"
# ]


use Data::Dumper;
$Data::Dumper::Useqq = 1;
print Dumper($url1,$url2,$url3);
# Result:
# $VAR1 = "http://www.example.com?param1=x&param2=y";
# $VAR2 = "http://www.example.com?param1=x&param2=y\0";
# $VAR3 = "http://www.example.com?param1=x&param2=y\n";