【问题标题】:PHP/MySQL security problemPHP/MySQL 安全问题
【发布时间】:2013-11-30 06:51:46
【问题描述】:

我在 000webhost 上有一个 PHP/MySQL 网站(http://www.boisvert.me.uk;但目前正在审查中),我担心它的安全性。我正在尝试做的事情会使任何网站都容易受到攻击;它相当于给孩子们提供锋利的剪刀的PHP。我有各种想法可以最大限度地减少网站的漏洞,但欢迎提供更多建议。

特别是有两个脚本:

  • 上传脚本。其目的是允许注册站点用户上传某些 XML 文件(教程)。显然,要做到这一点,网站上的文件夹会为访问者提供写入权限。我不喜欢这样,但我没有办法解决,我可以向脚本添加检查(类型、大小),以确保上传的文件仅限于 XML 和一些图像。还有其他可以改进的地方吗?

  • Script 2 是 PHP 的解释器 - 用户可以在表单中输入 PHP,它会执行(无需保存)。我希望允许用户尝试数据库访问,因此粗略的字符串替换确保我不需要泄露 MySQL 访问信息。但是攻击者可以使用这个解释器来访问文件区域并上传不受欢迎的材料。我的解决方案是将解释器放在一个单独的域中,不能上传任何文件。

欢迎提出任何改进这一点的建议,除非“不要这样做”。我知道这很危险。过马路也是如此。感谢您的帮助。

【问题讨论】:

  • 无意冒犯,但第二点听起来更像是“穿越高速公路” :) 如果它是可公开访问的,那么您将运行该服务器的服务器置于极大的危险之中。单独的 不会保护您,因为 PHP 的用户可能有权访问服务器上的其他站点。参见例如Exploitable PHP functions
  • 这适合什么样的目标受众?这是针对只有几十名学生的小型大学课程,还是完全公共服务?
  • 我希望它是公开的,基于下面的答案它不会。

标签: php mysql security


【解决方案1】:

前面的答案已经涵盖了第一点(并且可能在本网站的其他地方很多次)

对于第二点,如果你觉得你必须拥有这个,我会提出一些建议。您可以编译自己的 PHP 二进制文件,排除您不希望用户需要的所有选项(可能忽略除 MySQL 之外的所有选项)。然后,您应该创建一个 php.ini 文件,该文件禁用任何具有潜在危险的功能(为此使用 disable_functions 配置选项 - 请参阅其他答案)。将内存使用和 CPU 时间限制为合理的数字(对于您希望允许用户运行的简单脚本)。现在我们应该能够使用system("chroot /path/to/secure/dir ./php tempfile.php"); 之类的东西在chrooted 环境中运行所有这些。 /path/to/secure/dir 应该是您将用户 PHP 脚本写入临时文件的目录。它应该包含 PHP 可执行文件和安全的 php.ini 文件。这些文件和安全目录应该由运行脚本的用户(特别是 PHP 可执行文件和 php.ini 文件)以外的用户拥有,并且任何人都不能写入。安全目录应位于 Web 根目录之外。

现在,我不会假装我已经想到了一切,但希望这些想法可以成为您安全环境的基础。

【讨论】:

    【解决方案2】:

    好吧,脚本 2 在我看来绝对是不行的。除非你完全确定你可以避免任何你不想在你的服务器上运行的脚本(相信我,这根本就没有完成)。我会摆脱这个想法。在这种情况下,您更有可能编写脚本并存储代码,直到您对其进行审查,然后用户才能执行它。

    我不确定您要授予他们对数据库的什么访问权限,但也许您可以通过创建某种形式来控制它:

    (1) give me data from [table]
    (2) based on these critera
    (3) from startdate to enddate
    

    不确定这是否符合您的需求.. 但如果您只想为他们提供数据库访问权限,那么使用搜索功能进行操作比让他们执行 PHP 代码片段更容易控制。

    如果您的第一个问题没有得到足够好的保护,那么您的第一个问题只会带来风险。打开文件夹进行上传并不是最大的风险,没有人可以将文件放在那里。风险是一个糟糕的安全性,它允许上传恶意文件(例如 PHP 文件),然后可以运行。因此,除了检查文件类型、文件扩展名、文件大小、文件头等之外,您可能还希望将这些文件放在网站根文件夹之外。如果它们只是图像和 XML 文件,您可以编写 PHP 脚本以获取文件内容 (file_get_contents) 并根据读取的内容创建 xml/图像文件。

    【讨论】:

    • 困难在于,数据库访问的目的是教 PHP/MySQL,所以像搜索工具那样限制并不能解决问题。
    【解决方案3】:

    在第一种情况下,如果您检查以确保上传的文件是 XML 或图像并且不允许任何其他类型,则可以。我看不出有什么问题。

    你想做的第二件事是我关心的事情。即使您将 PHP 解释器放在单独的域上,它仍然很危险,因为任何人都可以使用它来发送垃圾邮件或解释他们自己的脚本来删除您的文件或其他东西。我看到的唯一解决方案是禁止列出 php 命令和表达式,但您必须确保您的列表已满。抱歉没有其他想法...

    【讨论】:

      【解决方案4】:

      在 PHP 中

      关于您的第二点,您可以通过

      创建一个中途安全解决方案
      • 禁用所有可以执行外部命令的功能
      • 禁用 fopen URL 包装器以阻止 http:// 请求
      • 禁用mail 命令、curl 和所有其他可能有问题的命令和包装器 - 一个有用的列表在这里:Exploitable PHP functions
      • 安装suhosin补丁
      • 为每个用户创建数据库;发布仅限于该一个数据库的 mySQL 凭据。 (您将无法保护单个数据库。)

      这些都不能在共享主机上完成,但是,这些东西需要对服务器的 root 访问权限。在共享主机上,我想说你想要做的事情是不可能的。

      使用虚拟机

      另一个想法:我不知道您的项目的背景/预算/目标受众是什么 - 如果您只能使用网络托管公司,那是不可能的 - 但如果它用于大学项目(= 有限学生人数、时间跨度更长),您是否考虑过以每用户虚拟机的形式创建真正的沙盒解决方案?

      每个用户都可以拥有自己的虚拟机,上面预装了 PHP 和 mySQL,并在上面做任何他们喜欢的事情。您将阻止它访问外部世界,并在学生完成后处理每个 VM。

      应该可以从预定义的映像创建每个虚拟机,但显然这需要大量的硬件资源和系统管理员工作,因此它可能不是您的方案的解决方案。

      【讨论】:

      • 非常有帮助,是的,我接受您的建议是“半安全”,但情况总是如此。我不必使用共享主机。
      • 接受 qbert 是因为你有足够的声誉 :) 但你的两个答案都给了我很多帮助。
      【解决方案5】:

      自两年前以来,另一种选择变得更加成熟:使用其中一种 pastebin / 远程执行工具。

      目前我使用phpfiddle。它的远程执行 API 支持 MySQL 连接和更多值得教授的有用技术。这是test - 我的主机很慢,但 PHPFiddle 部分很好。所以我把我必须严格控制的十几个 PHP 教程放到网上。

      当然,之前答案中的安全说明仍然适用。 PHP Fiddle 实现了类似于它自己的 PHP 编译的东西,只包含所需的模块。

      【讨论】:

        猜你喜欢
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2011-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多