这是一个安全的PHP管理页面吗?

时间:2011-07-11 12:24:25

标签: php security administration code-injection

我正在做游戏,我为它创建了一个“管理”面板。 它的工作原理如下:

admin.php
admin/code1.php
admin/code2.php

admin.php的:

<?php
include("lib.php");
$player = check_user($secret_key, $db);
if($player->rank != "Administrador")
{
header("Location: personagem.php");
exit;
}
include("templates/private_header.php");
head("Admin Panel","adminpanel.png");
startbox();
if(isset($_GET['page']))
{
include("admin/" . $_GET['page'] . ".php");
}
else
{
?>
<A href="admin.php?page=code1">Kill Players</a><br>
<A href="admin.php?page=code2">Heal Players</a><br>

<?php
}
endbox();
include("templates/footer.php");
?>

我想知道我是否容易受到黑客攻击。 code1.php和code2.php使用lib.php中包含的自定义查询库,因此无法直接执行它们而不会出现错误。

同样在我的模板中我有:

if($player->rank == "Administrador")
{
echo "<a href='admin.php'>Admin Panel</a>";
}

所以我可以更快地访问面板。那里也存在风险吗?

请注意,$ player是从对代表实际玩家的玩家数据库的查询创建的对象。在我的想法中,破解这个的唯一方法是将表中的“排名”状态更改为“Administrador”我是对的吗?或者我有什么东西可以通过? 提前致谢

2 个答案:

答案 0 :(得分:5)

include("admin/" . $_GET['page'] . ".php");

这是一个巨大的安全漏洞。

blah.php?page=../../../../etc/passwd%00这样的东西会包含/etc/password,当然你也可以用其他文件来做这些 - 甚至可能是用户上传的包含PHP代码的一些文件(甚至可能是图像只要是它包含<?php [code]某处)

即使只有你是管理员,也不会关闭这样的漏洞并不明智 - 在某些时候你可能会有其他管理员。

答案 1 :(得分:2)

永远不要相信用户输入

永远不要使用任何$_GET $_POST$_COOKIE而不先验证它们(或者用户生成的任何其他内容,即使您自己的数据库中的内容可能也很危险)。

include("admin/" . $_GET['page'] . ".php");

不要这样做。否则你可以包含你想要的任何文件。我建议您白名单包含所有允许的页面,如下所示:

$allowed = array("admin_index", "page1", "page2");
if(in_array($_GET['page'], $allowed)){
    include("admin/" . $_GET['page'] . ".php");
}
else{
    // perform error handling
}

如果您不想将所有页面列入白名单,这是一个有用的功能:basename() - 这将始终只返回文件名部分,而不会有任何目录更改部分。

此外,我不建议您使用这样的包含,而是使用一些可以决定在每个请求上执行操作的Controller层次结构。

身份验证怎么样?

向我们展示您的身份验证代码。这是您的系统中需要安全的关键部分。