J'ai écrit des plugins Wordpress et j'ai eu quelques problèmes avec le fait que Wordpress mette des citations magiques sur les données POST et GET.
Plus précisément, la fonction "wp_magic_quotes" dans\wp-includes\load.php, appelée (probablement sur chaque réponse) dans wp-settings.php. Cette fonction ajoute des citations magiques aux données même si je désactive les citations 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 );
}
Est-il prudent de commenter simplement l'appel wp_magic_quotes () dans wp-settings.php? Autrement dit, cela affectera-t-il le code Wordpress normal et/ou ouvrira-t-il un vecteur d'exploitation? Si tel est le cas, existe-t-il un autre moyen de le faire en plus de la modification du code WP (afin que je n'ai pas à gérer cela à chaque mise à jour)?
Il suffit de mettre WP pour transformer une situation indéterminée (les guillemets magiques peuvent ou non être activés dans la configuration du serveur) en déterminants (les guillemets magiques sont toujours présents et la configuration du serveur importe peu).
Plutôt que de jouer avec cela pour tous les WP noyaux, il est beaucoup plus logique de supprimer les barres obliques dans votre code sur vos propres variables, lorsque vous en avez besoin.
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é les balises $ _GET, $ _POST, $ _COOKIE et $ _SERVER, et s’attend à ce qu’elle continue de 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']);
Cela consiste à écrire une seule "méthode d'accès" (get/set) pour chaque superglobale, en réduisant et en supprimant de manière transparente. Donc, vous utiliseriez, 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 avec les superglobales et profiter d'une solution qui fonctionnera "localement" pour votre code, sans aucun effet secondaire. Pour moi, c'était la solution ultime.
Je pense que les liens suivants pourraient aider: