安全动态包含

2 php security

我一直在我的网站上使用这个PHP动态包含代码.但我认为这不安全,如何编写更安全,更好的代码来代替这个:

$page = (empty($_GET['page'])) ? '' : $_GET['page'].".html";

if (empty($page))
{ 
 $page = 'index.html';
}

else
 {
 $page = $page;

 }

 include($page);
Run Code Online (Sandbox Code Playgroud)

非常感谢你

Mac*_*ski 9

在安全性方面,总是允许政策是一个糟糕的政策.不要认为请求有效且安全.始终拒绝提前,并使用白名单:

switch($_GET['page']): 
   case 'page-a': case 'page-b': case 'other-page':
      include $_GET['page'] . '.html';
      break;
    default: 
      include 'index.php';
endswitch;
Run Code Online (Sandbox Code Playgroud)

如果白名单难以维护,请尝试将可能性缩小到单个路径,使用basename:

$name = basename($_GET['page']);
include 'includes/' . $name . '.html';
Run Code Online (Sandbox Code Playgroud)

这样您就不必担心安全性,只要您保持此目录的所有内容(以及所有包含路径)安全(注意有人可以将受感染的文件上载到该目录).

如果上述操作失败,请尝试使用realpath()并确保该文件位于指定的目录树中.