使用PHP使用带有$ _GET的preg_match和目录名称时出现问题

时间:2014-02-18 06:02:01

标签: php get preg-match

我有一个脚本使用$ _GET来检索目录名称并将其附加到URL以检索webroot外部文件夹中的文件。

这是我目前的代码:

<php
$getdir = $_GET['dir'];
$getdoctype = $_GET['doctype'];
$dir = "/var/www/uploads/$getdir/$getdoctype";
$subdir1 = scandir($dir); /* This function sorts dirs */
$list = array_diff($subdir1,array(".","..","index.php"));
echo "<ol>";
foreach ($list as $file)
{
        if (!is_dir($file)) echo "<li><a href='https://example.ca/private/download_files.php?dir=$getdir&doctype=$getdoctype&filename=$file'>$file</a></li>\n";

}
echo "</ol>";
?>

我知道在这种情况下使用$ _GET是非常不安全的,所以我想用preg_match函数清理我的$ _GET变量。我已经从这个板上的用户那里得到了这个功能,似乎无法让它工作。

这是我的函数代码:

<?php
$getdir = $_GET['dir'];
$getdoctype = $_GET['doctype'];

// CLEANING GET VARIABLES 
if (!preg_match('/^[a-zA-Z0-9]+$/', $getdir) || !preg_match('/^[a-zA-Z0-9]+$/', $getdoctype)) {
die('Bad parameter!');
}


$dir = "/var/www/uploads/$getdir/$getdoctype";
$subdir1 = scandir($dir); /* This function sorts dirs */
$list = array_diff($subdir1,array(".","..","index.php"));

echo "<ol>";
foreach ($list as $file)
{
        if (!is_dir($file)) echo "<li><a href='https://example.ca/private/download_files.php?dir=$getdir&doctype=$getdoctype&filename=$file'>$file</a></li>\n";

}
echo "</ol>";

?>

get变量可以在目录名称中包含空格。此外,%20是一个http转义字符串,也可以被接受。我只是不希望黑客进入我的服务器。

如果你们有的话,我也会在这个实现中接受$ _GET的替代方案。

1 个答案:

答案 0 :(得分:1)

根据正则表达式,目录名称应以a-zA-z开头,并添加space,_,-也有效

////////////////////////////////////////////
// Explanation 
// \s : new folder
// \_ : new_folder
// \- : new-folder

if ( !preg_match('/^[a-zA-Z]+[a-zA-Z0-9\s\_\-]+$/', urldecode($getdir)) || 
     !preg_match('/^[a-zA-Z]+[a-zA-Z0-9\s\_\-]+$/', urldecode($getdoctype))) {
    die('Bad parameter!');
}

学习资源:

Essential Guide To Regular Expressions Tools, Tutorials and Resources