characters - ¿Por qué se escapan las variables $_POST en PHP?
sanitize string javascript (6)
Cuando mi script PHP recibe datos de una solicitud AJAX POST, las variables $_POST
se escapan. Lo realmente extraño es que esto solo ocurre en mi servidor de producción (ejecutando PHP 5.2.12 en Linux) y no en mi servidor local (ejecutando PHP 5.3.1 en Windows).
Aquí está el código 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);
¿Hay alguna razón para que esto suceda? ¿Y cómo debería solucionar esto para que funcione en ambos servidores?
Editar: tengo la siguiente configuración para magic_quotes:
Local Master
magic_quotes_gpc On On
magic_quotes_runtime Off Off
magic_quotes_sybase Off Off
Así que hablé con un desarrollador de wordpress ( https://core.trac.wordpress.org/ticket/40476#ticket ) y él dijo:
"Hace muchos lunas atrás, WordPress siguió ciegamente a PHP al aceptar que todos los valores superglobales debían ser recortados. PHP luego hizo un cambio en la idea de algo más sano que ves hoy, pero el daño ya estaba hecho, WordPress como una aplicación había existido durante el tiempo suficiente, y había suficientes complementos y temas existentes que dependían de WordPress creando un entorno único y sensato que WordPress también cambiaría causaría un daño irreparable a esos sitios: introducir vulnerabilidades de seguridad, destruir contenido y un montón de otros cosas divertidas. https://core.trac.wordpress.org/ticket/18322 es nuestro boleto para rastrear esto y llegar a algo más sensato: a corto plazo (y a más largo plazo) le solicitamos que si está accediendo a $ _POST variables lo haces como tal: $ myvar = wp_unslash ($ _POST [''variable'']), de modo que un día, podremos tener $ _POST como una matriz no cortada.
con respecto a la respuesta dada aquí:
$temp_POST = $_POST;
require ''../www/wp_dir/wp-load.php'';
$_POST = $temp_POST;
Por favor no hagas eso. Simplemente te estás abriendo a problemas de seguridad y a cosas inesperadas que suceden en tu contenido donde WordPress espera que los valores sean recortados. En su lugar, simplemente use wp_unslash()
, y si realmente necesita una copia de $ _POST para operar en usted mismo, hágalo como tal: $my_POST = wp_unslash( $_POST );
.
También debería añadir: supongo que estás haciendo esto porque estás tratando de usar un punto final API para algo, te sugiero que utilices la API REST presentada con WordPress 4.7, ya que nos permite ofrecer mucho más experiencia consistente para los desarrolladores. "
Es probable que tenga citas mágicas activadas en su entorno de producción. Inspeccione la salida phpinfo()
.
Puede ejecutar todas sus entradas a través de algo como esto para quitar las comillas:
/* strip slashes from the string if magic quotes are on */
static function strip_magic_slashes($str)
{
return get_magic_quotes_gpc() ? stripslashes($str) : $str;
}
Esta es una "característica" de PHP conocida como Magic Quotes , que ahora ha quedado obsoleta en PHP 5.3 y eliminada en PHP 5.4.
No creo que esto se aplique en su caso, pero solo estaba teniendo un problema similar. Estaba cargando una instalación de Wordpress junto con un sitio para poder mostrar las publicaciones recientes en todas las páginas. Resulta que Wordpress escapa de todos los $ _POST vars, sin importar en qué magic_quotes estén configurados.
Lo menciono porque me resultó frustrante descubrirlo, y buscar en Google una respuesta me trajo aquí.
Así es como lo arreglé en mi caso:
$temp_POST = $_POST;
require ''../www/wp_dir/wp-load.php''; // loading wordpress
$_POST = $temp_POST;
Probablemente tengas citas mágicas habilitadas en el servidor Linux: magic_quotes
Cuando magic_quotes están activadas, all ''(comillas simples), "(comillas dobles), / (barras invertidas) y NUL se escapan con una barra invertida automáticamente.
Son algo bueno para deshabilitar, ya que se eliminarán de PHP 6 en adelante de todos modos. También debería poder deshabilitarlas dentro de su secuencia de comandos: set-magic-quotes-runtime No puede desactivar la parte de magic_quotes responsable de escapar los datos de POST durante el tiempo de ejecución. Si puede, desactívelo en php.ini. Si no puede hacer eso, verifique si magic_quotes está habilitado y haga un stripslashes () sobre cualquier contenido que obtenga de POST:
if (get_magic_quotes_gpc())
$my_post_var = stripslashes($_POST["my_post_var"]);
Quizás el php.ini de su servidor Linux tenga habilitadas las comillas mágicas.
http://php.net/manual/en/security.magicquotes.php
Esto es malo, por supuesto, ya que la funcionalidad está en desuso y se eliminará en el próximo PHP 6.
Puede desactivarlo en php.ini como tal
magic_quotes_gpc = Off
Puede probarlo y deshabilitarlo en tiempo de ejecución si no puede acceder a su php.ini
<?php
if (get_magic_quotes_gpc()) {
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process)) {
foreach ($val as $k => $v) {
unset($process[$key][$k]);
if (is_array($v)) {
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
} else {
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}
?>
Del manual de PHP