保留Perl中CGI输入的加号

时间:2012-07-10 08:31:37

标签: perl cgi

我正在开发一个带有多种表单的Web应用程序,用户需要输入通常包含空格和/或加号的数据。

数据通常通过GET个请求发送;或通过POST Content-Type标头的application/x-www-form-urlencoded次请求。

我尝试过使用Perl的Vars()模块中的paramCGI,但这两种方法都坚持将+符号转换为空格。

CGI模块是否提供了保留+标志的任何机制;或者我应该抛弃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');

在提交具有默认值并运行服务器端代码的表单后,$some_variable的值为"1 1 is 2" (1之间有3个空格,SO网站或浏览器可能会将它们折叠到一个空间中); 期望的结果将在该变量中获得值"1 + 1 is 2"

1 个答案:

答案 0 :(得分: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($_);
}

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

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

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

您需要追踪您的浏览器(或您用来发送这些请求的其他任何客户端)未遵循CGI规范的原因。