Frases mágicas en PHP

De acuerdo con el manual de PHP , para que el código sea más portátil, recomiendan utilizar algo como lo siguiente para el escape de datos:

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

Tengo otras verificaciones de validación que realizaré, pero ¿qué tan seguro es lo anterior en términos estrictos 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 ().

Solutions Collecting From Web of "Frases mágicas en PHP"

Las citas 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. Por ejemplo, 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.

La página de manual de PHP sobre citas mágicas está de acuerdo:

“Esta característica ha sido DEPURADA a partir de PHP 5.3.0 y RETIRADA a partir de PHP 6.0.0. Se desaconseja confiar en esta característica. Magic Quotes es un proceso que escapa automágicamente de los datos entrantes al script PHP. Se prefiere codificar con magia cita y en su lugar escapa de los datos en tiempo de ejecución, según sea necesario “.

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

Yo prefiero:

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

No escriba código para la compatibilidad con configuraciones inherentemente rotas. En su lugar, defiende su uso más rápido haciendo que tu código falle rápidamente .

Utilizo el siguiente código en el archivo de encabezado de mi sitio web para invertir 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 rest de mi código como si las comillas mágicas nunca existieran.

“Preferiría no tener que depender de una función de escape específica de la base de datos como mysql_real_escape_string ()”

Luego usa algo como PDO . Pero tienes que revertir el daño hecho por las citas mágicas de todos modos.

Ponga un requisito de PHP 5.2 o superior en su código y use la API de filtro . Las funciones filter_* acceden directamente a los datos de entrada sin procesar (nunca tocan $_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 convertirse en esto:

 $lastname = filter_input(INPUT_POST, 'lastname'); 

Correcto, 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 tabs primero si hay citas mágicas activadas. Pero lo mejor es no contar con eso o usarlo.

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

Puedes 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); } 

“Preferiría no tener que depender de una función de escape específica de la base de datos como mysql_real_escape_string ()”

También se pueden engañar las tabs adds, así que echa un vistazo a esta publicación:

http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string

Su código de muestra está al revés, debería hacer lo siguiente:

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

Tenga en cuenta que esto deja sus datos de entrada en un estado ‘en bruto’ exactamente como el usuario lo tipeó, sin barras invertidas adicionales y potencialmente cargados con Inyección de SQL y ataques XSRF, y eso es exactamente lo que quiere. Luego, asegúrese de usar siempre uno de los siguientes:

  • Al hacer echo de la variable en HTML, envuélvala en htmlentities()
  • Al ponerlo en mysql, use declaraciones preparadas o mysql_real_escape_string() como mínimo.
  • Cuando json_encode() echo de la variable en el código de Javascritpt, use json_encode()

Joel Spolsky tiene algunos buenos consejos para comenzar a hacer que el código incorrecto se vea mal

Acabo de encontrar esto en las páginas de manual de PHP , parece una forma muy inteligente de quitarme em (se trata 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); } 

Las declaraciones preparadas de PDO y Mysqli son la mejor manera de prevenir la inyección de SQL.

Pero si está migrando un código heredado basado en Magic Quotes para cada consulta SQL, puede remitir yidas / php-magic-quotes para implementar Magic Quotes en el entorno con la versión anterior de PHP 5.4.

https://github.com/yidas/php-magic-quotes