我应该在Perl CGI HTML表单中清理文件上传输入字段吗?

时间:2009-10-05 16:10:40

标签: perl file-upload cgi sanitization

我理解需要清理HTML表单中的输入,但是当我清理我最近的模块中的文件上载字段时,文件上传开始失败。清理所有形式的输入很重要,对吗?甚至特殊的文件上传字段?

我的表单输出代码如下所示:

use CGI;
my $cgi = new CGI;
print $cgi->header();
# ... print some HTML here
print $cgi->start_form();
print $cgi->filefield(-name=>'uploaded_file',
                      -size=>50,
                      -maxlength=>80);
print $cgi->submit(-name=>'continue',
                   -value=>'Continue');
print $cgi->end_form();
# ... print some more HTML here

我的清理代码看起来像这样(它实际上早于上面的模块):

use HTML::Entities
my $OK_CHARS => 'a-zA-Z0-9 .,-_';
foreach my $param_name ( $cgi->param() ) {
    my $original_content = $cgi->param($param_name);
    my $replaced_content = HTML::Entities::decode( $original_content );
    $replaced_content =~ s/[^$OK_CHARS]//go;
    $cgi->param( $param_name, $replaced_content );
}

最近我添加了清理代码时,文件上传开始失败。文件句柄现在在此行中返回undefined:

my $uploadedFilehandle = $cgi->upload('uploaded_file');

我在清理代码中做错了什么?我从某个地方的互联网上获得了代码片段,所以我并不完全理解这一切。我之前从未见过'o'正则表达式修饰符,我之前从未使用过HTML :: Entities模块。

2 个答案:

答案 0 :(得分:3)

实体未在文件上传内容中进行编码。清理文件上传与清理文本字段不同。通过文件上传,您可以检查扩展名以及可能的格式和编码(尝试使用特定解码器等打开它)并确保文件不会过大。

在您的代码中,当您点击文件字段时,实际上是在尝试对文件句柄执行字符串操作。

答案 1 :(得分:2)

不,你不应该。有关如何处理上传字段的信息,请参阅CGI.pm docs

  

为安全起见,请使用upload()功能(版本2.47中的新功能)。使用上传字段的名称调用时,upload()将返回类似文件句柄的对象,如果参数不是有效的文件句柄,则返回undef。 ...