我有这个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
文件之外的任何内容。
答案 0 :(得分:1)
在打开文件之前,您应该检查$_GET['name']
的内容是否合法。
特别是在您的情况下,请检查:
.zip
/
和\
)。以下是一个例子:
$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
}