with strip_tags remove ent_quotes ejemplo php security magic-quotes

strip_tags - Frases mágicas en PHP



strip_tags wordpress (12)

"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.

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 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 ().


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 pestañas primero si las comillas mágicas están 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.


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 el uso que hacen de tu código FAIL FAST .


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 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 las comillas mágicas nunca existieran.


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



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'');


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


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 ".


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