手册:保护数据库密码

This page is a translated version of the page Manual:Securing database passwords and the translation is 100% complete.

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 包含用户名和密码。 它可以用同样的方式保护