Sanitize file path in PHP

后端 未结 7 992
夕颜
夕颜 2020-12-01 11:00

Greetings, I\'m hoping to make my tiny program secure so that potential malicious users cannot view sensitive files on the server.

    $path = \"/home/gsmcm         


        
相关标签:
7条回答
  • 2020-12-01 11:08

    There is an additional and significant security risk here. This script will inject the source of a file into the output stream without any server-side processing. This means that all your source code of any accessible files will be leaked to the internet.

    0 讨论(0)
  • 2020-12-01 11:13

    To strip all /. /.. or \. \.. and convert to all forward slash because the different environments will accept forward slash. This should provide a fairly safe filter for path input. In your code you should be comparing it to parent directories that you do not want access just in case.

     $path = realpath(implode('/', array_map(function($value) {return trim($value, '.');}, explode('/', str_replace('\\', '/', $path)))));  
    
    0 讨论(0)
  • 2020-12-01 11:14

    If you can, use a whitelist like an array of allowed files and check the input against that: if the file asked by the user isn't present in that list, deny the request.

    0 讨论(0)
  • 2020-12-01 11:15

    Use basename rather than trying to anticipate all the insecure paths a user could provide.

    0 讨论(0)
  • 2020-12-01 11:18

    realpath() will let you convert any path that may contain relative information into an absolute path...you can then ensure that path is under a certain subdirectory that you want to allow downloads from.

    0 讨论(0)
  • 2020-12-01 11:24

    Solution by the OP:

    $baseDir = "/home/gsmcms/public_html/central/app/webroot/"; 
    $path = realpath($baseDir . $_GET['file']); 
    
    // if baseDir isn't at the front 0==strpos, most likely hacking attempt 
    if(strpos($path, $baseDir) !== 0 || strpos($path, $baseDir) === false) { 
       die('Invalid Path'); 
    } elseif(file_exists($path)) { 
       echo file_get_contents($path); 
    } else { 
       header('HTTP/1.1 404 Not Found'); 
       echo "The requested file could not be found"; 
    } 
    
    0 讨论(0)
提交回复
热议问题