Was ist ein "erzwungenes Plugin-Update", wie kann ich es vermeiden und für meine Plugins verwenden

7

Nach einer Twitter-Diskussion scheint wordpress.org die Möglichkeit zu haben, Sicherheitsupdates für Plugins auch auf Websites zu übertragen, die sich nicht für den Erhalt eines automatischen Plugin-Updates entschieden haben. Kann jemand das Rationale dafür erklären und wie kann ich diese Art von Updates blockieren?

Auf der anderen Seite ist diese Funktionalität durch "Magie" auf wordpress.org beschränkt, oder kann ich denselben Mechanismus verwenden, um Plugins und Themes zu aktualisieren, die von meinem eigenen Server verteilt werden, während ich den allgemeinen Aktualisierungsprozess und die Regeln von WordPress einhalte Kern (offensichtlich kann ich in meinem Code alles umgehen, um ein Update auszulösen. Die Frage ist, wie ich mich am besten an den Benutzererwartungen ausrichten kann, die durch das Einrichten von Konstanten oder die Verwendung verschiedener Update-Filter ausgedrückt werden.)

Mark Kaplun
quelle

Antworten:

8

Um die erste Frage zu beantworten ...

Wenn Sie in die in WP_Automatic_Updatergefundene Klasse schauen, wp-admin/includes/class-wp-upgrader.phpnotieren wir die Methode is_disabled, mit der die Methode should_updatebestimmt, ob eine automatische Aktualisierung zulässig ist oder nicht.

Die is_disabledMethode gibt unter den folgenden Bedingungen true zurück:

  • wenn DISALLOW_FILE_MODSkonstant definiert ist und isttrue
  • wenn WP_INSTALLINGkonstant unabhängig vom Wertzustand definiert ist
  • wenn AUTOMATIC_UPDATER_DISABLEDkonstant definiert ist alstrue

Beachten Sie jedoch, dass die letztere Konstante AUTOMATIC_UPDATER_DISABLEDauch einem Filter zugeordnet ist automatic_updater_disabled. Selbst wenn sie definiert ist, kann der Wert an anderer Stelle gefiltert werden. In diesem Fall ist es am besten, wenn Sie den folgenden Hook deklarieren:

add_filter( 'automatic_updater_disabled', '__return_true' );

Hier ist der Methodenauszug aus der WP_Automatic_UpdaterKlasse:

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 );
}

Ich würde weiterhin den folgenden Link zum Lesen vorschlagen:

Automatische Hintergrundaktualisierungen konfigurieren

http://codex.wordpress.org/Configuring_Automatic_Background_Updates

... enthält eine detaillierte Liste der verfügbaren Konstanten und Filter für die Feinkornsteuerung, welche Komponenten gegen Aktualisierungen deaktiviert werden sollen.

Wenn Sie nur automatische Plugin-Updates deaktivieren möchten, haben Sie:

add_filter( 'auto_update_plugin', '__return_false' );

...und so weiter.

Um Ihre zweite Frage zu beantworten ...

(Jemand korrigiert mich, wenn ich falsch liege)

Fügen wir einen Kontext für die Leser hinzu. Diese gesamte Frage ist das Ergebnis dieses Twitter-Status, der an sich eine Antwort auf die erzwungene automatische Aktualisierung des WP SEO-Plugins von Yoast war. Siehe folgendes: https://yoast.com/wordpress-seo -security-release / , für weitere Informationen.

In wp-includes/update.phpnamed gibt es eine Funktion, wp_maybe_auto_updatedie am Hook mit demselben Namen do_action('wp_maybe_auto_update')ausgelöst wird und aus der wp_version_checkFunktion in derselben Datei ausgelöst wird, die an sich ein geplantes Ereignis ist, das zweimal täglich ausgeführt wird.

Ich vermute also, dass WordPress.org die Version von WordPress intern inkrementiert hat, sodass den Benutzern aufgrund der offensichtlichen Schwere der Sicherheitslücke, die mit dem Yoast WP SEO-Plugin verbunden ist, ein automatisches Update aufgezwungen wird.

Um Yoast selbst zu zitieren :

Aufgrund der Schwere des Problems hat das WordPress.org-Team ein erzwungenes automatisches Update veröffentlicht (danke!).

Ich bin nicht 100% sicher, ob dies tatsächlich dann auch automatisch andere Plugins aktualisiert hat, die neue Versionen im WordPress.org-Repository hatten, oder ob WordPress.org vorschreiben kann, welche Plugins von dort aus automatisch aktualisiert werden können, vielleicht dort etwas innerhalb des Codes, das auch diese Art von Diskretion zulässt.

Ich bin mir nicht ganz sicher, ob Sie dieselben Mechanismen selbst für Plugins verwenden können, die Sie im WordPress.org-Repository hosten, ja, für Plugins außerhalb des offiziellen Repositorys. Möglicherweise können Sie dies jedoch Instanziieren Sie die WP_Automatic_UpdaterKlasse und stellen Sie ihr einen Kontext zur Verfügung, gegen den geprüft werden kann, aber ich denke, letztendlich landen wir in einer Funktion, die aufgerufen wird und wp_update_pluginsin wp-includes/update.phpder die offizielle WordPress-Repository-API überprüft wird.

Ich kann mich irren. Wenn also jemand etwas hinzuzufügen hat, melden Sie sich bitte.

Adam
quelle
2
Nur WP-SEO wurde automatisch aktualisiert. Das WordPress-Team kann anscheinend ein Flag setzen, das die automatische Aktualisierung für ein Plugin / Theme aktiviert. Wenn es vom Kern bestimmt wird, dass es ein Update gibt, ruft der Kern die Update-Informationen ab ( github.com/WordPress/WordPress/blob/master/wp-admin/includes/… ). Es scheint, dass in dieser Antwort eine Variable vorhanden sein kann, die das Plugin / Theme zu einem automatischen Update veranlasst ( github.com/WordPress/WordPress/blob/master/wp-admin/includes/… ). Ich weiß nicht, ob ein Entwickler dieses Flag setzen kann.
Peter van der Does
@PetervanderDoes Danke, das habe ich mir gedacht und ein wenig weiter gegraben, sie set_site_transient( 'update_plugins' )in der wp_update_plugins()Funktion, wo sie ein bestimmtes Plugin vorübergehend als aktualisierungsbedürftig kennzeichnen können. Von dort geht es bergab ...
Adam