2010-08-14 52 views
2

我准备在$ _GET数组的基础上建立一个请求路由系统。包含文件时的安全考虑

例如,对于URL ?r=login我会使用包括myfiles/".$_GET['r'].".php"; 这将自动指向myfiles的/ login.php中

我知道我需要消毒获取输入,但我担心,因为它是可能会恶意重定向包含。任何人都可以建议如何防止这一点?在调用它之前,我还可以检查实际存在的文件吗?

我有我自己的一些想法,我只想知道我没有错过任何考虑。

+0

如果我设置包括与之前把绝对路径变量,会阻止重定向站点? (我正在考虑将这些包含在Web根目录之上,而不是公开的视图)。 – YsoL8 2010-08-14 14:17:58

回答

5

不包含通过url指定的文件总是一个好主意。如果您仍然想这样做,使用switch陈述或任何array过滤的东西,包括你只需要什么:

例1:

$page = $_GET[...]; 

switch($page){ 
    case 'login': include 'login_page.php'; break; 
    // and so on 
    default: die("bye bad guy !"); 
} 

例2:

$page = $_GET[...]; 

$pages = array('page1.php', 'page2.php', 'page3.php'); 

if(in_array($page, $pages)) 
{ 
    include($page); 
{ 
else 
{ 
    die("bye bad guy !"); 
} 

我建议你看看这些相关的安全措施:

+0

有没有更好的方法来在PHP中设置路由系统? – YsoL8 2010-08-14 15:04:09

+0

@ YsoL8:看看我的答案中的例子2。那是我能想到的那种你所处的状况。 – Sarfraz 2010-08-14 15:14:37

+0

我希望自动设置路径以保持结构的一致性。你会反对吗? – YsoL8 2010-08-14 16:31:17

1

如果可以的话,使用白名单。如果不能,那么:

  • 允许下划线和字母数字字符只有
  • 把包含文件到一个单独的目录
相关问题