PHP include与file_get_contents的区别

3

我一直在使用file_get_contents通过一个我分发给其他用户的WordPress插件请求文件。

无论如何,最初我的做法是检查用户是否已启用 'allow_url_fopen',如果是,则直接使用 file_get_contents。如果没有,然后我检查用户是否已启用cURL,并采取那种方式。 以下是代码:

if ( ini_get( 'allow_url_fopen' ) == 1 ) {
    $content = file_get_contents( $file );
    return $content;      
}
elseif ( function_exists( 'curl_version' ) ) {
    $curl = curl_init();
    curl_setopt( $curl, CURLOPT_URL, riva_slider_pro_dir( true ) . $file );
    curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );

    $content = curl_exec( $curl );
    curl_close( $curl );

    return $content;
}

然而,我遇到了一个问题。某个用户的主机禁止了file_get_contents函数访问文件,同时允许allow_url_fopen启用。无论是相对路径还是绝对路径都不起作用。所以我转向另一种解决方案,发现这个方法行得通:

    ob_start();
    include $file;
    $content = ob_get_contents();
    ob_end_clean();

我的问题是,这种方法可靠性如何?目前我一直在使用本地路径,例如“admin/file.css”等。

如果我决定用这个替换顶部的代码,有哪种主机设置可能会阻止它正常工作?使用这种方法无法提供检查是否出错的途径。


1
你想要达到什么目的?如果运行你的代码的PHP实例没有启用allow_url_fopen,那么你应该尊重它,不要试图绕过它。如果你的代码受此影响而无法正常运行,那么你应该简单地禁用你的代码,直到所需的配置被设置为止。 - FrozenFire
该插件尝试获取CSS文件的内容。然后修改它并创建一个新的单个CSS文件。各种CSS属性通过管理面板设置。此外,被访问的文件都在插件本身所在的同一目录中。样式应用于jQuery幻灯片。没有样式,它将无法正常工作。 - Matthew Ruddy
不应该尝试通过HTTP获取存储在应用程序树中的文件。它是本地可用的,因此allow_url_fopen无关紧要。通过使用HTTP获取文件内容,您会增加大量开销,并使整个过程容易出错。 - FrozenFire
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/6490/discussion-between-frozenfire-and-matthew-ruddy - FrozenFire
禁止使用 file_get_contents 的主机应该被放弃。这是一个愚蠢的限制。 - ceejayoz
显示剩余3条评论
1个回答

2

你的include方法可靠性会大打折扣。禁用file_get_contents是罕见的,而你隐式依赖的allow_url_include默认是关闭的。

这也极其不安全。如果你的Web服务器被黑客攻击并且有人修改了你的插件加载的文件之一以在输出中包含PHP代码,那么安装了你的插件的所有人都将开始运行该代码。这将非常糟糕。


好的。您知道还有其他方法可以解决吗?我被这个特定的用户卡住了。他的主机回复了他们发给他的电子邮件,说如果我在本地尝试它,file_get_contents将起作用。我不太确定他们的意思是什么,因为将本地路径放入file_get_contents不会起作用(无论如何,在我的离线设置中使用Mac上的MAMP)。 - Matthew Ruddy
我建议在使用file_get_contents方法之前尝试使用curl方法。如果启用了curl,那么它很可能可以用于下载内容。(否则它将完全无用!) - user149341

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接