Wordpress et citations magiques

12

J'ai écrit des plugins Wordpress et j'ai eu des problèmes avec Wordpress pour mettre des guillemets magiques sur les données POST et GET.

Plus précisément, la fonction "wp_magic_quotes" dans \ wp-includes \ load.php, qui est appelée (vraisemblablement à chaque réponse) dans wp-settings.php. Cette fonction ajoute des guillemets magiques aux données même si je désactive les guillemets magiques dans les paramètres PHP.

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

Puis-je commenter simplement l'appel wp_magic_quotes () dans wp-settings.php? Autrement dit, cela affectera-t-il négativement le code Wordpress normal et / ou ouvrira-t-il un vecteur d'exploitation? Si c'est le cas, existe-t-il une autre façon de le faire en plus de modifier le code WP (donc je n'ai pas à gérer cela à chaque fois qu'il y a une mise à jour)?

Matthew Groves
la source
Quelqu'un peut-il me dire où / quand la fonction wp_magic_quotes()est exécutée? Je n'ai pas pu trouver l'exécution dans wp-core.
T.Todua
Ce problème existe toujours en 2019, plus de 8 ans plus tard (par exemple avec PHP 7.1.33 (2019-10-23) et WordPress 5.2.4 (2019-10-14)).
Peter Mortensen

Réponses:

8

Il suffit de mettre WP transforme une situation indéterminée (les guillemets magiques peuvent ou non être activés dans la configuration du serveur) en déterminés (les guillemets magiques sont toujours présents et la configuration du serveur n'a pas d'importance).

Plutôt que de jouer avec tout cela pour WP, il est beaucoup plus logique de simplement supprimer les barres obliques dans votre code sur vos propres variables, lorsque vous en avez besoin.

Rarst
la source
7
C'est fou, si je peux me permettre. Les citations magiques sont considérées comme mauvaises par tout codeur sensé, et c'est un choix vraiment irresponsable de Wordpress. Pas que je sois surpris.
o0 '.
5
@Lohoris note que WP n'existe pas seulement ici et maintenant. Il existe sur plusieurs années. Si les citations magiques étaient intrinsèquement une mauvaise idée, elles n'existeraient pas en premier lieu. Alors que les temps changent et il est facile de crier combien mauvaise idée , il est maintenant - changer le comportement existant dans la base de code est livré avec sécurité massives et en arrière implications compatibilité.
Rarst
3

Le comportement actuel dans WordPress est la meilleure pratique basée sur la compatibilité de tous les systèmes et configurations PHP. WordPress a toujours normalisé $ _GET, $ _POST, $ _COOKIE et $ _SERVER à réduire, et attendez-vous à ce qu'il continue à le faire.

Donc, pour extraire un paramètre POST ou GET, nous devons écrire:

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

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

J'ai écrit une solution pour traiter ces tableaux superglobaux dans une question similaire dans Stack Overflow.

Il consiste à écrire une seule "méthode d'accesseur" (get / set) pour chaque superglobale, à couper et à supprimer de manière transparente. Vous utiliseriez donc, par exemple:

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

De cette façon, vous pouvez vous abstenir de jouer encore plus avec les superglobaux et profiter d'une solution qui fonctionnera "localement" pour votre code, sans aucun effet secondaire. Pour moi, c'était la solution ultime.

André Chalella
la source
-3

J'ai récemment eu ce problème et je l'ai finalement compris. Je cherchais essentiellement presque tous les sites Web sur des citations magiques sur WordPress et aucun d'eux n'a aidé.

Voici comment y remédier:

  1. Allez dans votre wp-settings.php

  2. Rechercher wp_magic_quotes ();

  3. Il suffit de le commenter et cela devrait fonctionner maintenant

Cela fonctionne car si vous regardez avant ce code, vous verrez:

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

Ce Magic citations qui est ajouté plus tard en utilisant wpdb est ce qui dérange la plupart des gens, et il se trouve que wp_magic_quotes (). Le simple fait de commenter cela empêchera les citations magiques de vous gâcher.

Joe
la source
6
Mauvaise idée: après la prochaine mise à niveau, ce changement est perdu.
fuxia
Bien que ce soit une mauvaise idée ™, c'est la seule solution que j'ai trouvée pour exécuter WordPress et Magento simultanément sans donner de problèmes à Magento lors de l'enregistrement du contenu.
forsvunnet
1
C'est également une mauvaise idée car de nombreux plugins sont mal écrits et n'échappent pas correctement à SQL, de sorte que votre site peut devenir vulnérable aux attaques par injection SQL. Et tous les plugins qui font la bonne chose en exécutant stripslashes / stripslashes_deep sur $ _GET / $ _ POST corrompront les entrées utilisateur en supprimant les barres obliques inverses.