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


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

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

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

Gracias.


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


Editar: Mientras preparaba un caso de prueba, descubrí el origen general del problema. Estamos iniciando Wordpress ya que nuestra aplicación se integra con una instalación de WP Multisite. Cuando desactivo el bootstrapping de Wordpress, el auto-escape está deshabilitado. ¿Alguien sabe dónde se encuentra el código de escape automático de Wordpress?


32
2018-01-21 00:49


origen


Respuestas:


Creo que lo encontré Problema (error): 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 lo sugirió @Alexandar O'Mara, es posible que desee reconsiderar sobrescribir los superglobales de esta manera. Si es apropiado para su situación, por ejemplo, puede simplemente "desnudarse localmente" usando una alternativa como $post = array_map('stripslashes_deep', $_POST);

También vea la excelente respuesta de @ quickshiftin.


36
2018-01-21 01:08



Ampliar la respuesta de @ rinogo con una explicación más profunda y ofrecer otra solución alternativa.


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 citas sin importar qué

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

Lo que es interesante es que esta llamada está hecha después complementos han sido cargados, antes de el tema está cargado Entonces, en la parte superior de tu complemento

// 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 lo necesites. También recuerde que, si bien su complemento se ha cargado antes del tema, si el tema llama a una de las funciones de complemento que utiliza $_POST, debe leer de $_REAL_POST para obtener los valores sin guardar.


13
2017-12-11 08:20



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

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

Sin embargo, hay un problema teórico con esto: dado que estás trabajando con un duplicado, no puedes persistir ningún cambio en los superglobales (hey, no digo que sea una buena práctica, ¿de acuerdo?).

Solución: métodos de acceso

En un intento de resolver este desastre de una manera definida y sin efectos secundarios, hice "métodos de acceso" que se aplican de forma transparente stripslashes_deep() o addslashes_deep()* para obtener / configurar solicitudes para las siguientes matrices superglobales:

* Tuve que tirar 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
2017-11-09 07:54



Simplemente tuve que lidiar con este problema y encontré lo que creo que es una buena solución. Asegura que los GPC son Nunca acuchillado. Acabo de poner esto en la parte superior de mi archivo de complemento (creo que también funcionaría en la parte superior de un tema):

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
2017-11-28 21:07



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

$_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 el $_SERVER variable global, entonces asumiría que no se ve afectado.

WordPress agrega barras inclinadas a $ _POST / $ _ GET / $ _ REQUEST / $ _ COOKIE independientemente de lo que get_magic_quotes_gpc () devuelva. Por lo tanto, en el contexto de WordPress, stripslashes () o stipslashes_deep () siempre se deben utilizar al usar esas variables.


0
2018-04-24 12:43



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

No tengo uso para citas mágicas. Esto me estaba causando más dolores de cabeza de lo que valía. Personalmente, prefiero mantener mi propia disciplina de saneamiento de insumos. Simplemente no quiero empezar a formar malos hábitos de programación.

Pero, entiendo la compulsión de WordPress para incluir esa "característica". Quizás la comunidad de desarrollo estaría mejor servida con una opción global para desactivarla.


-2
2018-01-11 01:56