問題描述

在 Twitter 討論之後,似乎 wordpress.org 有能力將插件的安全更新推送到沒有 opt-in 的站點來接收自動插件更新。任何人都可以解釋它的理性,我該如何阻止這種更新?

另一方面,這個功能是否受”magic” 限制到 wordpress.org,或者我可以使用相同的機制來更新從我自己的服務器分發的插件和主題,同時仍然符合 wordpress 內核的一般更新過程和規則 (顯然在我的代碼中,我可以繞過所有內容來觸發更新,問題是如何通過設置常量或各種與更新相關的過濾器的使用來表達最佳用户期望。

最佳解決方案

回答第一個問題…

如果您在 wp-admin /includes /class-wp-upgrader.php 中找到的 WP_Automatic_Updater 類中查看,我們注意方法 is_disabled,由方法 should_update 用於確定是否允許自動更新。

在以下條件下,is_disabled 方法將返回 true,

  • 如果定義了 DISALLOW_FILE_MODS 常數,並且是 true

  • 如果定義 WP_INSTALLING 常數,而不考慮值狀態

  • 如果 AUTOMATIC_UPDATER_DISABLED 常數定義為 true

請注意,後一個常數 AUTOMATIC_UPDATER_DISABLED 也與過濾器 automatic_updater_disabled 相關聯,因此即使定義了該值,也可以在其他地方過濾該值,在這種情況下,您最好通過聲明以下鈎來進行服務:

add_filter( 'automatic_updater_disabled', '__return_true' );

以下是 WP_Automatic_Updater 類的摘錄方法:

wp-admin/includes/class-wp-upgrader.php:1730

/**
 * Whether the entire automatic updater is disabled.
 *
 * @since 3.7.0
 */
public function is_disabled() {
    // Background updates are disabled if you don't want file changes.
    if ( defined( 'DISALLOW_FILE_MODS' ) && DISALLOW_FILE_MODS )
        return true;

    if ( defined( 'WP_INSTALLING' ) )
        return true;

    // More fine grained control can be done through the WP_AUTO_UPDATE_CORE constant and filters.
    $disabled = defined( 'AUTOMATIC_UPDATER_DISABLED' ) && AUTOMATIC_UPDATER_DISABLED;

    /**
     * Filter whether to entirely disable background updates.
     *
     * There are more fine-grained filters and controls for selective disabling.
     * This filter parallels the AUTOMATIC_UPDATER_DISABLED constant in name.
     *
     * This also disables update notification emails. That may change in the future.
     *
     * @since 3.7.0
     *
     * @param bool $disabled Whether the updater should be disabled.
     */
    return apply_filters( 'automatic_updater_disabled', $disabled );
}

我會進一步建議閲讀以下鏈接:

配置自動背景更新

http://codex.wordpress.org/Configuring_Automatic_Background_Updates

… 詳細提供了可用的常量和過濾器的列表,用於細粒度控制要禁用更新的組件。

對於僅禁用自動插件更新的情況,您有:

add_filter( 'auto_update_plugin', '__return_false' );

… 等等。

回答你的第二個問題

(有人對我錯,如果我錯了)

我們為讀者添加一些上下文,這個整個問題是這個 twitter status 的結果,這本身就是對強力自動更新 Yoast 的 WP SEO 插件的一個回應,請參閲以下 https://yoast.com/wordpress-seo-security-release/,以獲取更多信息。

wp-includes/update.php 中有一個名為 wp_maybe_auto_update 的函數,該函數在同一個文件中包含的 wp_version_check 函數中從 do_action('wp_maybe_auto_update')函數中引發的名稱為 do_action('wp_maybe_auto_update')的鈎子,該函數本身是每天運行兩次的計劃事件。

所以,我懷疑 WordPress.org 的做法是,他們內部增加了 WordPress 的版本,這樣自動更新將被強制用户使用,因為與安卓 WP SEO 插件有關的安全漏洞的嚴重程度。

對於 quote 他自己:

Because of the severity of the issue, the WordPress.org team put out a forced automatic update (thanks!)

我不是 100%肯定這是否實際上也自動更新任何其他插件在 WordPress.org 存儲庫中有新版本,或者 WordPress.org 是否可以指定哪些插件可能是從他們的結尾可以是 auto-updated,也許有些東西在代碼也允許這種類型的自由裁量權。

至於您是否可以自己使用相同的機制,那麼對於您在 WordPress.org 資源庫中託管的插件,是的,對於官方存儲庫之外的用户,我並不完全確定,但您可以實例化 WP_Automatic_Updater 類,並提供一個上下文來檢查,但我認為最終我們最終會在 wp-includes /update.php 中的功能稱為 wp_update_plugins,它檢查官方的 WordPress 存儲庫 API 。

我可能不正確,如果有人有進一步的東西添加,請進來。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。