【问题标题】:how to protect url string which is created by GET in php如何保护由 GET 在 php 中创建的 url 字符串
【发布时间】:2016-04-30 17:01:17
【问题描述】:

对于文件管理,我想制作一个用于扫描特定目录的锚。

我用这个回声:

echo   "<div class='urldir'>"
."<a href='?dir=".dirname($dir).'/'.basename($dir).'/'.$file."'>open dir</a>"
."</div>";

dirname 和 basename 为我提供了正确的目录路径。

这是用户的正常“根”目录:

$dir = 'uploads/sfm/'.$UserID;

当我用户在他的根目录中创建一个文件夹时,他必须能够看到该文件夹​​中的文件。要更改目录并显示该目录中的所有文件,我使用这个

$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";


$strArr = explode("=",$actual_link);
$CurrentPath = $strArr[1];


if(isset($_GET['dir'])) {
$dir = $CurrentPath;

}

所以我从 url 中读取了目录,变量 $dir 发生了变化

问题:网址向我显示了这样的字符串:

sfm?dir=uploads/sfm/c4ca4238a0b923820dcc509a6f75849b/folder

当我现在输入网址时:

sfm?dir=uploads/

他向我展示了上传文件夹中的文件。这个必须保护! 应该没有人能看到这一点。 而且这也必须被保护起来: sfm?dir=uploads/sfm/

我怎样才能做到这一点?

顺便说一句:url 中的散列是因为我有 var $UserID md5 散列 md5($UserID)

【问题讨论】:

    标签: php get


    【解决方案1】:
    $protectedDirectories = array( 
                                array( 'uploads', 'sfm', $userId ) 
                            );
    
    $directory = str_replace('\\','',$_GET['dir']);
    
    $directory = trim($directory,'/');
    
    $directory = preg_replace('#[\/]{1,}#','/',$directory);
    
    $stats = false; // True = Protected , False = Cannot enter this directory.
    
    $seperate = explode('/',$directory);
    
    $cntSeperate = count( $seperate );
    
    foreach($protectedDirectories as $pattern ){
    
        if( count( $pattern ) > $cntSeperate ){
    
            continue;
    
        }
    
        $innerStats = true;
    
        foreach( $pattern as $key => $val ){
    
            if( $seperate[ $key ] !== $val ){
    
                $innerStats = false;
    
                break;
    
            }
    
        }
    
        if( $innerStats == false ){
    
            continue;
    
        }
    
        $stats = true;
    
        break;
    
    }
    
    if( $stats == true ){
    
        // Access Granted
    
    }else{
    
        // Access Not Granted
    
    }
    

    现在您可以动态使用您的目录访问权限。每个数组意味着一个模式。每个数组的值是目录中的一个目录(例如:array('uploads', 'sfm') 表示uploads/sfm)

    【讨论】:

      【解决方案2】:

      一个示例解决方案是使用正则表达式获取 md5 目录。

      类似这样的:

      $res = preg_match('/uploads\/sfm\/([a-f0-9]{32}).*/', $dir, $matches);
      
      if (!$res || $matches[1] != md5($UserID)) {
         // user requested a directory he has no access to. Take additional 
         // actions, e.g. return HTTP status 403
         exit('No access here');
      }
      

      【讨论】:

      • oke 看起来很棒。还有一个问题:当用户在根目录中查找时,url 只是:http://example.coml/sfm 所以如果 url 是这样的,那么也必须有访问权限
      • 这很简单。如果您的 dir var 为空,例如if empty($_GET['dir']) ... 然后允许访问!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      相关资源
      最近更新 更多