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

iam*_*art 9 php security

使用以下代码是否安全:

require($_SERVER['DOCUMENT_ROOT'] . "/pages/" . $_GET['page'] . ".php") 
Run Code Online (Sandbox Code Playgroud)

Rok*_*alj 12

不,这不安全.为什么?

因为两个点的序列/../表示一个目录返回,攻击者可能在您的系统中包含任何内容,甚至是上面的内容$_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")
Run Code Online (Sandbox Code Playgroud)

还要检查in_array()一下更容易过滤.


yAn*_*Tar 1

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

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