2008-10-21 19 views
16

De acuerdo con la PHP manual, con el fin de hacer el código más portable, recomiendan el uso de algo como lo siguiente para escapar de los datos:comillas mágicas en PHP

if (!get_magic_quotes_gpc()) { 
    $lastname = addslashes($_POST['lastname']); 
} else { 
    $lastname = $_POST['lastname']; 
} 

tengo otras comprobaciones de validación que va a realizar, pero ¿Qué tan seguro es lo anterior estrictamente en términos de datos de escape? También vi que las comillas mágicas quedarán obsoletas en PHP 6. ¿Cómo afectará eso al código anterior? Preferiría no tener que depender de una función de escape específica de la base de datos como mysql_real_escape_string().

Respuesta

25

Las comillas mágicas están inherentemente rotas. Se suponía que debían desinfectar la entrada al script PHP, pero sin saber cómo se usaría esa entrada es imposible desinfectarla correctamente. En todo caso, es mejor que compruebe si las comillas mágicas están habilitadas, luego llame a stripslashes() en $ _GET/$ _ POST/$ _ COOKIES/$ _ PETICIÓN, y luego desinfecte sus variables en el punto donde lo está usando en alguna parte. P.ej. urlencode() si lo está usando en una URL, htmlentities() si está imprimiendo de nuevo en una página web, o usando la función de escape del controlador de la base de datos si la está almacenando en una base de datos. Tenga en cuenta que las matrices de entrada pueden contener sub-matrices, por lo que es posible que necesite escribir una función para que se repita en las sub-matrices para quitar esas barras también.

El PHP man page on magic quotes está de acuerdo:..

"Esta característica ya no se utiliza como de PHP 5.3.0 y se retira a partir de PHP 6.0.0 Basándose en esta función es sumamente desalentador Cotizaciones Magic es una proceso que automágicamente escapa datos entrantes al script PHP. Es preferido codificar con comillas mágicas off y en su lugar, escapar de los datos en runtime, según sea necesario. "

+2

Excepto que PHP6 nunca vieron la luz del día. – Rolf

+4

Se ha eliminado en PHP 5.4 – hakre

1

Derecho, no es la mejor manera de hacerlo y no la más segura. Es mejor escapar en relación con lo que está escapando. Si va a almacenar en una base de datos mysql, use mysql_real_escape_string que tenga en cuenta otras configuraciones regionales, juegos de caracteres. Para HTML, htmlentities. Para usar en el código, escapeshellcmd, escapeshellarg. Sí, es probable que tengas que mover las pestañas primero si hay citas mágicas activadas. Pero lo mejor es no contar con eso o usarlo.

6

uso el siguiente código en el archivo de cabecera de mi página web para revertir los efectos de magic_quotes:

<?php 

// Strips slashes recursively only up to 3 levels to prevent attackers from 
// causing a stack overflow error. 
function stripslashes_array(&$array, $iterations=0) { 
    if ($iterations < 3) { 
     foreach ($array as $key => $value) { 
      if (is_array($value)) { 
       stripslashes_array($array[$key], $iterations + 1); 
      } else { 
       $array[$key] = stripslashes($array[$key]); 
      } 
     } 
    } 
} 

if (get_magic_quotes_gpc()) { 
    stripslashes_array($_GET); 
    stripslashes_array($_POST); 
    stripslashes_array($_COOKIE); 
} 

?> 

entonces puedo escribir el resto de mi código como si nunca existieron magic_quotes.

0

En cuanto al uso de una función de escape específica de la base de datos, es muy necesario. He encontrado simplemente usar addslashes() para fallar en casos raros con MySQL. Puede escribir una función para escapar que determina qué DB está usando y luego usa la función de escape apropiada.

2

"yo preferiría no tener que depender de una función de escape-base de datos específica como mysql_real_escape_string()"

A continuación, utilizar algo como PDO. Pero tienes que revertir el daño hecho por las citas mágicas de todos modos.

17

Las comillas mágicas son un error de diseño. Su uso es incompatible con la conservación de su cordura.

Prefiero:

if (get_magic_quotes_gpc()) { 
    throw new Exception("Turn magic quotes off now!"); 
} 

No escribir código para la compatibilidad con configuraciones inherentemente roto. En su lugar, defiende su uso al tener tu código FAIL FAST.

+1

Awesome FAIL-FAST. ¡No lo sabía! – dynamic

0

Usted puede intentar esto:

if (get_magic_quotes_gpc()) { 
      $_REQUEST = array_map('stripslashes', $_REQUEST); 
      $_GET = array_map('stripslashes', $_GET); 
      $_POST = array_map('stripslashes', $_POST); 
      $_GET = array_map('stripslashes', $_COOKIES); 

    } 
2

Deja un requisito de PHP 5.2 o superior en el código y utilizar el filter API. Las funciones filter_* acceden directamente a los datos de entrada sin procesar (nunca tocan el $_POST, etc.) por lo que no se ven afectados por magic_quotes_gpc.

Entonces este ejemplo:

if (!get_magic_quotes_gpc()) { 
    $lastname = addslashes($_POST['lastname']); 
} else { 
    $lastname = $_POST['lastname']; 
} 

puede llegar a ser esta:

0

Su código de ejemplo es al revés, usted debe hacer lo siguiente:

if (get_magic_quotes_gpc()) { 
    $lastname = stripslashes($_POST['lastname']); 
} else { 
    $lastname = $_POST['lastname']; 
} 

en cuenta que este hojas sus datos de entrada en estado 'en bruto' exactamente como los escribió el usuario - sin barras invertidas adicionales y potencialmente cargados con S Inyección QL y ataques XSRF, y eso es exactamente lo que quieres. A continuación, asegúrese de que siempre uso uno de los siguientes:

  • Cuando echo ing la variable en HTML, lo envuelve en htmlentities()
  • Cuando ponerlo en MySQL, usa comandos preparados o bien mysql_real_escape_string() como una mínimo.
  • Cuando echo ing la variable en código Javascritpt, utilice json_encode()

Joel Spolsky tiene un buen consejo de partida en Making Wrong Code Look Wrong

0

Acabo de encontrar esto sobre el PHP manual pages, parece una manera muy inteligente para despojar em (se ocupa de claves y valores ...):

if (get_magic_quotes_gpc()) 
{ 
    $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true); 
    $_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true); 
    $_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true); 
    $_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true); 
    ini_set('magic_quotes_gpc', 0); 
} 
+1

Soy el autor de esa nota en el manual, solo no olvide que como estamos usando la constante 'JSON_HEX_APOS' esta solución solo es compatible con PHP 5.3 y superior, consulte esta pregunta (http: // stackoverflow. com/questions/2077711/php-short-magic-quotes-solution) para más información. –

Cuestiones relacionadas