如何在此PHP代码中阻止本地文件下载?

时间:2014-01-05 12:43:53

标签: php security

我有这个PHP代码:

<?php

header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=\"".$_GET['name']."\""); 
$file_content = file_get_contents($_GET['name']);
echo $file_content;

?>

在这种情况下,攻击者可以使用此请求下载我网站上的文件:

localhost/file.php?name=../../../../../../../etc/passwd

我需要一种方法来阻止用户从当前目录下载除.zip文件之外的任何内容。

1 个答案:

答案 0 :(得分:1)

在打开文件之前,您应该检查$_GET['name']的内容是否合法。

特别是在您的情况下,请检查:

  • .zip
  • 结尾
  • 它不包含NUL字节以防止字符串过早终止(请参阅Null bytes related issues
  • 它不包含路径分隔符(/\)。

以下是一个例子:

$filename = $_GET['name'];
if (strpos($filename, "\0") !== false) {
    // contains NUL byte
} else if (substr(strtolower($filename), -4) !== '.zip') {
    // doesn’t end with ".zip"
} else if (basename($filename) !== $filename) {
    // contains path separator
} else if (!is_file($filename)) {
    // file does not exist
} else {
    // everything is fine
}