繁体   English   中英

使用GET / POST数据的“require”是否安全?

[英]Is it secure to use “require” with GET/POST data?

使用以下代码是否安全:

require($_SERVER['DOCUMENT_ROOT'] . "/pages/" . $_GET['page'] . ".php") 

不,这不安全。 为什么?

因为两个点的序列/../表示一个目录返回,攻击者可能在您的系统上包含任何内容,甚至高于$_SERVER['DOCUMENT_ROOT'] (在一个不幸的配置中,这意味着秘密/敏感的OS配置文件。)

您必须IF或SWITCH以获取允许的值以防止恶意输入。 例:

switch($_GET['page']) {
     case 'welcome': $page='welcome';
     case 'shop': $page='shop';
     default: $page='index';
}
require($_SERVER['DOCUMENT_ROOT'] . "/pages/" . $page . ".php")

还可以查看in_array()以获得更轻松的过滤效果。

StackOverflow对如何使用PHP清理用户输入有一个有用的问答。 它已经有几年了,但原则并没有改变。

快速回答是:如果你可以首先避免这个问题,那你就更好了。

向我们展示您如何使用它,我们可以提供改进建议。

这不安全。 您可以使用具有允许值的数组。 例如

$allowed_pages = array('index', 'test', 'my_page')
if (!in_array($_GET['page'], $allowed_pages)){
    echo 'good bye';
    die();
} else {
   //
}

如果您信任dir中的所有文件,请尝试:

if (in_array($_GET['page'],glob("/pages/*.php"))) {
   require($_SERVER['DOCUMENT_ROOT'] . "/pages/" . $_GET['page'] . ".php");
} else echo "Nice try hacker!";

这是使用我用来清理上传文件名的函数部分的另一个解决方案:

选项#2 谢谢Daniel,Rok!

$page = preg_replace('/[^a-zA-Z0-9_ %\[\]\.\(\)%&-]/s', '', $_GET['page']);
$filename = $_SERVER['DOCUMENT_ROOT'] . "/pages/" . str_replace("/",'',$page) . ".php";
if (file_exists($filename)) {
    require($filename);
} else echo "Nice try hacker!";

请注意,这仅在文件名中没有特殊字符时才有效

使用regExp检查$_GET['page']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM