Wordpress y citas mágicas

12

He estado escribiendo algunos complementos de Wordpress, y he tenido algunos problemas con Wordpress poniendo citas mágicas en los datos POST y GET.

Específicamente, la función "wp_magic_quotes" en \ wp-includes \ load.php, que se llama (presumiblemente en cada respuesta) en wp-settings.php. Esta función agrega comillas mágicas a los datos incluso si desactivo las comillas mágicas en la configuración de 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 );
}

¿Es seguro para mí comentar la llamada wp_magic_quotes () en wp-settings.php? Es decir, ¿afectará negativamente el código normal de Wordpress y / o abrirá algún vector de explotación? Si es así, ¿hay alguna otra forma de hacerlo además de modificar el código WP (por lo que no tengo que lidiar con esto cada vez que hay una actualización)?

Matthew Groves
fuente
¿Alguien puede decirme dónde / cuándo wp_magic_quotes()se ejecuta la función ? No pude encontrar la ejecución en wp-core.
T.Todua
Este problema aún existe en 2019, más de 8 años después (por ejemplo, con PHP 7.1.33 (2019-10-23) y WordPress 5.2.4 (2019-10-14)).
Peter Mortensen

Respuestas:

8

En pocas palabras, WP convierte la situación indeterminada (las comillas mágicas pueden o no estar habilitadas en la configuración del servidor) en determinadas (las comillas mágicas siempre están presentes y la configuración del servidor no importa).

En lugar de meterse con esto para todo el núcleo de WP, tiene mucho más sentido simplemente cortar barras en su código en sus propias variables, cuando lo necesite.

Rarst
fuente
77
Esto es una locura, si puedo. Las citas mágicas son consideradas malas por cualquier codificador sensato, y esta es una elección realmente irresponsable por parte de Wordpress. No es que me sorprenda.
o0 '.
55
@Lohoris nota que WP no solo existe aquí y ahora. Existe más de muchos años. Si las citas mágicas fueran una idea intrínsecamente mala, entonces no existirían en primer lugar. Si bien los tiempos cambian y es fácil gritar lo mala que es ahora , cambiar el comportamiento existente en la base del código conlleva implicaciones masivas de seguridad y compatibilidad con versiones anteriores.
Rarst
3

El comportamiento actual en WordPress es una mejor práctica basada en la compatibilidad de todos los sistemas y configuraciones de PHP. WordPress siempre ha normalizado la reducción de $ _GET, $ _POST, $ _COOKIE y $ _SERVER, y se espera que continúe haciéndolo.

Entonces, para extraer un parámetro POST o GET tenemos que escribir:

$value = stripslashes_deep($_POST['name']); o

$value = stripslashes_deep($_GET['name']);
two7s_clash
fuente
0

Escribí una solución para tratar con estos arreglos superglobales en una pregunta similar en Stack Overflow.

Consiste en escribir un único "método de acceso" (get / set) para cada superglobal, cortando y pelando transparentemente. Entonces usarías, por ejemplo:

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

De esta manera, puede abstenerse de jugar aún más con las superglobales y disfrutar de una solución que funcionará "localmente" para su código, sin efectos secundarios. Para mí, fue la solución definitiva.

André Chalella
fuente
-3

Recientemente tuve este problema, y ​​finalmente lo descubrí. Básicamente estaba buscando en casi todos los sitios web citas mágicas en WordPress y ninguno de ellos me ayudó.

Así es como solucionarlo:

  1. Ve a tu wp-settings.php

  2. Busque wp_magic_quotes ();

  3. Solo coméntalo y debería funcionar ahora

Esto funciona porque si miras antes de ese código verás:

// Disable magic quotes at runtime. Magic quotes are added using wpdb later in //wp-settings.php.

@ini_set( 'magic_quotes_runtime', 0 );
@ini_set( 'magic_quotes_sybase',  0 );

Las citas de Magic que se agregan más adelante al usar wpdb es lo que está confundiendo a la mayoría de las personas, y resulta ser wp_magic_quotes (). Solo comentar eso evitará que las citas mágicas lo arruinen.

Joe
fuente
66
Mala idea: después de la próxima actualización, este cambio se pierde.
fuxia
Aunque esta es una mala idea ™, es la única solución que he encontrado para ejecutar WordPress y Magento simultáneamente sin dar problemas a Magento al guardar contenido.
forsvunnet
1
Esto también es una mala idea porque muchos complementos están mal escritos y no escapan a SQL correctamente, por lo que su sitio puede volverse vulnerable a los ataques de inyección SQL. Y cualquier complemento que haga lo correcto ejecutando stripslashes / stripslashes_deep en $ _GET / $ _ POST dañará la entrada del usuario al eliminar las barras invertidas.
tomdxw