我理解需要清理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模块。
答案 0 :(得分:3)
实体未在文件上传内容中进行编码。清理文件上传与清理文本字段不同。通过文件上传,您可以检查扩展名以及可能的格式和编码(尝试使用特定解码器等打开它)并确保文件不会过大。
在您的代码中,当您点击文件字段时,实际上是在尝试对文件句柄执行字符串操作。
答案 1 :(得分:2)
为安全起见,请使用
upload()
功能(版本2.47中的新功能)。使用上传字段的名称调用时,upload()
将返回类似文件句柄的对象,如果参数不是有效的文件句柄,则返回undef
。 ...