问题描述

当我运行 WP_Image_Editorsave 功能,调用_save(最终调用 make_image(下文)) 时,我正在检查一些我现有的插件,用于任何不安全的文件系统访问。 WP_Image_Editor 在 WP 3.5 中发布,而 Filesystem API 已经在 WP 2.6 以外,所以我认为推理与 use-case 的具体细节有关,而不是仅仅是不符合新标准。

protected function make_image( $filename, $function, $arguments ) {
    if ( $stream = wp_is_stream( $filename ) ) {
        ob_start();
    } else {
        // The directory containing the original file may no longer exist when using a replication plugin.
        wp_mkdir_p( dirname( $filename ) );
    }

    $result = call_user_func_array( $function, $arguments );

    if ( $result && $stream ) {
        $contents = ob_get_contents();

        $fp = fopen( $filename, 'w' );

        if ( ! $fp )
            return false;

        fwrite( $fp, $contents );
        fclose( $fp );
    }

    if ( $stream ) {
        ob_end_clean();
    }

    return $result;
}

我的问题是,这是什么原因?根据奥托,directly accessing the filesystem is evil,那么在这种情况下有什么例外呢?我希望我的插件以最好的方式行事,但这使得最佳实践有点难以辨别。

最佳解决方案

直接访问文件系统的写作是恶的… 对于大多数情况下,人们实际上这样做。

如果您正在编辑图像文件,并且它是在 wp-content /uploads 目录,那么你知道,无论如何。这不是常见的情况。插件和主题通常不会这样做,因为它们不必这样做。 WordPress 有代码为他们做这个。这是完全安全的。

不,插件和主题想要编辑的东西是危险的东西。他们想用配置信息编写 PHP 文件,或者保存自定义的 CSS 文件,或者这样的东西。他们想把所有那些不安全的东西写成 world-editable 。

如果有人在同一个廉价的共享服务器上,因为我的网站决定搞砸我的图像等等,这是一个烦恼。如果他们决定搞定我的 PHP 代码或 CSS,那就是安全漏洞。直接写入恶意文件系统的问题完全取决于您正在撰写的内容以及使用的内容。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。