2012-01-05 58 views
2

我正在努力实现一个环境,即多个网站将使用与PHP自己的MySQL数据库实例完全相同的PHP副本。这显然意味着每个网站的连接凭证,越多的用户密码越多,因此更适合黑客的目标。只是为了确保每个人都在同一页这些都是我在谈论的凭据...PHP:确保数据库连接凭据的安全

$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源代码),并且他们(在这种情况下)希望访问/修改/等数据库。如果我们无法阻止他们访问PHP源代码,那么我们希望尽可能减慢它们的速度。我可以将每个站点/数据库连接密码保存在每个站点的单独文件中(可以像我在完成多域支持后的几周内),而不是在public_html(显然)内部。我使用序列化和反序列化来存储某些变量,以确保当共享主机上的数据库变得不可用时防止某种程度的容错性(防止站点A查看并像站点B一样操作,反之亦然),因为数据库有时可能无法使用多次一天(我的数据库错误日志被写入SQL服务再次可用并捕获这些“离开”错误)。我想到的一个想法是确定一种将密码存储在一个散列中的方法,并将它们散列为用于通过PHP连接到数据库,尽管我希望对此有一些意见。

如果有人从数据库的角度有一个建议(例如有限制用户选择,插入,删除,更新等,并且不允许DROP和TRUNCATE作为例子)我主要关心的是确保我是SQL中立的因为我打算最终从MySQL迁移到PostgreSQL(这可能或可能不相关,但如果最好提及它)。我目前使用phpMyAdmin和cPanel,phpMyAdmin显示连接的用户与站点的数据库用户名不同,所以在这方面,我仍然可以使用该用户的某些命令(DROP和TRUNCATE作为示例再次)并限制SITE用户的权限,除非我出于某种原因被误认为?

有没有办法配置连接凭证被接受的地方的上下文?为了澄清,访问源代码的黑客不会像合法用户那样访问站点。

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

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

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

那么对我的安全概念有什么想法以及我可以尝试使我的数据库连接凭证更安全吗?

说明:我正在寻找我可以追求的想法。如果对任何建议有不同意见,请澄清并解释您的担忧,以替代对特定方法进行辩论,因为我可能甚至可能没有考虑过让别人开始追求某个给定的概念。谢谢!

+0

这不是一个建设性的问题,不适合SO,请发表具体问题,这只会导致辩论和讨论。 – Jakub 2012-01-05 15:07:59

+0

我看不出如何提高存储数据库凭证的安全性不具有建设性。我不想为辩论寻找辩论,我会在我的问题上加上澄清。 – John 2012-01-05 15:16:38

回答

5

有一点可以从尝试到已到你的系统的root访问权限的入侵者慢下来获得的。即使您设法将凭证隐藏得足够让他们灰心,他们已经可以访问您的系统,并且可能会以百万种方式造成严重破坏,包括修改代码以执行任何他们想做的事情。

最好的办法是把重点放在防止坏人从不断渗透到你的外部防御,担心你确信你做的一切,你可以让他们在家门口后才休息。

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

+0

我肯定会相应地调整权限,希望先听听别人的一个好主意。请记住,我是一名Web开发人员,我实际上并未维护服务器。 – John 2012-01-05 15:20:31

3

正如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进入。

您应该做的第一件事是确保应用程序代码没有漏洞,并且您有一个强大的密码政策。大多数“黑客”并不是邪恶天才们在你的服务器上花费数月的时间,直到他们拥有“根” - 这是由于愚蠢的错误(例如SQL注入)或弱密码(任何人的“管理员/管理员”)造成的结果。 。

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

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

0

我发现在根对PHP(Linux)的解决方案创建一个目录说db并创建一个类,定义在类的所有数据库连接变量和访问方法说DBConnection.php现在您的网站是example.com你存储public_html目录文件创建这个目录下的PHP文件连接和做所有的数据库操作,并使用下面的语句

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

这个文件不能使用访问“www.example.com/db包括DBConnection.php文件/DBConnection.php'

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