我将如何使用php $ _GET安全地提供文件?

时间:2019-07-15 16:42:56

标签: php isset filter-input

我正在使用$ _GET做一个简单的下载脚本,以获取来宾用户可以下载文件的文件名。该脚本检查上载的文件夹,如果找到该文件,则将其传送。简单,工作正常。但是,在阅读了有关在Google上以及在此处使用$ _GET的更多信息之后,如果代码实施不正确,可能并不安全。下面是我到目前为止的代码。

<?php
if (isset($_GET['file']) && !empty($_GET['file'])) {
    $name = filter_input(INPUT_GET, 'file', FILTER_SANITIZE_SPECIAL_CHARS);

    $file = './upload/'.$name;

    if (!is_readable($file)) die('File not found!');

    $fp = fopen($file, 'rb');

    header("Content-Type: application/octet-stream");
    header("Content-Transfer-Encoding: Binary");
    header("Content-Disposition: attachment; filename=$name");
    header("Content-Length: " .filesize($file));
    fpassthru($fp);
}
exit;
?>

编辑:我用于下载文件的方法:http://example.com/download.php?file=somefile.zip

该代码实际上对于注入或其他安全问题是不安全的吗?如果是这样,我如何使其更安全?

1 个答案:

答案 0 :(得分:0)

我认为这是不安全的,因为如果有人请求../login.php(例如login.php),他们可以找到源代码。

使用urlencode()

我认为这段代码可以保护您的脚本一段时间:

$file = './upload/' . urlencode($name);

或者您也可以使用这个:

if (urlencode($name) != $name) die("Something went wrong.");