使用RegEx安全检查路径和文件名是否有效?

时间:2012-02-20 05:36:05

标签: php regex

我正在寻找检查遍历路径的最佳方法。目前路径分为两部分,$ user_root和$ input_path如下:

$user_root = '/var/www/users_root';
$input_path = '../../../';
$full_path = $user_root + $input_path;

对于RegEx,我没用。我想检查遍历(如果可能的话删除)以及检查路径中的正确字符& unix和windows的文件名。

由于

1 个答案:

答案 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-_]是一个错误。