如何确保数据库连接安全?

时间:2010-02-27 00:48:33

标签: php mysql database security pdo

我目前正在为我教会的大学团队建立一个网站,我开始对我正在撰写的内容的安全性感到担忧。例如,我使用这个函数:

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);
    }
  }

每当我进行某种查询时连接到数据库。我总是使用PDO预处理语句来阻止任何用户输入的SQL注入,并且我在输出之前使用htmlspecialchars来转义。我的问题是:如何保护我的数据库的用户名和密码?我不知道是否有人可以查看我的PHP文件的来源,但如果可以,我只能想象我会被冲洗。我该怎么办?

3 个答案:

答案 0 :(得分:10)

您应该将数据库凭据放在文档根目录之外的文件中,因此如果某些内容混乱并且您的PHP显示给未解析的用户,则任何人都无法看到您的密码。

查看 this article on the subject this article on the subject

  

解决方案很简单。将所有敏感数据放在Web服务器的文档根目录之外。许多专家现在主张将大部分(如果不是全部)PHP代码放在Web服务器的文档根目录之外。由于PHP不受Web服务器相同的限制,您可以在与文档根目录相同的级别创建目录,并将所有敏感数据和代码放在那里。

答案 1 :(得分:8)

好的,这需要一些澄清。有人建议您将敏感数据放在文档根目录之外。这具有一些的优点,但在实用性方面比其他任何东西都更安慰。

你必须考虑潜在的问题来源。

  • 无论您将数据库连接放在何处,都拥有对计算机进行shell访问的人都会损害您的数据库连接信息。这可以包括授权用户和利用漏洞获取shell访问权限的用户(这已经发生了很多);

  • 如果PHP被禁用或者Web服务器被认为存在PHP文件以原始形式提供的可能性。将它们放在文档根目录之外可以防止这种情况发生;

  • 如果有人以某种方式设法将PHP脚本写入文档根目录,那么它与拥有shell访问权限的人基本相同,因此没有任何措施可以保护您。

实际上,如果您的Web服务器遭到入侵,那么您的配置文件在文档根目录之外的情况将保护您的可能性很小。

数据库的安全要点是确保来自互联网的人无法直接连接。这可以通过防火墙完成,将数据库绑定到专用IP地址或将数据库放在私有服务器上。

答案 2 :(得分:3)

您可以采取预防措施。创建一个特定于您的应用程序需要能够执行的mySQL用户。这可以限制攻击者在用户名和密码泄露时可以造成的破坏程度。例如,允许用户插入,更新,选择等,但不要丢弃等。此外,正如提到的那样,外部不应该访问数据库。在共享托管环境中,这通常意味着只能从您的www服务器或localhost连接到数据库。

Re:kalpaitch,不要在一些可逆散列中传递你的密码。人们永远不应该看到你的来源。