3

我知道需要清理来自 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 );
}

当我最近添加清理代码时,文件上传开始失败。文件句柄现在在这一行返回未定义:

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

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

4

2 回答 2

3

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

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

于 2009-10-05T16:16:47.587 回答
2

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

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

于 2009-10-05T16:39:39.270 回答