我正在尝试使用正则表达式来告诉我路径是否包含./
或../
。这是为了检查用户是否超出他们的区域。如果输入包含正斜杠之前的一段时间,则不会被接受。
E.g。
/user/selected/path/ - Ok
./user/selected/path/ - Failed
../user/selected/path/ - Failed
正斜杠将替换为DIRECTORY_SEPERATOR,因此适用于unix和windows路径。
答案 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";
}