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 语句填充到包含中。
您可以尝试通过删除字符等来确保输入安全。但最终,一个错误将使您失去整个文件系统 - 不值得!
是的,您的问题更新中的正则表达式替换是安全的。但请注意,任何包含都是危险的,如果您允许用户包含一些不安全的脚本。
这有多安全?
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 语句填充到包含中。
您可以尝试通过删除字符等来确保输入安全。但最终,一个错误将使您失去整个文件系统 - 不值得!
是的,您的问题更新中的正则表达式替换是安全的。但请注意,任何包含都是危险的,如果您允许用户包含一些不安全的脚本。