将wp-config移出Web根目录真的有好处吗?

时间:2012-07-13 作者:Ian Dunn

如今最常见的安全最佳实践之一似乎是moving wp-config.php one directory higher than the vhost\'s document root. 我从来没有找到一个很好的解释,但我假设这是为了最大限度地降低webroot中读取数据库密码的恶意或受感染脚本的风险。

但是,您仍然必须让WordPress访问它,因此您需要扩展open_basedir 将目录包含在文档根目录上方。这不正是违背了整个目的,而且还可能将服务器日志、备份等暴露给攻击者吗?

或者这种技术只是为了防止wp-config.php 将以纯文本形式显示给任何请求http://example.com/wp-config.php, 而不是被PHP引擎解析?这似乎是一种非常罕见的情况,它不会超过向HTTP请求公开日志/备份等的缺点。

也许在某些托管设置中可以将其移到文档根目录之外,而不暴露其他文件,但在其他设置中则不行?

<小时>Conclusion: 在这个问题上反复讨论之后,出现了两个我认为应该被视为权威的答案。亚伦·亚当斯在favor of moving wp config和chrisguitarguycase against it. 如果你是新手,不想阅读全部内容,那么你应该阅读这两个答案。其他答案要么是多余的,要么是不准确的。

10 个回复
最合适的回答,由SO网友:Aaron Adams 整理而成

简短回答:是,这个问题的答案是yes 如果不这么说probably irresponsible.

详细回答:一个真实的示例请允许我提供一个非常真实的示例,从我非常真实的服务器wp-config.php 在web根目录之外specifically prevented its contents from being captured.

缺陷:

