【问题标题】:CGI::Fast without tempfiles for uploadCGI::Fast 没有用于上传的临时文件
【发布时间】:2019-08-16 06:03:39
【问题描述】:

我希望将一些相对敏感的数据上传到不应以明文形式存储在磁盘上的服务器 - 我认为截取临时文件并复制内容太容易了,而且还会存在安全删除的问题针对恢复/日志条目等的文件。 我意识到我理论上可以在客户端执行此操作,但更喜欢服务器端解决方案,因此不寻常的浏览器不会破坏上传。

Perl CGI::upload_hook() 似乎是一个完美的解决方案,在到达时应用加密。普通 CGI 已弃用,但使用 CGI::Fast 时,无论我将调用放在循环内部还是外部,都永远无法到达挂钩代码。

use Sys::Syslog;
use CGI::Fast;
sub hook {
    my ( $filename, $buffer, $bytes_read, $data ) = @_;
    syslog('notice',"Hook used!");
}

#CGI::upload_hook(\&hook,'',0); # No good here either
while (my $q = CGI::Fast->new()) {
    CGI::upload_hook(\&hook,'data',0); # No effect
    syslog('notice',"Got a request!");    
    # (Access control code cut)
    print $q->header('text/plain','200 OK');
    print (Dumper($q));
}

hook() 永远不会被调用。 CGI::Fast->new() 不像 CGI->new() 那样接受这样的钩子代码。

【问题讨论】:

  • CGI::Fast 不仅仅是 CGI.pm 的替代品。它是 FastCGI 协议的 CGI.pm API 的实现,碰巧仍然在 CGI 协议下工作,但它仍然存在与 CGI.pm 相同的问题(实际上还引入了一些错误)。如果您想使用非不鼓励的库编写 CGI(协议)脚本,请参阅my blog post 开始。
  • 我花了几个小时研究 mojilicious 和“CGI-alternatives”页面上列出的其他框架,但我看到了很多关于成熟的网络应用程序(至少不受欢迎,因为它需要与服务器的其他部分相匹配!)而没有关于文件上传挂钩的内容,只是基本的“将已经写入磁盘的上传文件移动到这里”,所以我得出结论,功能已经丢失。我错了吗?
  • 是的。虽然在这些现代框架中所做的一切都是“成熟的网络应用程序”,但您实际上不必编写一个,只需查看任何 Mojolicious::Lite 或 Dancer2 示例即可。如果您担心幕后发生了多少事情,您可以直接使用 Web::Simple 甚至 Plack,但我不推荐它,因为它会大大增加您需要做的工作量和潜在的错误.
  • 至于“文件上传钩子”,现代框架当然可以做到这一点,但不会这么叫。虽然需要大量研究才能弄清楚如何正确回答您的问题,但我怀疑 Plack 中间件将是最简单的解决方案。

标签: perl fastcgi


【解决方案1】:

一旦创建了 CGI 对象,再设置钩子为时已晚。您可以使用以下内容:

while (1) {
    my $q = CGI::Fast->new(\&hook, 'data', 0)
       or die("Couldn't Accept FCGI request\n");

    syslog('notice',"Got a request!");
    # (Access control code cut)
    print $q->header('text/plain','200 OK');
}

请注意,这需要 CGI::Fast 2.15 或更高版本。早期版本的 CGI::Fast 将上传挂钩解释为初始化程序,并会跳过接受请求。

【讨论】:

  • CGI::Fast 在即将发布的 CGI::Fast 2.15 中缺乏对通过构造函数挂钩传递给 CGI 的支持 fixed
猜你喜欢
  • 2017-10-01
  • 1970-01-01
  • 2020-10-28
  • 2013-04-30
  • 2016-06-30
  • 2011-04-26
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多