关于文件名和路径的$ GET(安全相关)

时间:2014-04-28 23:40:22

标签: php security get

我今天下午制作了一个简单的下载脚本,如下所示。

基本上我将file='whatever.something'传递给它,并将下载内容提供给用户。

之后我开始考虑安全性......因为如果他们知道页面的网址,任何人都可以传递自己的变量......我是否需要担心这里的任何问题?

是否有人可以传递'../../../../something之类的内容并实际返回我的/home/目录,在那里他们可以下载他们想要的任何文件?

if(isset($_GET['file']))
{
    $file = '/home/test/user-data/'.$_SESSION['user']['account_id'].'/downloads/'.$_GET['file'];

    if(file_exists($file))
    {
        //get current ts
        $now = time();

        //set headers
        header('Content-Description: File Transfer');
        header('Content-Type:  application/octet-stream');
        header('Content-Disposition: attachment; filename='.$now.'_file.csv');
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: '.filesize($file).'');

        //download
        readfile($file);
        //delete it
        unlink($file);  
    }
}

1 个答案:

答案 0 :(得分:0)

我最终做了一些事情:

if(isset($_GET['file'])) 
{
    // sanitize request and keep just the name and extension
    $file_path  = $_GET['file'];
    $path_parts = pathinfo($file_path);
    $file_name  = $path_parts['basename'];
    $file_ext   = $path_parts['extension'];

    // replaces the file location with a preset one
    $file_path  = '/home/test/db-backups/'.$file_name;

    // make sure the file exists
    if (is_file($file_path))
    {
            .....