Con" comillas mágicas " desactivadas, ¿por qué PHP / Wordpress continúa escapando automáticamente los datos de mis publicaciones?


Es una pregunta simple con una respuesta extrañamente esquiva.

get_magic_quotes_gpc() informes 0. Repito, las citas mágicas están apagadas. Las comillas mágicas parecen haber sido deshabilitadas en php.ini (no en tiempo de ejecución).

Sin embargo, todos los datos POST incluyendo comillas simples (') se escapan cuando se accede en PHP. ¿Qué podría estar causando esto?

Gracias.


Editar: Para los curiosos, esta es una captura de pantalla de nuestra phpinfo: http://img843.imageshack.us/img843/6959/screenshot20120120at552.png


Editar: Mientras preparaba un caso de prueba, descubrí el origen general del problema. Estamos bootstrapping Wordpress como nuestra aplicación se integra con una instalación Multisitio WP. Cuando deshabilito el bootstrapping de Wordpress, el escape automático está deshabilitado. ¿Alguien sabe dónde se puede encontrar el código de escape automático de Wordpress?

Author: Your Common Sense, 2012-01-21

6 answers

Creo que lo encontré. Problema (bug): http://core.trac.wordpress.org/ticket/18322

Solución: http://codex.wordpress.org/Function_Reference/stripslashes_deep

    $_GET       = array_map('stripslashes_deep', $_GET);
    $_POST      = array_map('stripslashes_deep', $_POST);
    $_COOKIE    = array_map('stripslashes_deep', $_COOKIE);
    $_SERVER    = array_map('stripslashes_deep', $_SERVER);
    $_REQUEST   = array_map('stripslashes_deep', $_REQUEST);

Nota: Como sugirió @Alexandar O'Mara, es posible que desee reconsiderar la sobreescritura de los superglobales de esta manera. Si es apropiado para su situación, por ejemplo, podría simplemente "desnudarse localmente" usando una alternativa como $post = array_map('stripslashes_deep', $_POST);

También ver @ quickshiftin excelente respuesta.

 36
Author: rinogo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-09 06:12:48

Ampliando la respuesta de @rinogo con una explicación más profunda y ofreciendo otra solución.


En wp-settings.php hay una llamada incondicional a wp_magic_quotes

// Add magic quotes and set up $_REQUEST ( $_GET + $_POST )
wp_magic_quotes();

Wordpress escapa de las citas sin importar qué

function wp_magic_quotes() {
    // If already slashed, strip.
    // Escape with wpdb.
    // Force REQUEST to be GET + POST.
}

Lo interesante es que esta llamada se hace después de que se hayan cargado los complementos, antes de que se cargue el tema. Sooo, en la parte superior de su plugin

// A hack to cope with un-configurable call to wp_magic_quotes
// E.G. Make the original $_POST available through a global $_REAL_POST
$_REAL_GET     = $_GET;
$_REAL_POST    = $_POST;
$_REAL_COOKIE  = $_COOKIE;
$_REAL_REQUEST = $_REQUEST;

Entonces puedes usar libremente $_REAL_POST et al en lugar de $_POST (recordando que es un global no un superglobal ) donde usted necesita. También recuerde que mientras su plugin se ha cargado antes del tema, si el tema llama a una de las funciones del plugin que utiliza $_POST, debe leer desde $_REAL_POST para obtener los valores no registrados.

 13
Author: quickshiftin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-11 08:20:19

La mejor respuesta proporcionada aquí es copiar para uso propio como:

$post = array_map('stripslashes_deep', $_POST);

Sin embargo, hay un problema teórico con esto: ya que está trabajando con un duplicado, no puede persistir ningún cambio en los superglobales (oye, no estoy diciendo que sea una buena práctica, ¿de acuerdo?).

Solución: métodos de acceso

En un intento de resolver este lío de una manera definida y sin efectos secundarios, hice "métodos de accessor" que se aplican de forma transparente stripslashes_deep() o addslashes_deep()* para obtener / establecer solicitudes a los siguientes arrays superglobales:

* Tuve que lanzar addslashes_deep() juntos desde WordPress' stripslashes_deep().

  • $_GET
  • $_POST
  • $_COOKIE
  • $_SERVER
  • $_REQUEST

Puedes usarlos como:

echo _get('username');    // echo stripslashes_deep($_GET['username']);
_cookie('name', 'value'); // $_COOKIE['name'] = addslashes_deep('value');

Aquí está el código (yo lo llamo gpcsr.php):

<?php

// cat stripslashes_deep() | sed 's/stripslashes/addslashes/g'
function addslashes_deep( $value ) {
    if ( is_array($value) ) {
        $value = array_map('addslashes_deep', $value);
    } elseif ( is_object($value) ) {
        $vars = get_object_vars( $value );
        foreach ($vars as $key=>$data) {
            $value->{$key} = addslashes_deep( $data );
        }
    } elseif ( is_string( $value ) ) {
        $value = addslashes($value);
    }

    return $value;
}

function _generic_slashes_wrap(&$arr, $key, $value = null) {
    if (func_num_args() === 2) return stripslashes_deep($arr[$key]);
    else $arr[$key] = addslashes_deep($value);
}

function _get       ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_GET,      $key); else _generic_slashes_wrap($_GET,        $key, $value); }
function _post      ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_POST,     $key); else _generic_slashes_wrap($_POST,       $key, $value); }
function _cookie    ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_COOKIE,   $key); else _generic_slashes_wrap($_COOKIE,     $key, $value); }
function _server    ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_SERVER,   $key); else _generic_slashes_wrap($_SERVER,     $key, $value); }
function _request   ($key, $value = null) { if (func_num_args() === 1) return _generic_slashes_wrap($_REQUEST,  $key); else _generic_slashes_wrap($_REQUEST,    $key, $value); }

