使用wp_FileSystem的便捷方式

时间:2014-08-13 作者:Borek Bernard

我想使用$wp_filesystem 这似乎是WordPress中操作文件系统对象的推荐方法,但请比较:

plain PHP code:

mkdir(\'abc\');
WP Filesystem API code:

$url = wp_nonce_url(\'plugins.php\');
if (false === ($creds = request_filesystem_credentials($url, \'\', false, false, null) ) ) {
    echo "Could not create filesystem credentials";
    return;
}

if ( ! WP_Filesystem($creds) ) {
    request_filesystem_credentials($url, \'\', true, false, null);
    echo "Filesystem credentials were not available";
    return;
}

$wp_filesystem->mkdir(\'abc\', true);
这有点笨拙,也许我弄错了什么,但是有没有更方便的方法来执行$wp_filesystem? 我试图省略凭据代码,但在这种情况下,filesystem命令不起作用。

1 个回复
最合适的回答,由SO网友:Otto 整理而成

不,没有比这更方便的方法了。

问题是,您的第一个示例在最常见的托管系统上是不安全的,因为该目录将由运行Web服务器本身的任何用户“拥有”。因此,任何其他能够在同一Web服务器上执行代码的人都可以访问、写入、更改其中的文件,等等。

必须提供凭据,以确保文件由正确的人拥有,防止同一服务器上的其他人访问这些文件。

其他信息,因为评论似乎需要它:

在“标准”共享托管配置上,甚至在某些VPS托管系统上,Web服务器运行的用户与实际拥有文件的用户不同。因此,我的WordPress安装文件可能属于“otto”,但Web服务器可能在“apache”帐户下运行。

这意味着当WordPress代码运行时,它通常以“apache”用户的身份运行。它创建的任何文件也将归“apache”所有,而不是归“otto”所有。此外,“apache”帐户必然受到限制。它可能根本没有能力在我的web目录中写入文件,也可能没有能力将文件更改为正确的“otto”用户所拥有。这都是出于安全原因,它不应该具有这些能力。

WP\\u文件系统检测到这种情况,然后将向用户显示一个表单,请求FTP凭据。这就是request_filesystem_credentials 调用实际上是这样做的:它执行该测试,然后在必要时为用户生成一个表单。用户输入他们的信息,并在下次提交时使用这些信息request_filesystem_credentials 呼叫可以检查它是否可以通过FTP连接回自身(环回,sorta)。

请看,当我通过FTP创建文件时,我以我的身份连接,因此生成的文件归“otto”所有。使用这种机制,WP\\u文件系统可以以正确的用户身份创建文件,即使它是以“apache”运行的。因此,这些凭据是必要的,是的,您必须向用户索取这些凭据。简单地使用普通PHP方法创建文件和目录可能会导致安全问题,尤其是在共享主机上。

在共享主机上,其他人在同一台计算机上拥有帐户。他们使用相同的Web服务器进程运行代码。该代码也以“apache”的形式运行。因此,如果我有“apache”拥有的目录和文件,那么其他人可以将其代码作为“apache”运行并修改我的文件。这是个问题。文件归我所有而不是“apache”可以防止这种情况的发生。

现在,在一些最常见的共享主机系统上,您会发现request_filesystem_credentials call实际上不会弹出表单。相反,它只返回true,WP\\u文件系统代码继续运行。当主机系统使用称为“setuid”或“suphp”的配置运行时,就会发生这种情况。

在setuid配置中,webserver以“apache”或其他任何形式运行,但它为处理请求而生成的PHP进程将其自己的用户/所有者设置为与最初运行的PHP文件的所有者相同。因此,当php进程运行并加载初始WordPress索引时。php文件(或任何文件),它会看到该文件由“otto”所有,因此它会将自己的用户帐户设置为“otto”,用于特定的运行。

许多共享主机提供商都会进行这种配置,因为在这种情况下,它实际上更安全。如果php进程作为用户帐户运行,那么它就不再是“apache”,无法访问其他人帐户中的文件。它只能访问其应有访问权限的帐户的文件。作为一个很好的副作用,这意味着request_filesystem_credentials 调用执行其测试并发现a)是的,它可以写入文件;b)这些文件将由正确的用户拥有,因为进程的用户现在设置为与文件的所有者相同。在这种情况下,使用“直接”模式,request_filesystem_credentials 返回true,并且不会向用户显示FTP凭据的表单。

请注意,像这样的setuid方法在非共享托管帐户上实际上不太安全。当只有一个web用户时,就不需要使用setuid来保护同一服务器上的其他web用户。因此,在VPS托管和类似的情况下,这种设置并不常见,需要FTP凭据是很常见的。这更安全,因为即使攻击者可以使系统执行代码,他们也可能无法让代码修改任何文件,因为它没有以正确的进程运行。

安全性很复杂。WP\\u文件系统从根本上来说是一个安全问题,如果需要在安装过程中操作文件,应该使用它。是的,有时这意味着您需要显示凭证表单。我建议您应对它,因为其他任何东西都是潜在的安全风险,您不应该仅仅因为它有点令人不快就将其消除。

结束

相关推荐

$wp_FILESYSTEM返回空。依赖关系是什么?

我需要获取对$wp\\u filesystem对象的引用。在下面的测试中,var\\u dump($wp\\u filesystem)返回NULL。要正确设置$wp\\U文件系统,还需要哪些其他文件?我一直在期待,因为它在文件中调用。php,加载该文件就足以加载该对象。<?php require(\'../../../wp-blog-header.php\'); require(\'../../../wp-admin/includes/file.php\'); $m