Php 用于unix的正则表达式..//
我有php管理面板和纯ftpd服务器在后台运行 我想检查用户为特定用户提供的路径是否不包含../。。或// 我使用的是php框架Nette,对于此验证,我使用的是addRule(Form::PATTERN,'error message',$PATTERN)(Nette api文档:,Nette文档: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有一种更简单的方法 如果是我,我会这样做:
<?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是“~^(?。*(?:\.\./\./\.\)。+$~”