手册:保护数据库密码
LocalSettings.php 默认包含 MySQL 数据库用户 ID 和密码。 将这些凭据保存在 LocalSettings.php 中是有风险的,因为在极少数情况下,PHP 文件可以作为纯文本向外界公开这些凭据:
- PHP 在服务器上被禁用
- PHP 本身崩溃
- 您在该域的任何地方都有 CGI search.pl(一个常见的 CGI 搜索脚本)。漏洞描述。
如果在这些罕见的情况下你想保护你的 MySQL 用户名和密码,它们不应该是 LocalSettings.php 文件的一部分。
Webroot 之外的 MySQL 密码
永远不要将 MySQL 密码放在 Web 根目录中的文本文件中。 您可以通过以下方式避免这样做:
- 在您的网络根目录之外创建一个目录。 例如,如果您的网站位于“
/htdocs/www-wiki
”,则在您的 Web 根目录之外创建一个名为“external_includes”的目录:mkdir /external_includes
- 在您刚刚创建的目录中创建一个名为“mysql_pw.php”的文件,并将每个 mysql 用户名、密码、主机名和数据库名称的变量放在单独的行中,每个变量都设置为实际值。 例如,使用 nano 作为你的编辑器:
nano /external_includes/mysql_pw.php
- 使用实际值代替括号中的“mysql_”填充符,键入以下行:
<?php
$wgDBserver = "[mysql_host]";
$wgDBname = "[mysql_db_name]";
$wgDBuser = "[mysql_user]";
$wgDBpassword = "[mysql_password]";
// more confidential data...
?>
- 注意不要在文本后留下空格(空行)。
- 保存并关闭文件。 在 nano 中是:Ctr+O(保存)和 Ctr+X(关闭)
检查您的发行版以获取网络服务器的用户。 这有所不同,示例包括“apache”、“www-data”、“nobody”、“httpd”。 然后像这样设置密码文件的权限:
chgrp apache mysql_pw.php
(删除其他人的访问权限和网络服务器的写入权限)chmod 640 mysql_pw.php
- (对于 LocalSettings.php,可能重复 g-rxw ... )
- 确保文件所有者有
r
(或
)chmod 400 LocalSettings.php
- 编辑您的 LocalSettings.php 文件并在文件开头添加以下行:
require_once "/external_includes/mysql_pw.php"; //require_once "[FULL ABSOLUTE PATH TO mysql_pw.php]";
- 现在从 LocalSettings.php 中删除这些变量:
$wgDBserver $wgDBname $wgDBuser $wgDBpassword
这样,如果有人能够访问和显示 LocalSettings.php,他们将看到的只是一些设置,而不是您的 MySQL 数据库的密码、用户名等,并且包含该信息的真实文件对 Web 服务器是禁止访问的。 如上所述,您仍然需要确保 LocalSettings.php 对 apache 用户只读。
如果您正在进行这些更改并且由于您的 Web 服务器提供商不允许您而无法访问用户,那么,在 FTP 中,您必须为“external_includes”设置的最低权限是:
drwx--x--x
(711)。 对于文件“mysql_pw.php”,您必须设置 rw-r--r--
(644),否则您的 wiki 将无法运行。 不过,您的密码是安全的,因为包含关键信息的文件无法通过网络访问。如果你不能在你的 Web 根目录之外创建任何文件,你仍然可以通过上面的过程并在你的 Web 根目录中使用像“.htdbpasswd”而不是“mysql_pw.php”这样的文件名来获得一些保护,因为大多数网络服务器都配置为拒绝访问任何以 .ht* 开头的文件
参见
- 用于发送电子邮件的设置 $wgSMTP 包含用户名和密码。 它可以用同样的方式保护