CGI::Fast 没有用于上传的临时文件

CGI::Fast without tempfiles for upload

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

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 对象,就来不及设置挂钩了。您可以使用以下内容:

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 的早期版本将上传挂钩解释为初始化程序,并会跳过接受请求。