您将 PHP 脚本配置(如数据库访问数据)存储在哪里?
Posted
技术标签:
【中文标题】您将 PHP 脚本配置(如数据库访问数据)存储在哪里?【英文标题】:Where do you store your PHP script configurations like DB access data? 【发布时间】:2009-12-27 12:22:44 【问题描述】:我有一个 config.php 文件,我只是在其中创建了一个包含所有框架配置的巨大数组。还有数据库源字符串,如“mysql:host=localhost;dbname=mydb”(什么叫,顺便说一句?)和数据库的用户名+密码。恐怕这是:
-
愚蠢的
不好;那里有更好的解决方案
不安全 (?)
那么 PHP 专家是如何做到这一点的呢?
【问题讨论】:
我会说它被称为 DSN。 en.wikipedia.org/wiki/Database_Source_Name “连接字符串”比 DSN 更通用一点。 不要称它为“config.php”,它是某些恶意软件会寻找的名字。称它为hey-this-is-just-a-useless-file-i-swear-man.php
或类似的东西;)
另见:***.com/questions/1650629/…
【参考方案1】:
如果您有一个www
、httpdocs
或public_http
文件夹或类似的文件夹,而您的php 应用程序就在其中,那么最好将配置文件放在该文件夹之外,然后访问它像这样:
include "../config.php";
没有 FTP 访问权限,任何人都无法访问该文件,因此与将其放在应用程序文件夹中相比,它相对安全。
如果您没有这样的文件夹,您可以创建一个,并在根目录中创建一个 .htaccess 文件,它将所有请求重定向到该文件夹。有很多不同的方法可以做到这一点,但这是一个不同的问题。
【讨论】:
不幸的是,几乎 99,99% 的廉价虚拟主机不提供任何此类目录。根目录中的所有内容都可以访问,并且无法通过 ftp 访问 Web 根目录之上的内容。 实际上,我所拥有的大多数“廉价”主机都以某种形式提供了这样的目录。这样做也符合主办方的利益。但请参阅我的编辑选项。 @openfrog:你有一个很好的声明,你从哪里得到你的数据? 我见过的所有便宜的虚拟主机都有这个选项。【参考方案2】:我将它存储在纯文本 ini 样式的配置文件中,通常位于 web 根目录之上,以免用户访问它。在可访问的情况下,我通常有一个带有deny from all
的.htaccess 文件,以防止对其进行所有访问。
将其存储在用户可访问的 PHP 文件中应该没问题,但这并不理想。如果服务器正确处理 PHP 文件,即使人们可以访问该文件,他们也无法访问这些值,因为他们只是获得了输出(什么都没有)。这当然有问题,(见 cmets)。 使用 PHP 文件是我用过的 PHP 项目(FOSS 和商业)最常用的方法。他们中的大多数都没有将它们存储在网络根目录之上。对于任何稳定的设置,从表面上看,将配置文件存储在 Web 根目录之上几乎没有什么意义,尽管考虑到 Murphy's law 如果可以的话,这是值得的(或者使用 .htaccess或您的服务器拒绝用户访问目录的等效项)
【讨论】:
"将它存储在 PHP 文件中应该没问题。" - 除非另一个网络服务器软件更新“破坏”配置,尤其是。 .php->application/x-httpd-php 映射...再次。这曾经发生过(在更大的托管公司),突然所有 .php 文件都以文本/纯文本形式发送:-S PHP 最糟糕的一个原因 ;) 但没有真正的替代方案。所以我们可以开始混淆我们的代码,对吧? ;) 这与 PHP 本身无关,而与配置了多少服务器有关。混淆也无济于事,因为密码需要以某种可读的形式存在,才能使用它来打开连接。 @openfrog:你似乎问了很多非常基本的问题给一个似乎非常不喜欢 PHP 的人。 将 PHP 文件命名为以 .ht 开头的内容(例如 .htconfig.inc.php)也有帮助,因为 Apache 通常在其主配置文件中有一条规则,即从不提供任何已命名的文件.ht*【参考方案3】:大多数人都是这样做的,但您也可以尝试以下一些解决方案:
将配置文件保存在web文件夹外(这需要禁用PHP中的open_basedir配置)。使用 .htaccess 限制对配置文件的访问:
订单拒绝,允许 拒绝一切 位置>
使用 .ini 文件和 parse_ini_file 函数(这本身并不是真正的解决方案,但可以与其他解决方案结合使用)
【讨论】:
【参考方案4】:为什么在“config.php”中存储数据库用户名和密码不合适?据我所知,此文件中的数据不能公开显示。
例如
<?php
$DB_User = "amindzx";
$DB_Pass = "Something";
// connect to DB and so on.
?>
除非黑客可以访问您的 FTP。
【讨论】:
【参考方案5】:为什么在没有任何证券的情况下保存简单的 config.php 文件是愚蠢的?即使程序员找到了这个文件,他也无能为力,因为就像 amindzx 所说的“这个文件不能公开显示”。还是我错了?
【讨论】:
基本上不会,但是服务器的 PHP 配置可能会发生变化,这可能会导致文件变得可见。 “但是服务器的PHP配置可能会改变”,你能举个例子吗? 在某些情况下 apache 无法正常工作并将 php 文件作为纯文本提供。这没有发生在我身上,但我听说过这样的故事。 我经常看到它,他们更改了一些配置设置,或者正在处理或在崩溃后重建他们的系统,而 Apache 正在运行 没有 mod_php。大家好源代码...!!【参考方案6】:使用数据库或支付网关凭据等敏感信息,当我可以控制服务器时,我喜欢在我的 apache 虚拟主机配置中添加如下行:
SetEnv DB_USER "myuser"
SetEnv DB_PASS "mypass"
在您的 PHP 中,您可以使用 $_SERVER['DB_USER'] 访问这些。您可以使此配置文件只能由 root 读取,您永远无法对 php 在运行时访问的文件执行此操作。一个警告:确保禁用 php_info 并且不要用 print_r($_SERVER) 之类的愚蠢的东西公开这些变量。 (其中大部分是从here 转述或窃取的。)
对于非敏感配置,我喜欢做一个充满常量的类,这与您的设置类似,但我喜欢它的 OOP-ness。
class Application
const CONTACT_EMAIL = "me@mysite.com";
usage:
$contactEmail = Application::CONTACT_EMAIL;
【讨论】:
这是共享主机的最佳解决方案。【参考方案7】:我通常也将设置存储在 config.php 中,例如数据库连接设置、文件路径等。
【讨论】:
以上是关于您将 PHP 脚本配置(如数据库访问数据)存储在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
您将如何为 Twitter 等社交网站设计 AppEngine 数据存储?