存储数据库凭据 — PDO 的最佳实践

3

我正在寻找一个有关使用PDO存储数据库凭据的最佳实践。 我的数据库存储在GoDaddy上,可能有几百个用户。 最近,我从使用mysql_*转换到了PDO,经过了大量的搜索后,我得出结论,没有清晰、简明的方法存在。 目前,我使用一个config.inc文件,将凭据存储为;

<?php
$strHostName = “10.10.10.10”; 
$strDbName = “dbname”;
$strUserName = “dbuser”;  
$strPassword = “xxx***xxx”;
?>

我在代码中执行以下操作:
<?
….stufff
require_once(‘config.inc’);

$db_found = new PDO("mysql:host=$strHostName;dbname=$strDbName;charset=utf8", $strUserName,     $strPassword, array(PDO::ATTR_EMULATE_PREPARES => false, 
              PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
…lots more stuff
?>

这个方法可以正常运行,但我担心config.inc文件的安全性。有没有更好的方法来处理这个问题?

谢谢...


它的“安全性”有什么问题? - zerkms
安全没有问题,除非您的 Web 服务器存在安全风险。即有人试图入侵服务器。我想到的唯一其他选项是使用常量。 - Nick Tucci
我在我的数据库配置中使用常量。 - AdRock
3个回答

2

我不太确定这个实际上是如何工作的,因为我没有尝试过,但前几天学到了这个,所以我想分享一下。

在GoDaddy中,您可以将主域名指向子目录,从而在其前面创建一个新的文档根目录,可以这么说。

例如,在根目录中创建一个名为“application”的新目录,将应用程序文件上传到那里,并将您的域名指向那里(您可能需要先删除域名,然后再使用指定的目录添加它)。 然后,您可以包括来自新文档根目录之前的文件 - 例如您的数据库凭据 - 现在对公众不可用,但对您的应用程序可用。

新结构

数据库凭证:

/home/www/html/someSite/dbCredentials.php

你的网站(主域名现在指向的地方):

/home/www/html/someSite/application/index.php

例子:

在 dbCredentials.php 文件中添加你的凭证:

<?php
$strHostName = “10.10.10.10”; 
$strDbName = “dbname”;
$strUserName = “dbuser”;  
$strPassword = “xxx***xxx”;
?>

在您的网页上,包含文件并像平常一样使用变量:
<?php
require_once ('/home/www/html/someSite/dbCredentials.php');
$db_found = new PDO("mysql:host=$strHostName..........);
?>

来源:

http://support.godaddy.com/help/article/4175/specifying-a-new-default-document-root-on-your-hosting-account?pc_split_value=4&countrysite=uk

如果您尝试了这个方法,请告诉我效果如何。

说明:本文介绍了如何在您的托管帐户上指定新的默认文档根目录。


1
请确保密码存储在一个不可读或无法从网站访问的文件中。
将密码存储在 .php 文件中被认为是安全的,因为您无法从网站上看到 .php 文件的内容(只能看到输出)。
您还可以将文件存储在 webroot 之外,这使得该文件完全无法从网站访问。
另一种解决方案是使用本机 Web 服务器忽略规则。以 . 开头的文件(如 .password)在某些 Web 服务器上是隐藏的。具体来说,Apache 隐藏所有以 .ht 开头的文件。但这取决于 Web 服务器供应商,因此请谨慎处理。
将密码存储在 config.inc 中存在意外暴露其内容的风险,当它位于 Web 可访问的文件夹中时。

您不必担心有人可以访问您的服务器并从文件中读取密码,因为您将面临更大的问题:他们已经可以访问您的服务器 :)


另外,假设GoDaddy服务器是Linux/Unix,您可以设置config.inc的权限,仅可由您的用户帐户读取。这有望防止其他服务器用户的读取。(例如,八进制表示法中的600。)在共享服务器上,您的安全性总是会受到限制。就像最薄弱的一环一样。 - contrebis

0

你也可以将密码作为环境变量放置在托管服务器上,并使用 php 应用程序中的 getenv 读取密码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接