PHP:保护数据库连接凭据

时间:2012-01-05 14:58:23

标签: php database security

我正在努力建立一个环境,在这个环境中,多个网站将使用相同的PHP副本,并使用自己的MySQL数据库实例。这显然意味着每个网站的连接凭证,用户越多,密码越多,因此黑客的目标越可取。只是为了确保每个人都在同一页面上,这些是我正在谈论的凭据......

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

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

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

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

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

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

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

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

我目前正在共享托管,但希望我的设置最终可以扩展到专用托管。

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

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

4 个答案:

答案 0 :(得分:5)

尝试减慢已经拥有对系统的root访问权限的入侵者几乎没有什么好处。即使你设法隐藏了足够的凭据以阻止他们,他们已经可以访问你的系统,并且可能会以百万种方式造成严重破坏,包括修改代码以执行他们想做的任何事情。

你最好的选择是专注于防止坏人穿透你的外围防御,只有在你确定你已尽一切可能让他们留在门口之后才会担心其余部分。

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

答案 1 :(得分:3)

正如code_burgar所说,一旦你的盒子给了root,就太晚了。话虽这么说,我不得不在一段时间内参与的项目上实施额外的安全策略。将配置文件存储在加密分区中的解决方案,以便直接访问计算机的人无法通过将驱动器连接到另一台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或检索。

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

答案 2 :(得分:3)

您希望在图层中处理安全问题。是的,如果攻击者具有root权限,那么你就处于非常糟糕的地方 - 但这并不意味着你不应该保护自己免受较低的渗透程度。大多数这些建议可能很难在共享主机上进行...

假设你正在使用一个体面的托管服务提供商和最新版本的LAMP,那么获得root权限所需的工作量是巨大的 - 除非你是一个非常有利可图的目标,否则这不是你最担心的。

我假设您正确地强化了服务器和基础架构,并检查它们是否正确配置。您还需要关闭不需要的服务 - 例如如果您运行的是FTP服务器,那么可以强制输入密码的攻击者不需要root用户就可以进入。

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

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

绝对值得研究数据库权限的设置方式 - 虽然这可能很难,并且可能无法产生更多额外的安全性。至少,为每个客户端创建一个“Web用户”,并授予该用户在其自己的数据库上的“插入,更新和删除”。

答案 3 :(得分:0)

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

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

无法使用“www.example.com/db/DBConnection.php”

访问此文件

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