我正在做游戏,我为它创建了一个“管理”面板。 它的工作原理如下:
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”我是对的吗?或者我有什么东西可以通过? 提前致谢
答案 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层次结构。
向我们展示您的身份验证代码。这是您的系统中需要安全的关键部分。