web-dev-qa-db-fra.com

$ wpdb-> update ou $ wpdb-> insert résulte en l'ajout de barres obliques devant les guillemets

Cette question a été posée plusieurs fois à divers endroits, mais je n'ai pas trouvé de réponse définitive et claire. La plupart des solutions impliquent des personnes disant de désactiver Magic Quotes sur le fichier php.ini (ce que j'ai fait) ou de modifier les fichiers core WP.

Quoi qu'il en soit, la question est la suivante: pourquoi est-ce à chaque fois que j'utilise $ wpdb-> insert ou $ wpdb-> update, une barre oblique est ajoutée avant tout devis. Ainsi, par exemple:

J'ai mangé des fraises devient J'ai\mangé des fraises

Voici un exemple de code que j'ai utilisé:

$id = $_POST['id'];
$title = $_POST['title'];
$message = $_POST['message'];

$wpdb->update('table_name', array('id'=>$id, 'title'=>$title, 'message'=>$message), array('id'=>$id))

Le même problème était ici: Sortie de la base de données Wordpress - Supprimer les injections d'échappement SQL mais il n'a jamais été résolu à part "désactiver les guillemets magiques"

24
J Lee

Après avoir passé la journée là-dessus, la réponse est la suivante:

Wordpress s'échappe à la déclaration $ _POST, pas à l'insertion réelle, ce qui est bizarre.

$id = stripslashes_deep($_POST['id']); //added stripslashes_deep which removes WP escaping.
$title = stripslashes_deep($_POST['title']);
$message = stripslashes_deep($_POST['message']);

$wpdb->update('table_name', array('id'=>$id, 'title'=>$title, 'message'=>$message), array('id'=>$id));

Cela signifie que WP n'ajoutera pas de barres obliques avant les guillemets.

55
J Lee

un peu plus d'informations - WordPress a décidé de faire croire aux gens qu'ils devenaient fous en ajoutant des `` citations magiques '' même si vous l'aviez désactivé à partir de la version 3.0. Tout accès à $ _REQUEST, $ _GET, $ _POST, $ _COOKIE ou $ _SERVER sera affecté. Voir wp-includes/load.php.

 /* Add magic quotes to $_GET, $_POST, $_COOKIE, and $_SERVER.
 * @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 );
}
6
Ryan Horrisberger

WordPress ignore le paramètre php magic quotes intégré et la valeur de get_magic_quotes_gpc () et ajoutera toujours des guillemets magiques (même après la suppression de la fonctionnalité de PHP en 5.4).

vous pouvez l'utiliser à la place

//replace $_POST with $POST
$POST      = array_map( 'stripslashes_deep', $_POST);
$wpdb->insert( 
        'wp_mytable', 
        array( 
            'field_name'        => $POST['field_name'], 
            'type'              => $POST['type'],
            'values'            => serialize($POST['values']),
            'unanswered_link'   => $POST['unanswered_link'], 
        ), 
        array( 
            '%s','%s','%s','%s'
        ) 
    );

WordPress le fait parce que trop de code de base et de plug-in dépendent des citations, donc désactiver les citations sur les super-globaux (comme cela est fait dans les exemples "Exemple de base" et "Bonnes pratiques de codage" ci-dessus) est susceptible de provoquer des trous de sécurité.

http://codex.wordpress.org/Function_Reference/stripslashes_deep

3
keithics