?>
 0
Author: André Chalella,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-09 14:15:48

Solo tuve que lidiar con este problema y encontré lo que creo que es una solución bastante buena. Se asegura de que los GPCs sean nunca recortados. Acabo de poner esto en la parte superior de mi archivo de plugin (que funcionaría en la parte superior de un tema también, creo):

add_action( 'init', 'unslash_gpc' );
function unslash_gpc() {
    $_GET       = array_map('stripslashes_deep', $_GET);
    $_POST      = array_map('stripslashes_deep', $_POST);
    $_COOKIE    = array_map('stripslashes_deep', $_COOKIE);
    $_SERVER    = array_map('stripslashes_deep', $_SERVER);
    $_REQUEST   = array_map('stripslashes_deep', $_REQUEST);
}

Y ahora todo es perfecto!

 0
Author: Jordan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-28 21:07:41

Wordpress proporciona una solución para esto mediante el uso de la función de wordpress stripslashes_deep. Entonces, los fragmentos mencionados en la respuesta de @rinogo serían:

$_GET     = stripslashes_deep($_GET);
$_POST    = stripslashes_deep($_POST);
$_COOKIE  = stripslashes_deep($_COOKIE);
$_REQUEST = stripslashes_deep($_REQUEST);

También una nota, wordpress no dice nada sobre la variable global $_SERVER, por lo que asumiría que no está afectada.

WordPress agrega barras a get _POST/ _ _GET/ _ _REQUEST/get _COOKIE independientemente de lo que devuelve get_magic_quotes_gpc (). Así que en el contexto de WordPress, stripslashes () o stipslashes_deep() siempre se debe usar cuando se usan esas variables.

 0
Author: George Dimitriadis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-24 12:43:43

O, simplemente haz lo que hice. Comenta toda la implementación en load.el método wp_magic_quotes() de php.

No me sirven las citas mágicas. Esto me estaba causando muchos más dolores de cabeza de los que valía la pena. Personalmente, prefiero mantener mi propia disciplina de saneamiento de insumos. No quiero empezar a formar malos hábitos de programación.

Pero, entiendo WordPress' compulsión para incluir tal "característica". Tal vez la comunidad de desarrollo sería mejor servida con un opción para desactivarlo.

 -2
Author: Tony Gingrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-11 01:56:07