Wordpress und magische Zitate

12

Ich habe einige Wordpress-Plugins geschrieben und hatte ein Problem damit, dass Wordpress POST- und GET-Daten in magische Anführungszeichen setzt.

Insbesondere die Funktion "wp_magic_quotes" in \ wp-includes \ load.php, die (vermutlich bei jeder Antwort) in wp-settings.php aufgerufen wird. Diese Funktion fügt den Daten magische Anführungszeichen hinzu, selbst wenn ich magische Anführungszeichen in den PHP-Einstellungen deaktiviere.

/**
 * Add magic quotes to $_GET, $_POST, $_COOKIE, and $_SERVER.
 *
 * Also forces $_REQUEST to be $_GET + $_POST. If $_SERVER, $_COOKIE,
 * or $_ENV are needed, use those superglobals directly.
 *
 * @access private
 * @since 3.0.0
 */
function wp_magic_quotes() {
    // If already slashed, strip.
    if ( get_magic_quotes_gpc() ) {
        $_GET    = stripslashes_deep( $_GET    );
        $_POST   = stripslashes_deep( $_POST   );
        $_COOKIE = stripslashes_deep( $_COOKIE );
    }

    // Escape with wpdb.
    $_GET    = add_magic_quotes( $_GET    );
    $_POST   = add_magic_quotes( $_POST   );
    $_COOKIE = add_magic_quotes( $_COOKIE );
    $_SERVER = add_magic_quotes( $_SERVER );

    // Force REQUEST to be GET + POST.
    $_REQUEST = array_merge( $_GET, $_POST );
}

Ist es für mich sicher, den Aufruf von wp_magic_quotes () in wp-settings.php einfach zu kommentieren? Das heißt, wird es den normalen Wordpress-Code negativ beeinflussen und / oder einen Ausnutzungsvektor öffnen? Wenn ja, gibt es eine andere Möglichkeit, als den WP-Code zu ändern (damit ich mich nicht jedes Mal darum kümmern muss, wenn es ein Update gibt)?

Matthew Groves
quelle
Kann mir jemand sagen, wo / wann die Funktion wp_magic_quotes()ausgeführt wird? Ich konnte die Ausführung in wp-core nicht finden.
T.Todua
Dieses Problem besteht auch 2019, mehr als 8 Jahre später (z. B. mit PHP 7.1.33 (23.10.2019) und WordPress 5.2.4 (14.10.2019)).
Peter Mortensen

Antworten:

8

Setzen Sie einfach WP in eine unbestimmte Situation (magische Anführungszeichen können in der Serverkonfiguration aktiviert sein oder nicht) in eine bestimmte Situation (magische Anführungszeichen sind immer vorhanden und die Serverkonfiguration spielt keine Rolle).

Anstatt dies für den gesamten WP-Kern zu tun, ist es viel sinnvoller, bei Bedarf einfach Schrägstriche in Ihrem Code auf Ihren eigenen Variablen zu entfernen.

Selten
quelle
7
Das ist verrückt, wenn ich darf. Magische Zitate werden von jedem vernünftigen Programmierer als schlecht angesehen, und dies ist eine wirklich verantwortungslose Wahl von Wordpress. Nicht dass ich überrascht wäre.
o0 '.
5
@ Lohoris beachten Sie, dass WP nicht nur hier und jetzt existiert. Es besteht über viele Jahre. Wenn magische Zitate von Natur aus eine schlechte Idee wären, würden sie überhaupt nicht existieren. Während sich die Zeiten ändern und es leicht zu schreien ist, wie schlecht die Idee jetzt ist, hat das Ändern des vorhandenen Verhaltens in der Codebasis massive Auswirkungen auf die Sicherheit und die Abwärtskompatibilität.
Erst
3

Das aktuelle Verhalten in WordPress basiert auf der Kompatibilität aller PHP-Systeme und -Konfigurationen. WordPress hat immer normalisiert, dass $ _GET, $ _POST, $ _COOKIE und $ _SERVER gekürzt werden, und erwartet, dass dies auch weiterhin der Fall ist.

Um einen POST- oder einen GET-Parameter zu extrahieren, müssen wir schreiben:

$value = stripslashes_deep($_POST['name']); oder

$value = stripslashes_deep($_GET['name']);
two7s_clash
quelle
0

In einer ähnlichen Frage in Stack Overflow habe ich eine Lösung für den Umgang mit diesen superglobalen Arrays geschrieben.

Es besteht darin, eine einzelne "Accessor-Methode" (get / set) für jede Superglobale zu schreiben, transparent zu zerschneiden und zu entfernen. So würden Sie zum Beispiel verwenden:

echo _get('username');    // echo stripslashes_deep($_GET['username']);
_cookie('name', 'value'); // $_COOKIE['name'] = addslashes_deep('value');

Auf diese Weise können Sie es unterlassen, sich noch weiter mit den Superglobalen zu beschäftigen, und eine Lösung genießen, die "lokal" für Ihren Code ohne Nebenwirkungen funktioniert. Für mich war es die ultimative Lösung.

André Chalella
quelle
-3

Ich hatte kürzlich dieses Problem und habe es endlich herausgefunden. Ich habe im Grunde fast jede Website nach magischen Zitaten in WordPress durchsucht und keine davon hat geholfen.

So beheben Sie das Problem:

  1. Gehen Sie in Ihre wp-settings.php

  2. Suche nach wp_magic_quotes ();

  3. Kommentieren Sie es einfach aus und es sollte jetzt funktionieren

Dies funktioniert, denn wenn Sie vor diesem Code suchen, sehen Sie:

// Disable magic quotes at runtime. Magic quotes are added using wpdb later in //wp-settings.php.

@ini_set( 'magic_quotes_runtime', 0 );
@ini_set( 'magic_quotes_sybase',  0 );

Diese Magic-Zitate, die später mit wpdb hinzugefügt werden, bringen die meisten Leute durcheinander, und es handelt sich zufällig um wp_magic_quotes (). Wenn Sie das nur auskommentieren, wird verhindert, dass magische Zitate Sie durcheinander bringen.

Joe
quelle
6
Schlechte Idee: Nach dem nächsten Upgrade geht diese Änderung verloren.
Fuxia
Obwohl dies eine schlechte Idee ist, ist es die einzige Lösung, die ich gefunden habe, um WordPress und Magento gleichzeitig auszuführen, ohne dass Magento Probleme beim Speichern von Inhalten hat.
Forsvunnet
1
Dies ist auch eine schlechte Idee, da viele Plugins schlecht geschrieben sind und SQL nicht korrekt entkommen, sodass Ihre Site möglicherweise für SQL-Injection-Angriffe anfällig wird. Und alle Plugins, die das Richtige tun, indem sie stripslashes / stripslashes_deep auf $ _GET / $ _ POST ausführen, beschädigen Benutzereingaben, indem sie Backslashes entfernen.
Tomdxw