当前位置:  开发笔记 > 编程语言 > 正文

在PHP中清理文件路径

如何解决《在PHP中清理文件路径》经验,为你挑选了4个好方法。

问候,我希望我的小程序安全,以便潜在的恶意用户无法查看服务器上的敏感文件.

    $path = "/home/gsmcms/public_html/central/app/webroot/{$_GET['file']}";


    if(file_exists($path)) {
        echo file_get_contents($path);
    } else {
        header('HTTP/1.1 404 Not Found');
    }

在我的脑海中,我知道像'../../../../../../etc/passwd'这样的输入会有麻烦,但想知道我应该期待什么其他有意义的输入以及如何防止他们.



1> Bert Lamb..:

realpath()将允许您将任何可能包含相对信息的路径转换为绝对路径...然后您可以确保该路径位于您要允许下载的某个子目录下.


这是我的最终解决方案:$ baseDir ="/ home/gsmcms/public_html/central/app/webroot /"; $ path = realpath($ baseDir.$ _GET ['file']); //如果baseDir不在前面0 == strpos,很可能是黑客尝试if(strpos($ path,$ baseDir)){die('Invalid Path'); } elseif(file_exists($ path)){echo file_get_contents($ path); } else {header('HTTP/1.1 404 Not Found'); echo"无法找到请求的文件"; }
@SeanDowney你的解​​决方案中有一个错误,即你应该检查strpos不会返回false或非零,这是你没有做的.

2> philfreo..:

使用basename而不是试图预测用户可以提供的所有不安全路径.



3> Yauhen Yakim..:

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"; 
} 



4> Matteo Riva..:

如果可以,请使用类似于允许文件数组的白名单,并检查输入:如果用户提出的文件不在该列表中,则拒绝该请求.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有