我正在创建一个简单的网站,我允许我的用户上传和下载文件。我创建了简单的检查以避免用户在/srv/public/
目录之外“疑惑”,但是检查只会阻止人们退出/srv/
目录(当用户导航到/srv/
或{时,它会忽略{1}}等。)
检查用户指定的路径是否正确的代码是:
/srv/private/
如果用户在允许的$dir = "/srv/public/";
if(!isset($_POST['path'])){
$_POST['path'] = '/';
}
$path = realpath($dir . $_POST['path']);
if(!substr($path, 0, 12) === $dir){ //This seems to never get executed
$path = realpath($dir);
}
if(!file_exists($path)){
$path = realpath($dir);
}
$path = rtrim($path, '/') . '/';
之外想知道我想将其路径设置回/srv/public/
。
以下是该网站的完整代码:
/srv/public/
我花了几个小时试图解决这个问题并重写这几行代码,但似乎没有任何工作。
答案 0 :(得分:2)
您需要提取子字符串并将其与$dir
:
if(substr($path, 0, 12) != $dir){
您当前的代码是:
if(
!substr($path, 0, 12) /* returns a string and then negates it ! which results in false */
=== $dir){ /* false does NOT === $dir */
要查看,请执行:
var_dump(substr($path, 0, 12));
var_dump(!substr($path, 0, 12));
var_dump(!substr($path, 0, 12) === $dir);
但是,检查$dir
是否以$path
开头(包含并从0位开始)可能更有意义:
if(strpos($dir, $path) !== 0) {