代码之家  ›  专栏  ›  技术社区  ›  Kurt W. Leucht

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

  •  3
  • Kurt W. Leucht  · 技术社区  · 15 年前

    我了解清理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”regex修饰符,也从未使用过html::entities模块。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Jeff Ober    15 年前

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

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

        2
  •  2
  •   Sinan Ünür    15 年前

    不,你不应该。见 CGI.pm docs 关于如何处理上载字段:

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