RegEx找到" ../"或" ./"

时间:2012-03-10 17:41:51

标签: php regex

我正在尝试使用正则表达式来告诉我路径是否包含./../。这是为了检查用户是否超出他们的区域。如果输入包含正斜杠之前的一段时间,则不会被接受。

E.g。

/user/selected/path/ - Ok 
./user/selected/path/ - Failed 
../user/selected/path/ - Failed 

正斜杠将替换为DIRECTORY_SEPERATOR,因此适用于unix和windows路径。

4 个答案:

答案 0 :(得分:6)

检查是否存在“..”是该问题的不完美解决方案。

如果您想阻止用户突破基本目录,请检查路径的realpath()结果(将考虑相对路径)是否仍在根路径下。

示例:

$root = "/my/user/basepath";
$requested_path = $_GET["input"]; // or whatever

$real_path = realpath($root."/".$requested_path);

if (strpos($real_path, $root) !== 0)
 die ("Illegal path");

答案 1 :(得分:0)

使用此

if (preg_match('#\.(\.)?/#', $path, $match)) echo "Error";

如果您只需要在开头检查../或./,则必须使用此

if (preg_match('#^\.(\.)?/#', $path, $match)) echo "Error";

答案 2 :(得分:0)

a)推荐strpos这个简单的东西,而不是正则表达式。

$usrPath = '../some/path/';
if (strpos($usrPath, '.' . DIRECTORY_SEPARATOR) !== false){
    die('oh no you don\'t');
}

b)建议确保您的服务器设置和文件系统权限设置为防止用户“超出其区域”的可能性,而不是编程方法。

答案 3 :(得分:0)

$myString = "some/path";
if (preg_match('/(\.\.\/|\.\/)/', $myString)) { 
    echo "found ../ or ./ in path"; 
}