Pourquoi $_POST variables arriver échappé en PHP?
Quand mon script PHP reçoit des données via une requête AJAX POST, la $_POST
variables sont échappés. Vraiment étrange, c'est que cela ne se produit que sur mon serveur de production (exécution de PHP 5.2.12 sur Linux) et non pas sur mon serveur local (l'exécution de PHP 5.3.1 sur Windows).
Voici le code AJAX:
var pageRequest = false;
if(window.XMLHttpRequest) pageRequest = new XMLHttpRequest();
else if(window.ActiveXObject) pageRequest = new ActiveXObject("Microsoft.XMLHTTP");
pageRequest.onreadystatechange = function() { }
var q_str = 'data=' + " ' ";
pageRequest.open('POST','unnamed_page.php',true);
pageRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
pageRequest.setRequestHeader("Content-length", q_str.length);
pageRequest.setRequestHeader("Connection", "close");
pageRequest.send(q_str);
Est-il une raison à ce qui se passe? Et comment dois-je résoudre ce problème afin qu'il fonctionne sur les deux serveurs?
Edit: j'ai les paramètres suivants pour les magic_quotes:
Local Master
magic_quotes_gpc On On
magic_quotes_runtime Off Off
magic_quotes_sybase Off Off
Vous devez vous connecter pour publier un commentaire.
Vous avez probablement magic quotes activé sur le serveur Linux: magic_quotes
Ils sont une bonne chose pour le désactiver, car ils vont être supprimés à partir de PHP 6 à partir de toute façon.
Vous devez également être en mesure de les désactiver à l'intérieur de votre script: set-magic-quotes-runtimeVous ne pouvez pas désactiver la partie de magic_quotes responsable pour échapper à publier des données au cours de l'exécution. Si vous pouvez le désactiver en php.ini. Si vous ne pouvez pas faire cela, faire une vérification si les magic_quotes sont activées, et de faire un stripslashes() sur tout contenu que vous extraire de POSTE:get_magic_quotes_gpc()
retournera false là, et pas de barres obliques sera dépouillé. L'essayer, faire un test de sortie de la fonction. Mais la meilleure chose serait vraiment pour désactiver les magic quotes sur la machine linux. Vous pouvez faire unphpinfo()
, il vous dira ce qui est permis et ce qui ne l'est pas.Joe's head
devientJoe\'s head
dans$_POST
qui devientJoe\\\'s head
dans la requête.$_POST
avec les touches de caractères qui ont besoin de s'échapper (au moins dans mon expérience).$_POST['Groups\Categories']
$_POST["i wish I'd name keys better"]
$_POST = array_map('stripslashes', $_POST);
$_POST
!!!Je ne pense pas que cela s'applique à votre cas, mais je viens d'avoir un problème similaire. J'était en train de charger une installation de WordPress avec un site afin que je puisse afficher les messages récents sur toutes les pages. Il s'avère WordPress échappe à tous les $_POST vars, peu importe ce que magic_quotes sont définis.
Je le mentionne parce que c'était frustrant à comprendre et à googler pour une réponse m'a amené ici.
Voici comment je l'ai corrigé dans mon cas:
C'est un PHP "fonctionnalité", connue sous le Magic Quotes, qui a été déprécié en PHP 5.3, et retiré en PHP 5.4.
Il est facile de désactiver le ridicule de nuisance en php.ini.
Vous avez probablement magic quotes activé dans votre environnement de production. Inspecter
phpinfo()
de sortie.Vous pouvez exécuter l'ensemble de vos entrées par le biais de quelque chose comme cela pour dépouiller les citations:
Peut-être que votre serveur Linux php.ini a magic quotes sont activées.
http://php.net/manual/en/security.magicquotes.php
Ce qui est mauvais, bien sûr, que la fonction est obsolète et sera supprimée dans la prochaine PHP 6.
Vous pouvez le désactiver en php.ini comme
Vous pouvez le tester et de le désactiver lors de l'exécution si vous ne pouvez pas accéder à votre php.ini
De la Manuel PHP
Je n'ai donc parler à un wordpress dev ( https://core.trac.wordpress.org/ticket/40476#ticket ) et il a dit:
"Retour dans la journée, de nombreux il ya de nombreuses lunes, WordPress suivi aveuglément PHP en acceptant que l'ensemble de la superglobale valeurs doivent être revues à la baisse.
PHP plus tard a fait une reprise sur l'idée de quelque chose de plus sain d'esprit que vous voyez aujourd'hui, mais le mal était fait, WordPress comme une application existait déjà depuis assez longtemps, et il y avait assez de les plugins et les thèmes en s'appuyant sur WordPress création d'un sain environnement unique WordPress aussi l'évolution des causerait des dommages irréparables à ceux des sites d'introduire des failles de sécurité, mutilation de contenu, et un tas d'autres choses amusantes.
https://core.trac.wordpress.org/ticket/18322 est notre billet pour le suivi de cette et arriver à quelque chose de plus sain d'esprit - dans le court terme (et à plus long terme, nous devons demander que si vous êtes accédant à $_POST variables que vous le faites en tant que telle: $myvar = wp_unslash( $_POST['variable'] ); de sorte qu'un jour, nous serons en mesure d'avoir $_POST comme un unslashed tableau.
concernant la réponse donnée ici:
S'il vous plaît ne pas le faire. Vous avez juste à vous ouvrir à des questions de sécurité, et des choses inattendues se produire à votre contenu où WordPress n'attendez les valeurs qui doivent être revues à la baisse.
Au lieu de cela, utilisez simplement
wp_unslash()
, et si vous avez vraiment besoin d'une copie de $_POST pour fonctionner sur vous-même, faire en tant que tel:$my_POST = wp_unslash( $_POST );
.Je dois également ajouter - je attendre de vous que vous êtes en train de faire cela parce que vous essayez d'utiliser une API de point de terminaison pour quelque chose, je lui conseillerais de commutation à l'aide de l'API REST introduit avec WordPress 4.7 au lieu de cela, car il nous permet d'offrir beaucoup plus d'expérience cohérente pour les développeurs.
"