使用 php 解压缩文件始终清理用户输入。

2022-08-30 06:15:49

我想解压缩一个文件,这工作正常

system('unzip File.zip');

但是我需要通过URL传入文件名,并且无法使其正常工作,这就是我所拥有的。

$master = $_GET["master"];
system('unzip $master.zip'); 

我错过了什么?我知道这一定是我忽略的一些小而愚蠢的东西。

谢谢


答案 1

我只能假设你的代码来自在线某个地方的教程?在这种情况下,好工作试图自己弄清楚。另一方面,此代码实际上可以作为解压缩文件的正确方法在线发布,这一事实有点可怕。

PHP具有用于处理压缩文件的内置扩展。应该没有必要为此使用调用。文档是一种选择。systemZipArchive

$zip = new ZipArchive;
$res = $zip->open('file.zip');
if ($res === TRUE) {
  $zip->extractTo('/myzips/extract_path/');
  $zip->close();
  echo 'woot!';
} else {
  echo 'doh!';
}

此外,正如其他人所评论的那样,自4.1版本以来已被弃用...这是很久以前的事情了。不要使用它。请改用超全局变量。$HTTP_GET_VARS$_GET

最后,在接受通过变量传递给脚本的任何输入时要非常小心。$_GET

始终清理用户输入。


更新

根据您的注释,将 zip 文件解压缩到它所在的同一目录中的最佳方法是确定文件的硬路径并将其专门解压缩到该位置。因此,您可以执行以下操作:

// assuming file.zip is in the same directory as the executing script.
$file = 'file.zip';

// get the absolute path to $file
$path = pathinfo(realpath($file), PATHINFO_DIRNAME);

$zip = new ZipArchive;
$res = $zip->open($file);
if ($res === TRUE) {
  // extract it to the path we determined above
  $zip->extractTo($path);
  $zip->close();
  echo "WOOT! $file extracted to $path";
} else {
  echo "Doh! I couldn't open $file";
}

答案 2

请不要这样做(传递GET var成为系统调用的一部分)。请改用 ZipArchive

因此,您的代码应如下所示:

$zipArchive = new ZipArchive();
$result = $zipArchive->open($_GET["master"]);
if ($result === TRUE) {
    $zipArchive ->extractTo("my_dir");
    $zipArchive ->close();
    // Do something else on success
} else {
    // Do something on error
}

为了回答你的问题,你的错误是“某物$var某物”应该是“某物$var某物”(在双引号中)。


推荐