2012-05-05 54 views
1

这是安全的吗?或者是否有可能使用一些RFI/LFI或者它叫什么?安全包括php

$request_uri = explode('/', $_SERVER['REQUEST_URI']); 
$script_name = explode('/', $_SERVER['SCRIPT_NAME']); 

for ($i = 0; $i < sizeof($script_name); $i++) { 
    if ($request_uri[$i] == $script_name[$i]) 
    { 
     unset($request_uri[$i]); 
    } 
} 

$command = array_values($request_uri); 

if (file_exists('controllers/' . $command[0] . '.php')) { 
    include 'controllers/' . $command[0] . '.php'; 
} 

更新:

if (isset($_GET['p'])) { 
    $pages = array('home', 'login', 'register'); 
    $page = filter_var($_GET['p'], FILTER_SANITIZE_URL); 

    if (in_array($page, $pages) && file_exists($page . '.php')) { 
     include ($page . '.php'); 
    } else { 
     include ('404.php'); 
    } 
} 
else { 
    include ('home.php'); 
} 
+0

至少所有可读的PHP文件在一个或其他目录中可以很容易地读取。 – hakre

+1

不使用该代码。 – goat

回答

1

那么,如果你确保$command[0]只包含字母数字字符(以及可能的下划线和连字符),那么可能有点安全。

像下面可能做的工作:

if (!ctype_alnum($command[0])) { 
    // Hacking attempt! 
    exit; 
} 

但它仍然是一个坏主意,包括基于用户输入的文件。更好的方法是使用将URI映射到控制器的查找表,并使用自动加载来包含相关文件。这样,用户输入和包含之间就有了很大的分离。

+0

这个怎么样:(检查问题) } – John

+0

你的更新看起来更好。 'filter_var()'是多余的,因为你正在检查白名单。 – kijin

+0

我只是好奇为什么页面无法找到(我的意思是整个网站),如果我添加一个“或”的网址... http:// localhost/url /通常可以工作,但http:// localhost/url /'不起作用(网站无法找到)为什么? – John