Php 用于unix的正则表达式..//

Php 用于unix的正则表达式..//,php,regex,preg-match,Php,Regex,Preg Match,我有php管理面板和纯ftpd服务器在后台运行 我想检查用户为特定用户提供的路径是否不包含../。。或// 我使用的是php框架Nette,对于此验证,我使用的是addRule(Form::PATTERN,'error message',$PATTERN)(Nette api文档:,Nette文档: 感谢您抽出时间我不知道您是否对其他解决方案持开放态度,但如果是我,我不会尝试在路径上使用正则表达式,因为PHP有一种更简单的方法 如果是我,我会这样做: <?php // You know

我有php管理面板和纯ftpd服务器在后台运行

我想检查用户为特定用户提供的路径是否不包含../。。或//

我使用的是php框架Nette,对于此验证,我使用的是addRule(Form::PATTERN,'error message',$PATTERN)(Nette api文档:,Nette文档:


感谢您抽出时间

我不知道您是否对其他解决方案持开放态度,但如果是我,我不会尝试在路径上使用正则表达式,因为PHP有一种更简单的方法

如果是我,我会这样做:

<?php

// You know your users are limited to their own home directory
$user_base_dir = '/home/skunkbad/';

// And they supply some path that attempts directory transversal
$supplied_path = '/home/skunkbad/../../etc/';

// Realpath in this case would return "/etc/"
$realpath = realpath( $supplied_path );

// So the check to see if the user base directory is in the path that realpath returns would fail
if( stripos( $realpath, $user_base_dir ) !== 0 )
    echo 'Invalid Path!';

谢谢@BrianGottier

但是,
realpath($path)
检查文件系统中是否真的存在该文件,脚本需要权限才能执行……因此,既然我知道我要找的是什么,我就在谷歌上搜索了一些来自php.net和community的东西,我想出了以下方法:

/**
 * @param $path
 * @param $baseDir
 * @return bool
 */
protected function isDirValid($path, $baseDir)
{
    if (stripos($path, '\\'))
        return false;

    $path = str_replace('/', '/', $path);
    $path = str_replace('\\', '/', $path);

    $parts = array_filter(explode('/', $path), 'strlen');

    $absolutes = [];

    foreach ($parts as $part)
    {
        if ('.' == $part)
            continue;

        if ('..' == $part)
        {
            array_pop($absolutes);
        } else {
            $absolutes[] = $part;
        }
    }

    $realDir = '/' . implode('/', $absolutes);

    if (stripos($realDir, $baseDir) !== 0)
        return false;

    return true;
}

我想我的问题是,为什么你要允许用户指定服务器路径?无论你在做什么,停下来想想如何更改。这是网络主机的虚拟路径,因为我们希望客户端选择自己的根目录并拥有更多的ftp帐户。我只是一个编码员,而不是做出这个决定的人这是什么意思e> 表示?具体示例?Unix路径系统。因此,如果您使用../您将从当前目录进入上层目录,如terminal:/home/something/IAmHere:cd..//home/something和/。/和/。/只是变体
我想检查用户为特定用户提供的路径是否不包含../../或/
would是
“~^(?。*(?:\.\./\./\.\)。+$~”