【问题标题】:Is this a Secure PHP Administration Page?这是一个安全的 PHP 管理页面吗?
【发布时间】:2011-07-11 12:24:25
【问题描述】:

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

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 是一个通过查询玩家数据库创建的对象,它代表实际玩家。在我看来,破解这个问题的唯一方法是将他们在表格中的“排名”状态更改为“管理员”,对吗?或者有什么我放过的? 提前致谢

【问题讨论】:

  • if($player-&gt;rank != "Administrador") - 为什么不使用(数字)常量呢?
  • check_user($secret_key, $db);完成所有数据库声明并将 $player 设置为代表播放器的对象

标签: php security administration code-injection


【解决方案1】:
include("admin/" . $_GET['page'] . ".php");

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

blah.php?page=../../../../etc/passwd%00 之类的内容将包括 /etc/password,当然您也可以对其他文件执行此操作 - 甚至可能是用户上传的一些包含 PHP 代码的文件(甚至可以是图像,只要它包含 @987654324 @某处)

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

【讨论】:

  • 谢谢,这正是我担心的......我可以做一个比较,比如 if($_GET['page'] == "allowedfile1" || $_GET['page'] == "allowedfile2" ....) 然后只包含当 GET 正是我允许它运行的时候?
【解决方案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() - 这将始终只返回文件名部分,没有任何目录更改部分。

此外,我完全不建议您使用这样的包含,而是使用一些可以决定对每个请求执行什么操作的控制器层次结构。

认证呢?

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

【讨论】:

  • Thaks 那是我需要和建议的,但我更喜欢你的检查方式。感谢白名单就是答案
  • '即使是你自己数据库中的东西也可能是危险的'——你数据库中的东西是危险的。这里提到了一些优点。
猜你喜欢
  • 2014-11-27
  • 2016-04-22
  • 2014-12-14
  • 2014-06-06
  • 2011-04-05
  • 2021-12-18
  • 2018-03-02
  • 2018-01-31
  • 1970-01-01
相关资源
最近更新 更多