【问题标题】:Get raw request body using perl CGI.pm使用 perl CGI.pm 获取原始请求正文
【发布时间】:2019-01-07 01:06:29
【问题描述】:

我正在使用 Apache 和 Perl CGI 构建一个 Web 服务器,用于处理发送给它的 POST 请求。处理部分要求我从请求中获取完全未处理的数据并验证其签名。

客户端发送两种不同类型的 POST 请求:一种内容类型设置为application/json,另一种内容类型设置为application/x-www-form-urlencoded。

我能够使用cgi->param('POSTDATA') 获取application/json 数据。但是,如果我对application/x-www-form-urlencoded 数据(即cgi->param('payload'))执行相同操作,我会得到数据但它已经被解码。我想要原始 URL 编码格式的数据。即我想要客户端发送的未处理数据。

我这样做是为了验证 Slack 发出的请求。

【问题讨论】:

  • CGi.pm 不保存它在表单数据时收到的原始表单。
  • @ikegami 哎哟,那我就卡住了。如果我能得到它使用的编码,然后编码呢?如果是,如何获取客户端使用的编码类型?
  • 不能,因为abc=def 和%61bc=def 是编码abc=def 的两种等效方式。您可以欺骗 CGI.pm 使其认为它不是表单数据,或者您可以避免使用 CGI.pm 并自己处理输入。
  • 避免使用 CGI 模块。
  • @Borodin - 这不是很有帮助,因为有很多有用的功能。

标签: perl cgi cgi.pm


【解决方案1】:

要处理所有情况,包括 Content-Type 为 multipart/form-data 的情况,请读取(并放回)原始数据,before CGI 会这样做。

use strict;
use warnings;

use IO::Handle;
use IO::Scalar;

STDIN->blocking(1); # ensure to read everything
my $cgi_raw = '';

{ 
  local $/; 
  $cgi_raw = <STDIN>;
  my $s;
  tie  *STDIN, 'IO::Scalar', \$s;
  print STDIN $cgi_raw;
  tied(*STDIN)->setpos(0);
}

use CGI qw /:standard/;
...

【讨论】:

    【解决方案2】:

    虽然我不确定哪个 Perl 模块可以为您处理这一切,但这里有一个基本的概要。

    您的 HTML 表单应提交到 .cgi 文件(或任何其他正确定义的处理程序)。

    原始请求与此类似:

    POST HTTP/1.1
    UserAgent: Mozilla/5.0
    Content-Length: 69
    Host: 127.0.0.1
    (More headers depending on situation and then a single blank line)
    
    (Message Body Containing data)
    username=John&password=123J (example)
    

    https://en.wikipedia.org/wiki/List_of_HTTP_header_fields)

    将会发生的是,这些数据可通过 CGI(不是 CGI perl 模块,又名 CGI.pm)使用环境变量和标准输入(使用 EV 传递标头字段,使用标准输入传递消息正文)。

    在 Perl 中,我认为您需要这个来阅读这些 EV:http://perldoc.perl.org/Env.html

    这要读取标准输入:https://perlmaven.com/read-from-stdin

    从那里开始,您可以根据需要进行处理。

    阅读这些内容时请务必小心。您可能会在其中一个 HTTP 标头或消息正文中收到格式错误的信息,例如 100GB 有效数据,这可能会对您造成严重破坏或危险的系统调用等。在将数据传递到其他地方之前,必须进行消毒。

    【讨论】:

      猜你喜欢
      • 2021-08-21
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      相关资源
      最近更新 更多