問題描述

在 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。