Ces espaces réservés {xxx...}
pour %
dans une instruction LIKE sont-ils normaux? Si oui, quand sont-ils reconvertis en %
?
Shell
wp> global $wpdb;
wp> $q = "%s";
=> string(2) "%s"
wp> $pq = $wpdb->prepare($q, '%hi%');
=> string(136) "'{6e039dc0b074a5ff6828a070d0c24708d132341f32dff55a053f1410beabaacd}hi{6e039dc0b074a5ff6828a070d0c24708d132341f32dff55a053f1410beabaacd}'"
Oui, ils sont normaux. Ils ont été ajoutés en 4.8.3 pour corriger une vulnérabilité d'injection SQL.
Vous pouvez lire un article décrivant les raisons techniques pour que cela se produise ici et le ticket pour le changement ici .
Les caractères de substitution sont remplacés par les caractères aléatoires de la dernière ligne de $wpdb->prepare()
par la fonction $wpdb->add_placeholder_escape()
, qui appelle $wpdb->placeholder_escape()
en interne.
Ces espaces réservés sont supprimés dans $wpdb->query()
par la fonction $wpdb->remove_placeholder_escape()
qui est ajoutée en tant que filtre au crochet query
.