Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使数据库连接安全?_Php_Mysql_Database_Security_Pdo - Fatal编程技术网

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访问权限的人相同,因此没有任何措施可以保护您

实际上,如果您的Web服务器遭到破坏,那么您的配置文件位于文档根目录之外的情况将不太可能保护您


数据库的主要安全点是确保来自互联网的人不能直接连接。这可以通过防火墙、将数据库绑定到专用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时问应聘者的一个问题