PHP:如果您使用 preg_replace 仅允许以下 -A-Za-z0-9_,则包含基于 GET 变量的文件是否安全

PHP: Is it safe to include a file based on a GET variable, if you use preg_replace to only allow the following -A-Za-z0-9_

这有多安全?

   if (isset($_GET["var"]) && file_exists("path/".$_GET["var"].".php")) { 
        include("path/".$_GET["var"].".php");
    } else {  
        echo 'File Does Not Exist!';   
    }

我想知道 $_GET["var"] 是否需要 "sanitized" 反对只是让它 运行 反对 file_exists 函数,然后再尝试包含它或不。这很危险吗?

+++已更新+++

谢谢大家的回复!请参阅下面的更新...

function mrClean($var) {
$clean_var = (isset($var) && !empty($var)) ? $var : 'index';
$clean_var = preg_replace('/[^-A-Za-z0-9_]/', '', $clean_var);
return $clean_var;
}

$var = mrClean($_GET["var"]);

if (file_exists("path/".$var.".php")) { 
  include("path/".$var.".php");
} else {  
  echo 'File Does Not Exist!';   
}

当我调用 mrClean 来替换所有内容时,但以下内容:

- A-Z a-z 0-9 _ 通过 preg_replace

...现在这会被认为是安全的吗?是否可以添加任何东西来使它更安全?

我会按照建议实施白名单...但还有其他吗?

谢谢!!

-安德鲁

你不想这样做。

假设我是 运行 index.php 在 /var/www/test 里面是路径(所以 /var/www/test/path exsts)

如果我问这个问题 - file_exists('path/../../../../etc/nginx/sites-available/default.php')

答案是肯定的

即/etc/nginx/sites-available/default.php 中的文件确实存在。我所做的只是将 $_GET['var'] 作为“../../../../etc/nginx/sites-available/default”

现在您已要求网络服务器将一些随机文件包含到您的页面中。

现在 - 我们必须在这里注意,根据权限、操作系统等,这可能无法正常工作。但总的来说,你不想这样做 - 走很远的路,将 if 语句/switch 语句填充到包含中。

您可以尝试通过删除字符等来确保输入安全。但最终,一个错误将使您失去整个文件系统 - 不值得!

是的,您的问题更新中的正则表达式替换是安全的。但请注意,任何包含都是危险的,如果您允许用户包含一些不安全的脚本。