2012-07-10 46 views
3

我正在使用多种形式的Web应用程序,用户需要在其上输入通常包含空格和/或加号的数据。从Perl中的CGI输入保留加号

该数据一般通过GET请求发送;或通过POST请求与application/x-www-form-urlencoded Content-Type标头。

我试过使用Perl的CGI模块中的Vars()param,但这两种方法都坚持要将+标志转换为空格。

CGI模块是否提供任何机制来保存+标志;或者我应该沟并手动解析STDIN输入?

注意
随着大量的形式(在百),并且具有CGI预处理在一个集中的实用程序库发生的事情,我向服务器端解决方案相当偏颇,而不是客户端方法(换句话说,我宁愿在预处理代码上处理一次问题,而不是在数百个地方添加JS噪声)。

在此先感谢您提供的任何帮助。


作为评价请求,这里是一些代码,触发问题的(简化的)样品。

HTML

<form action="/cgi-bin/some-script.pl"> 
    <input name="some_field" value="1 + 1 is 2"> 
    <input name="submit" type="submit" value="Submit"> 
</form> 

的Perl

use CGI; 
my $some_variable = CGI::param('some_field'); 

与默认值submiting形式和运行的服务器端代码后,$some_variable的值是"1 1 is 2"(有1之间有三个空格,无论是SO网站还是浏览器都可能将它们折叠成一个空格); 期望的结果将在该变量中获得值"1 + 1 is 2"

+0

也许你可以发布一段简短的代码片段,说明哪些步骤导致了这个问题。 – DavidO 2012-07-10 08:40:38

+3

在将'+符号传递给CGI之前,您可以简单地将'+'符号编码为'%2B'。 – dgw 2012-07-10 09:00:11

+0

@dgw:感谢您的建议,但可以在服务器端完成,而无需预先处理整个输入?如问题所述,服务器端解决方案比客户端更可取;如果我必须预先处理perl脚本中的整个输入,那么不会比一路走下去并手动解析它。 – 2012-07-10 09:08:25

回答

7

CGI参数中的加号表示空格。这在CGI规范中。任何发送给你的HTTP客户端加上符号来表示其他任何内容都会中断。任何处理加号的HTTP服务器意味着其他任何事情都被破坏了。

所以这个问题不在你的CGI程序中(这是做正确的事情)。问题在于发送给你的HTTP客户端加上标志意味着它们被解释为加号。在CGI程序中发送加号作为参数的正确方法是将其编码为%2B。这是你需要解决的问题。

更新:我在Ubuntu上运行了一个使用Apache的简单测试。

我的HTML文件是这样的:

<html> 
    <head> 
    <title>Test</title> 
    </head> 
    <body> 
    <h1>Test</h1> 
    <form action="/cgi-bin/param"> 
     <input name="some_field" value="1 + 1 is 2"> 
     <input name="submit" type="submit" value="Submit"> 
    </form> 
    </body> 
</html> 

我的Perl程序是这样的:

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

use CGI qw[header param]; 

print header(-type => 'text/plain'); 

for (param) { 
    say "$_ -> ", join ':', param($_); 
} 

当我访问该页面并点击“提交”按钮,浏览器就到了URL http://localhost/cgi-bin/param?some_field=1+%2B+1+is+2&submit=Submit并显示以下内容:

some_field -> 1 + 1 is 2 
submit -> Submit 

这看起来像我期望的行为查看。浏览器发送给浏览器时,浏览器正确地将加号编码为%2B。当我访问Perl时,Perl的CGI模块解码该值。

您需要追踪为什么您的浏览器(或您用来发送这些请求的任何其他客户端)不符合CGI规范。

+2

谢谢!经过一些跟踪之后,似乎应用程序中的所有字段都容易受到包括任何非常用字符在内的部分JS在提交之前进行了预处理。而且这个JS确实已经坏了。我想这将归结为修复(为了理性,重构)那几百个脚本。 – 2012-07-10 11:30:49