与此相关 - https://stackoverflow.com/questions/21487257/a-perl-cgi-script-for-uploading-files - 问题,我还有另外一个:可以这样:
http://www.seaglass.com/file-upload-pl.html
脚本被修改,以便它接受不同的输入文件并将它们保存为不同的输出文件,而不仅仅是覆盖单个output
文件?
我是Perl / CGI的新手,所以我不会看到明显的答案。
答案 0 :(得分:2)
在$basename
中,您已拥有该文件的名称。您不必将上传的文件写入/tmp/outfile
;您可以动态构建路径,具体取决于$basename
。
创建要放置文件的目录。我认为它仍然是C:\tmp
。而不是
open(OUTFILE, ">/tmp/outfile")
写
open(OUTFILE, ">/tmp/$basename")
它应该有效。即使在$upfile
创建之前,污点也会从GetBasename()
内$basename
移除。但这仍然不安全。在将其提交给open()
之前,您应该从文件名中删除所有不需要的字符,例如
$basename =~ s/[^A-Za-z0-9_.-]//g;
$basename =~ s/^[^A-Za-z0-9]*//;
如果$basename
现在为空,则必须以其他方式选择名称。此外,如果已存在同名文件,则必须选择是要覆盖它还是组成唯一名称。我目前的解决方案只是覆盖。
如果您想了解有关正则表达式的更多信息,请查看perlre手册页。