Php 如何使数据库连接安全?
我目前正在为我的教会大学小组开发一个网站,我开始有点担心我所写内容的安全性。例如,我使用这个函数:Php 如何使数据库连接安全?,php,mysql,database,security,pdo,Php,Mysql,Database,Security,Pdo,我目前正在为我的教会大学小组开发一个网站,我开始有点担心我所写内容的安全性。例如,我使用这个函数: function dbConnect() { global $dbcon; $dbInfo['server'] = "localhost"; $dbInfo['database'] = "users"; $dbInfo['username'] = "root"; $dbInfo['password'] = "password"; $con = "mysql:hos
function dbConnect()
{
global $dbcon;
$dbInfo['server'] = "localhost";
$dbInfo['database'] = "users";
$dbInfo['username'] = "root";
$dbInfo['password'] = "password";
$con = "mysql:host=" . $dbInfo['server'] . "; dbname=" . $dbInfo['database'];
$dbcon = new PDO($con, $dbInfo['username'], $dbInfo['password']);
$dbcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$error = $dbcon->errorInfo();
if($error[0] != "")
{
print "<p>DATABASE CONNECTION ERROR:</p>";
print_r($error);
}
}
函数dbConnect()
{
全球$dbcon;
$dbInfo['server']=“localhost”;
$dbInfo['database']=“用户”;
$dbInfo['username']=“root”;
$dbInfo['password']=“password”;
$con=“mysql:host=”..$dbInfo['server']”;“dbname=”..$dbInfo['database'];
$dbcon=新PDO($con,$dbInfo['username'],$dbInfo['password']);
$dbcon->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常);
$error=$dbcon->errorInfo();
如果($error[0]!=“”)
{
打印“数据库连接错误:”;
打印错误($error);
}
}
在执行某种查询时连接到数据库。我总是使用PDO准备的语句来防止任何用户输入的SQL注入,并且在输出之前使用htmlspecialchars进行转义。我的问题是:如何保护我的数据库用户名和密码?我不知道是否有人可以查看我的PHP文件的源代码,但如果他们可以,我只能想象我会被欺骗。我该怎么办?好的,这需要澄清一下。有些人建议将敏感数据放在文档根目录之外。这有一些优点,但在实用性上比其他任何东西都更具安慰性 你必须考虑潜在的问题来源。
- 无论您将数据库连接信息放在何处,具有计算机外壳访问权限的人都会破坏您的数据库连接信息。这可能包括授权用户和利用漏洞获取shell访问权限的用户(这种情况经常发生)
- 如果PHP被禁用,或者Web服务器被愚弄到认为是,那么PHP文件可能是以原始形式提供的。将它们放在文档根目录之外将保护您不受此影响
- 如果有人设法在文档根目录中编写了一个PHP脚本,它基本上与具有shell访问权限的人相同,因此没有任何措施可以保护您
数据库的主要安全点是确保来自互联网的人不能直接连接。这可以通过防火墙、将数据库绑定到专用IP地址或将数据库放在专用服务器上来实现。您可以采取一些预防措施。创建一个特定于您的应用程序所需功能的mySQL用户。这可以限制攻击者在泄露您的用户名和密码时所能造成的伤害。例如,允许用户插入、更新、选择等,但不允许删除等。此外,正如cletus提到的,外部不应访问数据库。在共享主机环境中,这通常意味着数据库只能从您的www服务器或本地主机连接到
回复:kalpaitch,不要用可逆散列法传递密码。人们永远不应该看到您的源代码。您应该将数据库凭据放在文档根目录之外的文件中,这样,如果出现了问题,并且您的PHP未经解析就显示给用户,那么没有人能够看到您的密码 看看: 解决办法很简单。将所有敏感数据放在web服务器的文档根目录之外。许多专家现在主张将大部分(如果不是全部的话)php代码放在web服务器的文档根目录之外。由于PHP不受web服务器的限制,因此您可以在与文档根相同的级别上创建一个目录,并将所有敏感数据和代码放在该目录中
所以我不是粗心/不安全地这样编码我的数据库连接吗?@Cortopasta不,你所做的是相当标准的。如果你控制主机,这是有效的,但不是在共享主机中。如果您的web服务器设置正确,您能否给出一个示例,说明您的源代码在webroot中受到破坏的情况?而且你没有以愚蠢的方式存储你的包含内容(.inc或任何其他呈现为文本的内容)。@Josh-如果是共享托管,那么你就无法确保你的web服务器设置正确(或继续设置)。这是一个悖论,因为你在共享托管上通常无法访问webroot之外的内容。更多情况下,人们会意外地暴露他们的svn树(在这种情况下,无论哪种方式,您都会受到影响)。在内容类型方面,任何将apache配置搞得一团糟的人都不应该接近conf文件。我还认为,任何可以访问您的源代码的人都可能也可以访问机器,如果是这样,他们无论如何都可以从webroot之外读取文件。还要确保采取其他预防措施(例如mysql用户、散列和盐析数据库中的敏感数据)。我不会雇佣一个不知道这一点的PHP开发人员。你是说我应该把它放在一个单独的PHP文件中,并包含在页面的文件中?或者完全不同的东西?@Cortopasta:没错,但是文件必须在文档根目录之外。严格来说,您不必包含它:您可以将其作为配置文件读取,但传统上它只是另一个PHP文件。如何在服务器根目录之外添加文件?您都建议将凭据存储在wwwroot之外。好的,我了解安全背景。但是它应该如何存储在版本控制中(示例配置)?通常,wwwroot是git回购的根,因此,如果有任何外部内容,它将位于VC之外。想象一下,新开发人员试图为开发建立一个本地实例——他应该如何知道“将这个文件复制到外部并填充”这样的魔力?你完全可以质疑这一点。Skilldrick的答案是正确的——将敏感数据放在文档根目录之外的文件中。这实际上是我在招聘f时问应聘者的一个问题