【问题标题】:PHP: Securing database connection credentialsPHP:保护数据库连接凭据
【发布时间】:2012-01-05 14:58:22
【问题描述】:

只是为了确保每个人都在同一页面上,这些是我正在谈论的凭据...

$user = 'user';// not actual user, not root either
$pass = 'pass';// not actual password
$server = 'localhost';
$database = mysqli_connect($server,$user,$pass,true|false);

所以我说的是用于连接到数据库的密码,而不是数据库中的密码(为了澄清,我已经用盐和胡椒散列了)。

我没有读过任何我认为远程建议您可以拥有 100% 万无一失的安全性的内容,因为显然服务器需要连接到数据库并 24/7 全天候为访问者获取内容;如果我弄错了,我很想听听这怎么可能。

因此,假设黑客具有 root 访问权限(或者,如果这并不意味着可以访问 PHP 代码,我们就说可以访问所有 PHP 源代码)并且他们(在这种情况下)希望访问/修改/等数据库。如果我们无法阻止他们访问 PHP 源代码,那么我们希望尽可能地减慢他们的速度。对于每个站点,我可以将每个站点/数据库连接密码保存在单独的文件中(可以像在完成多域支持几周后)而不是 public_html 内部(显然)。我使用序列化和反序列化来存储某些变量,以确保当数据库在共享主机上变得不可用时具有一定程度的容错(防止站点 A 看起来和像站点 B 一样行事,反之亦然),因为数据库有时会多次变得不可用一天(当 SQL 服务再次可用并捕获这些“远离”错误时,将写入我的数据库错误日志)。我想到的一个想法是确定一种将密码存储在一个哈希中并取消哈希以用于通过 PHP 连接到数据库的方法,尽管我也想对此提出一些意见。

如果有人从数据库的角度提出建议(例如,能够将用户限制为 SELECT、INSERT、DELETE、UPDATE 等,并且不允许 DROP 和 TRUNCATE 作为示例),我主要关心的是确保我是 SQL 中立的我计划最终从 MySQL 迁移到 PostgreSQL(这可能是相关的,也可能不是相关的,但如果最好提及它)。我目前使用 phpMyAdmin 和 cPanel 并且 phpMyAdmin 显示连接的用户与站点的数据库用户名不同,因此在这方面我仍然可以对该用户使用某些命令(再次以 DROP 和 TRUNCATE 作为示例)并限制 SITE 用户权限,除非不知为何我弄错了?

有没有办法配置接受连接凭据的上下文?澄清一下,有权访问源代码的黑客不会像合法用户那样访问该网站。

我脑海中闪过的另一个想法是基于系统的加密,是否有一种近乎通用的(如在每个或几乎每个 LAMP 网络主机设置中)网络托管技术,系统可以通过 Apache 读取/写入文件,这将引入一个黑客必须确定绕过方法的新层?

当然,我为每个用户使用不同的密码。

我目前使用的是共享主机,但希望我的设置最终会扩展到专用主机。

那么对于我的安全概念有什么想法,我可以尝试哪些其他概念来使我的数据库连接凭据更安全?

澄清:我正在寻找我可以追求的想法。如果对任何建议存在分歧,请要求澄清并解释您的担忧,而不是辩论给定的方法,因为我可能甚至可能没有考虑过,更不用说开始追求给定的概念了。谢谢!

【问题讨论】:

  • 这不是建设性问题,不适合 SO,请发表具体问题,这只会引发辩论和讨论。
  • 我看不出提高存储数据库凭据的安全性是多么没有建设性。我不是在寻找想法的辩论,我会在我的问题中添加澄清。

标签: php database security


【解决方案1】:

试图减缓已经对您的系统具有 root 访问权限的入侵者几乎没有什么好处。即使您设法将凭据隐藏得足够好以阻止他们,他们也已经可以访问您的系统,并且可以以一百万种方式造成严重破坏,包括修改代码以做他们想做的任何事情。

您最好的选择是专注于防止坏人穿透您的外部防御,只有在确保您已尽一切可能将其阻止在大门外后,才能担心其余的事情。

话虽如此,如果您的架构允许,将数据库用户帐户仅限于特定权限子集绝对不是一件坏事。

【讨论】:

  • 我肯定会相应地调整权限,想先听听别人的好主意。请记住,我是一名网络开发人员,我实际上并不维护服务器。
【解决方案2】:

正如 code_burgar 所说,一旦你的盒子生根,就太晚了。话虽如此,我不得不对我不久前参与的一个项目实施额外的安全措施。将配置文件存储在加密分区中的解决方案,这样可以直接访问机器的人无法通过将驱动器连接到另一台 PC 来获取密码。当然,这是对文件系统权限的补充,因此人们无法从操作系统本身读取文件。

如果您真的对安全有偏执,那么另一个值得一提的细节:

$user = 'user';// not actual user, not root either
$pass = 'pass';// not actual password
$server = 'localhost';
$database = mysql_connect($server,$user,$pass,true|false);

unset($user, $pass, $server);  // Flush from memory.

您可以在使用后unset 关键变量,确保它们不会被 var_dumped 或从内存中检索。

祝你好运,希望对你有所帮助。

【讨论】:

    【解决方案3】:

    您希望分层处理安全性。是的,如果攻击者具有 root 访问权限,那么您就处于非常糟糕的境地——但这并不意味着您不应该保护自己免受较低级别的渗透。这些建议中的大多数在共享主机上可能很难做到……

    假设您使用的是不错的托管服务提供商和最新版本的 LAMP,获得 root 访问权限所需的工作量很大 - 除非您是一个非常有利可图的目标,否则这不是您最担心的问题。

    我假设您适当地强化了您的服务器和基础架构,并检查它们的配置是否正确。您还需要关闭不需要的服务 - 例如。如果你有一个 FTP 服务器正在运行,一个可以暴力破解密码的攻击者不需要 root 就可以进入。

    您可能应该做的第一件事是确保应用程序代码没有漏洞,并且您有一个强密码策略。大多数“黑客”并不是邪恶的天才在你的服务器上担心了几个月直到他们拥有“root”的结果——它们是愚蠢的错误(例如 SQL 注入)或弱密码(“admin/admin”任何人?) .

    接下来,您要确保如果您的网络服务器受到威胁 - 但不是在“根”级别 - 您可以阻止攻击者执行任意 SQL 脚本。这意味着尽可能将您的 Web 服务器的权限限制为“读取和执行”,这样他们就无法上传新的 PHP 文件。这也意味着删除诸如 CPanel 和 phpMyAdmin 之类的东西 - 可以破坏您的生产服务器的攻击者可能会破坏这些应用程序,并从您那里窃取密码(如果您需要它们在不同的服务器上运行它们)。

    您的数据库权限的设置方式绝对值得研究 - 尽管这可能很难,并且可能不会产生太多额外的安全性。至少,为每个客户端创建一个“网络用户”,并授予该用户在他们自己的数据库上仅“插入、更新和删除”的权限。

    【讨论】:

      【解决方案4】:

      我找到了 PHP(Linux) 的解决方案,在根目录上创建一个目录,例如 db,并创建一个类并在一个类中定义所有数据库连接变量和访问方法,例如 DBConnection.php,现在您的网站就是示例。 com 您将文件存储在 public_html 目录下创建一个 php 文件在此目录下连接并执行所有数据库操作并使用以下语句包含 DBConnection.php 文件

      require('../db/DBConnection.php');
      

      无法使用“www.example.com/db/DBConnection.php”访问此文件

      你可以在你的网站上试试这个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多