我正在寻找检查遍历路径的最佳方法。目前路径分为两部分,$ user_root和$ input_path如下:
$user_root = '/var/www/users_root';
$input_path = '../../../';
$full_path = $user_root + $input_path;
对于RegEx,我没用。我想检查遍历(如果可能的话删除)以及检查路径中的正确字符& unix和windows的文件名。
由于
答案 0 :(得分:1)
为什么不在$ input_path中检查“../”?另外,你认为“正确的角色”是什么?我假设A-Z,a-z和0-9都很好。连字符,下划线和空格怎么样?大多数标点符号在unix和linux中的文件(和目录)名称中有效,但是您没有指定您正在使用的操作系统。
if (strpos($input_path, "../") > 0) {
die("Obvious attempt to look behind the curtain");
} else
if (preg_match("/[^A-Za-z0-9_./-]/", $input_path) {
die("Illegal characters");
} else {
// do something useful
}
盐味。
请注意,正则表达式中方括号内的连字符必须位于左右方括号旁边,或者必须进行转义。所以在正则表达式中,[a-z0-9_-]
表示字母数字加上下划线和连字符。但是[a-z0-9-_]
是一个错误。