比较两个路径的开头不能正常工作

时间:2018-01-17 22:32:01

标签: php

我正在创建一个简单的网站,我允许我的用户上传和下载文件。我创建了简单的检查以避免用户在/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/

我花了几个小时试图解决这个问题并重写这几行代码,但似乎没有任何工作。

1 个答案:

答案 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) {