看看对Plesk中缺陷的描述(在11.0.9 MU#27中修复):

Plesk resets subdomain forwarding after syncing subscription with hosting plan (117199)

听起来无害,对吧?

好吧,我是这样触发这个bug的:

设置一个子域以重定向到另一个URL(例如。site.staging.server.comsite-staging.ssl.server.com).~/httpdocs/, 没有活动的解释器(如PHP)。

我没有注意到。持续数周。

结果:

  • wp-config.php 在web根目录中,请求/wp-config.php 将下载WordPress配置文件
  • wp-config.php 在web根目录之外,请求/wp-config.php 下载了一个完全无害的文件。真实的wp-config.php 无法下载文件wp-config.php 在web之外根目录可以有bona fide security benefits in the real world.

    如何移动wp-config.php WordPress将自动在WordPress安装上方的一个目录中查找您的wp-config.php 文件,所以如果你把它移到了那里,就完成了!

    但是如果你把它移到了别的地方呢?容易的新建wp-config.php 在WordPress目录中,使用以下代码:

    <?php
    
    /** Absolute path to the WordPress directory. */
    if ( !defined(\'ABSPATH\') )
        define(\'ABSPATH\', dirname(__FILE__) . \'/\');
    
    /** Location of your WordPress configuration. */
    require_once(ABSPATH . \'../phpdocs/wp-config.php\');
    
    (请确保将上述路径更改为重新定位的wp-config.php 文件。)

    如果你遇到问题open_basedir, 只需将新路径添加到open_basedir PHP配置中的指令:

    open_basedir = "/var/www/vhosts/example.com/httpdocs/;/var/www/vhosts/example.com/phpdocs/;/tmp/"
    
    就是这样!

    提出相反的论点每个反对搬家的论点wp-config.php 网络之外的根源似乎取决于错误的假设。

    论点1:如果PHP被禁用,它们已经是人们看到[wp-config.php] 如果他们绕过你的服务器PHP解释器……如果发生这种情况,你已经有麻烦了:他们可以直接访问你的服务器。

    FALSE: 我上面描述的场景是错误配置的结果,而不是入侵。

    论点2:意外禁用PHP的情况很少见,因此无关紧要。如果攻击者有足够的权限更改PHP处理程序,那么你就已经完蛋了。根据我的经验,意外更改非常罕见,在这种情况下,更改密码很容易。

    FALSE: 我上面描述的场景是服务器软件的一个常见部分中的一个bug导致的,它影响了一个常见的服务器配置。这绝非“罕见”(此外,安全意味着担心罕见的情况)。

    如果在入侵过程中发现了敏感信息,那么在入侵后更改密码几乎没有帮助。真的,我们是否仍然认为WordPress只用于非正式博客,而攻击者只对诽谤感兴趣?让我们担心保护我们的服务器,而不仅仅是在有人进入后恢复它。

    论点3:拒绝访问wp-config.php 足够好了,您可以通过虚拟主机配置或.htaccess – 有效地限制外部对文件的访问,就像移动到文档根目录之外一样。

    FALSE: 假设您的虚拟主机服务器默认值为:无PHP,无.htaccess, allow from all (在生产环境中几乎不常见)。如果您的配置在例行操作(例如,面板更新)期间以某种方式重置,那么所有内容都将恢复到其默认状态,您就暴露了。

    If your security model fails when settings are accidentally reset to defaults, you probably need more security.

    为什么有人会特别推荐更少的安全层?昂贵的汽车不仅有锁;它们还配有警报器、防盗锁止器和GPS跟踪器。如果有什么东西值得保护,那就把它做好。

    论点4:未经授权访问wp-config.php 没什么大不了的,数据库信息实际上是[wp-config.php].

    FALSE: 身份验证密钥和SALT可用于任何数量的潜在劫持攻击。

    即使数据库凭据是wp-config.php, 你应该害怕攻击者抓住他们。

    参数5:移动wp-config.php 在web之外,根目录实际上会降低服务器的安全性,您仍然需要让WordPress访问[wp-config.php], 所以你需要扩展open_basedir 将目录包含在文档根目录上方。

    FALSE: 假设wp-config.php 在中httpdocs/, 把它移到../phpdocs/, 和设置open_basedir 仅包括httpdocs/phpdocs/. 例如:

    open_basedir = "/var/www/vhosts/example.com/httpdocs/;/var/www/vhosts/example.com/phpdocs/;/tmp/"
    
    (请记住始终包括/tmp/, 或您的用户tmp/ 目录,如果有。)

    结论:配置文件应始终位于web根目录之外如果您关心安全性,则应移动wp-config.php 在你的网络根之外。

SO网友:chrisguitarguy

最重要的是wp-config.php 包含一些敏感信息:数据库用户名/密码等。

因此,我们的想法是:将其移到文档根目录之外,就不必担心任何事情。攻击者将永远无法从外部源访问该文件。

然而,问题是:wp-config.php 从不在屏幕上打印任何内容。它只定义在整个WP安装过程中使用的各种常量。因此,人们看到该文件内容的唯一方法是绕过您的服务器PHP解释器.php 要渲染为纯文本的文件。如果发生这种情况,您已经有麻烦了:他们可以直接访问您的服务器(可能还有root权限),并且可以做任何他们喜欢的事情。

我要继续说there\'s no benefit to moving wp-config outside the document root from a security perspective -- 出于上述原因以及以下原因:

您可以通过虚拟主机配置或限制对文件的访问。htaccess--有效地限制外部对文件的访问,就像将文件移到文档根目录之外一样,您可以确保文件权限对wp-config 防止任何没有足够权限的用户读取文件,即使他们通过SSH获得(有限的)服务器访问权限wp-config.php 文件属于。更重要的是,该数据库用户只有读写该WP安装的数据库的权限,没有其他权限——没有权限授予其他用户权限。也就是说,如果攻击者能够访问您的数据库,那么只需从备份中恢复(请参见第4点)并更改您经常备份的数据库用户即可。通常是一个相对的术语:如果你每天发布20篇文章,你最好每天或每隔几天备份一次。如果您每周发布一次,那么每周备份一次就足够了like this), 这意味着即使攻击者获得了访问权限,您也可以轻松地检测到代码更改并将其回滚。如果攻击者有权访问wp-config, 他们可能还搞砸了别的事情wp-config, 因为你很小心(见第3点和第4点),所以这不是什么大不了的事。盐等可以随时更换。唯一发生的事情是,它使登录用户的cookie无效给我,移动wp-config 在文件中,root隐晦地散发着安全的气息——这在很大程度上是一个稻草人。

SO网友:its_me

我认为马克斯的答案很有见识,这是故事的一个方面。这个WordPress Codex has more advise:

此外,请确保只有您(和web服务器)可以读取此文件(通常指400或440权限)。

如果将服务器与一起使用。htaccess,您可以将此文件放在该文件(最顶部)中,以拒绝任何为其冲浪的人的访问:

<files wp-config.php>
order allow,deny
deny from all
</files>
请注意,在wp config上设置400或440权限。php可能会阻止插件写入或修改它。例如,真正的情况是缓存插件(W3 Total Cache、WP Super Cache等)。在这种情况下,我会选择600(中文件的默认权限/home/user 目录)。

SO网友:Sucuri

有人请我们加入,我会在这里回答。

是的,隔离您的wp配置有安全好处。从您站点的根目录。

1-如果您的PHP处理程序以某种方式被破坏或修改,您的DB信息将不会公开。是的,在服务器更新期间,我在共享主机上看到过几次这种情况。是的,在此期间网站将被破坏,但您的密码将保持不变。

2-最佳实践始终建议将配置文件与数据文件隔离。是的,使用WordPress(或任何web应用程序)很难做到这一点,但将其向上移动会带来一些隔离。

3-还记得PHP-CGI漏洞吗-,并查看源。http://www.kb.cert.org/vuls/id/520827

最后,这些都是小细节,但它们确实有助于将风险降至最低。特别是在共享环境中,任何人都可以访问您的数据库(他们只需要一个用户/通行证)。

但不要让小干扰(过早优化)影响到网站的安全:

1-始终保持更新

2-使用强密码

3-限制访问(通过权限)。我们在这里有一篇关于它的帖子:

http://blog.sucuri.net/2012/08/wordpress-security-cutting-through-the-bs.html

谢谢

SO网友:Max Yudin

当然是的。

移动wp config时。php在公共目录之外,当php处理程序恶意(或意外)访问时,您可以使用浏览器保护它不被读取已更改。

当服务器几乎没有因为lame管理员的错误而受到感染时,可以读取您的DB登录名/密码。向管理员收取罚款,并获得更好的管理和更可靠的服务器主机。虽然那可能更贵。

SO网友:Michael

为了便于讨论,我只想澄清一下,移动wp\\u配置。php文件并不一定意味着只需将其移动到父目录。假设您有一个类似于/root/html的结构,其中html包含WP安装和所有html内容。而不是移动wp\\u config。php到/root,您可以将其移动到/root/secure之类的位置。。。它位于html目录之外,也不在服务器根目录中。当然,您需要确保php也可以在这个安全文件夹中运行。

因为WP不能配置为查找WP\\U配置。php在/root/secure这样的同级文件夹中,您必须采取额外的步骤。我离开了wp\\U配置。php,并删除敏感部分(数据库登录、salt、表前缀),将它们移动到一个名为config的单独文件中。php。然后添加PHPinclude wp\\u配置的命令。php,如下所示:include(\'/home/content/path/to/root/secure/config.php\');

这基本上就是我在设置中所做的。现在,基于上述讨论,我仍在评估这是否必要,甚至是一个好主意。但我只想补充一点,上面的配置是可能的。它不会公开您的备份和其他根文件,只要安全文件夹没有使用自己的公共URL设置,它就不可浏览。

此外,您可以通过创建来限制对安全文件夹的访问。其中的htaccess文件包含:

order deny,allow
deny from all
allow from 127.0.0.1

SO网友:Ralf912

有很多写得不好的主题和插件允许atatckers注入代码(记住Timthumb的安全问题)。如果我是一个攻击者,为什么要搜索wp配置。php?只需插入以下代码:

var_dump( DB_NAME, DB_USER, DB_PASSWORD );
您可以尝试隐藏wp配置。php。只要WordPress能够全局访问所有敏感信息,隐藏wp配置就没有任何好处。php。

wp配置中的错误部分。php并不是因为它保存敏感数据。糟糕的部分是将敏感数据定义为全局可访问常量。

Update

我想澄清一下define() 以及为什么将敏感数据定义为全局常量是个坏主意。

有很多方法可以攻击网站。脚本注入是访问网站的唯一方法。

假设服务器存在允许攻击者访问内存转储的漏洞。攻击者将在内存转储中找到所有变量的所有值。如果定义了一个全局可访问常量,它必须保留在内存中,直到脚本结束。创建变量而不是常量,垃圾收集器很有可能在不再需要变量后覆盖(或释放)内存。

保护敏感数据的更好方法是在使用后立即将其删除:

$db_con = new stdClass();
$db_con->db_user = \'username\';
$db_con->password = \'password\';
$db_con->host = \'localhost\';

$db_handler = new Database_Handler( $db_con );

$db_con = null;
使用敏感数据后,分配给null 将覆盖内存中的数据。攻击者必须在$db_con 包含敏感数据。在上面的示例中,这是一个非常短的时间(如果类Database\\u处理程序不保存它的副本)。

SO网友:MikeMoy

很抱歉撞到一个旧帖子,但这不是一个显而易见的解决方案吗。我们知道移动wp配置有一些安全好处。wordpress路由目录中的php文件。有些人会辩称,好处微乎其微,而其他人则不会。

另一方面,将文件移出其默认位置可能存在一些缺点,例如破坏一些没有功能来查找wp配置的插件。php文件位于其他位置。

对我来说最明显的事情就是创建一个秘密信息。wordpress路由目录之外的php文件,其中包含所有用户名和密码的变量,即。

$userName = "user";

$databasePassword = "12345";

保持wp配置。在默认wordpress路由目录中的php文件中,从wp配置中删除用户名和密码值。php,但别管其他内容。然后只需通过要求机密信息引用$userName和$databasePassword变量即可。wp配置中的php。php,即。

require(\'PATH-TO-FILE/secret-info.php\');

这似乎是显而易见的事情,我是否遗漏了什么?

SO网友:Emyr Thomas

除了安全方面的好处外,它还允许您在版本控制下保持WordPress实例,同时将核心WordPress文件作为子模块/外部模块。这就是马克·贾奎斯如何设置他的WordPress框架项目。看见https://github.com/markjaquith/WordPress-Skeleton#assumptions 有关详细信息。

SO网友:Mark Kaplun

万古长青之后,wordpress仍将wp-config.php 默认情况下,在其根目录中,无需添加即可访问web。htaccess规则以阻止访问它。所有具有一键wordpress安装的共享主机都很可能执行相同的操作。其结果是,大多数wordpress网站都是这样配置的,我相信我从来没有听到过有人说;我的网站被黑客攻击,因为wp配置。php位于根目录中;。

要使用文件中包含的信息,您需要访问DB服务器,可能需要向某个应用程序服务器添加脚本,如果您运行VPS,这意味着如果攻击者有这样的能力,它就是;游戏结束“;在任何情况下,对于您来说,在共享主机上,他们可能会根据用户隔离对DB的访问,因此即使在这种设置下,也不是一件小事。

其结果是wordpress 5.2+健康信息不会给出移动文件的建议,而且从未听说过有安全插件会这样做。

因此,长期的实际信息表明,理论上这样做更好,但它主要是一个安全剧场。

搬家的真正问题wp-config.php 对于上面的一个目录来说,它从根本上防止其他wordpress安装在与第一个相同的目录中,这是许多人都会做的事情。解决的办法是wp-config.php 在默认位置,但添加从位于web根目录之外的不同文件加载实际配置的代码,该文件的命名方式可能不是通用的,而是特定于站点的。

问题是,许多wordpress toturials甚至没有提到wp-config.php 在另一个地方,在你之后的人将有一个WTF时刻,试图弄清楚如何按照要求他们添加definewp-config.php 文件

结束

相关推荐

Wp-config.php的“最佳实践”是什么

刚开始阅读专业WordPress®:设计与开发我正在读\"Advanced wp-config Options\".我看到了很多我认为很酷/有用的选项,但在我go crazy 使用“高级wp配置选项”,我想inquire about \"Best Practices\" 来自这个地区的老兵。我还是个傻瓜,一点知识是一件“危险的事”例如,书籍说明:要设置WordPress地址和博客地址,请使用以下两个选项:定义(\'WP\\U SITEURL\',\'http://example.com/wordpress