Estoy tratando de protegerme de la inyección de sql y estoy usando:

mysql_real_escape_string($string);

Cuando la publicación de HTML se ve algo como esto:

<span class="\&quot;className\&quot;">
<p class="\&quot;pClass\&quot;" id="\&quot;pId\&quot;"></p>
</span>

No estoy seguro de cómo muchas otras variaciones real_escape_string agrega así que no quieren reemplazar sólo algunos, y se olvida de los demás… ¿Cómo hago para «decodificar» esta de vuelta en el formato correcto en HTML, con algo como:

html_entity_decode(stripslashes($string));
Si el usuario puede controlar la $cadena, entonces esta es una vulnerabilidad de XSS.

OriginalEl autor Peter Craig | 2010-04-04

9 Comentarios

  1. 13

    La mysql_real_escape_string() página de manual indica que los caracteres se escapó:

    mysql_real_escape_string() llama a
    MySQL es función de la biblioteca
    mysql_real_escape_string, que
    antepone barras diagonales inversas a las siguientes
    caracteres: \x00, \n, \r, \, ‘, » y
    \x1a.

    Usted podría invertir satisfactoriamente el escape mediante la sustitución de los caracteres de escape sin escape con sus formas.

    mysql_real_escape_string() no debe ser utilizado para desinfectar HTML, aunque… no hay ninguna razón para utilizar antes de la salida de datos de la página web. Debe ser utilizado solamente en los datos que se van a poner en la base de datos. Su proceso de sanitización debe ser algo como esto:

    De entrada

    1. Aceptar la entrada del usuario desde un formulario o solicitud HTTP
    2. Crear la base de datos de consulta mediante mysql_real_escape_string()

    Salida

    1. Recuperar datos de la base de datos
    2. Ejecutar cualquier datos definidos por el usuario a través de htmlspecialchars() antes de imprimir

    Usando otro controlador de base de datos tales como MySQLi o PDO permitirá el uso de declaraciones preparadas, que cuidar de escapar de la mayoría de los insumos para usted. Sin embargo, si usted no puede cambiar o tomar ventaja de ellos, entonces definitivamente mysql_real_escape_string()… solo lo uso antes de la inserción de datos.

    Yo recomendaría declaraciones preparadas (por ejemplo, php.net/manual/en/class.pdostatement.php) a través de mysql_real_escape_string. Y htmlspecialchars no es siempre la elección correcta. A veces blanco-lista es una mejor opción.
    Nota! Si usted tiene ‘magic_quotes’, incluso con DOP usted tendrá que utilizar ‘stripslashes()’ antes de poner las cuerdas a la base de datos para evitar la doble barras.
    Pero ningún sistema moderno debe tener magic_quotes. Esa característica ha sido desaprobado por años.

    OriginalEl autor zombat

  2. 9

    Tienes todo en mal estado.

    mysql_real_escape_string no necesita ninguna decodificación.

    si usted obtiene sus datos de nuevo con barras, significa que se ha escapado dos veces. Y en lugar de quitar la extra de barras debe no sólo para agregarlos.

    Por no hablar de que lo que sea que escapar es obsoleto y debe

    uso de declaraciones preparadas

    lugar de cualquier escape de la cadena.

    Así, nunca se escapa, nunca decodificar.

    El problema resuelto.

    $consulta=»INSERT INTO tabla html=’$html'»; no es un estándar de SQL, es mejor que utilice INSERT INTO tabla (html) VALUES(‘contenido’); Esto funciona en todas las bases de datos, no sólo de MySQL.
    Heikens Pero estoy trabajando con mysql. Y yo uso toneladas de mysql características específicas. Ve y dile que yo no uso PHP ya que no se admite en todas partes. Lo que una tontería de comentario!
    Como Guss señaló, escapar es necesario para proteger su base de datos en contra de la inyección de SQL.

    OriginalEl autor Your Common Sense

  3. 8

    mysql_real_escape_string se utiliza para evitar la inyección SQL, cuando el almacenamiento de datos proporcionados por el usuario en la base de datos, pero el mejor método sería utilizar el enlace de datos mediante PDO (por ejemplo). Yo siempre recomiendo el uso de que en vez de jugar con el escape.

    Que se dice, respecto a tu pregunta sobre cómo mostrar posteriormente – después se almacenan los datos, al recuperar los datos es completa y válida, sin necesidad de ser «sin escape». A menos que se agrega su propio secuencias de escape, así que por favor no lo hagas.

    OriginalEl autor Guss

  4. 0

    No está seguro de lo que está pasando con el formato como lo puedo ver pero tu formulario html

    <span class="\&quot;className\&quot;">
    <p class="\&quot;pClass\&quot;" id="\&quot;pId\&quot;"></p>
    </span>

    debe ser simplemente;

    <span class="className">
    <p class="pClass" id="pId"></p>
    </span>

    Cuando lo recibes de vuelta, antes de ponerlo en la base de datos que escapar de ella mediante mysql_real_escape_string() para asegurarse de que no sufren un ataque de inyección sql.

    Por lo tanto se le están escapando de los valores listo para colocar el texto siguiente.

    Al salir de la base de datos ( o mostrar a los usuarios como html), a continuación, usted escapar de nuevo listo para que ese lugar se va al lado (html) con htmlentities (), etc para proteger a sus usuarios contra los ataques XSS.

    Esta forma el EO parte del mantra el fieo, de Filtro de Entrada, Salida de fuga, que debe tatoo en la parte interior de sus párpados.

    Está usted seguro de que quiere este formulario para ser escapado? Una estoy en profundas dudas. Si alguien utiliza el formato HTML, que por lo general quieren trabajar, que no es tan visible etiquetas.

    OriginalEl autor Cups

  5. 0

    Bueno, me tomó una puñalada en el este, a la antigua usanza y hasta el momento soy incapaz de ver nada malo con mi enfoque. Obviamente es un poco crudo, pero hace el trabajo:

    function mysql_unreal_escape_string($string) {
        $characters = array('x00', 'n', 'r', '\', '\'', '"','x1a');
        $o_chars = array("\x00", "\n", "\r", "\", "'", "\"", "\x1a");
        for ($i = 0; $i < strlen($string); $i++) {
            if (substr($string, $i, 1) == '\') {
                foreach ($characters as $index => $char) {
                    if ($i <= strlen($string) - strlen($char) && substr($string, $i + 1, strlen($char)) == $char) {
                        $string = substr_replace($string, $o_chars[$index], $i, strlen($char) + 1);
                        break;
                    }
                }
            }
        }
        return $string;
    }

    Este debe cubrir la mayoría de los casos.

    OriginalEl autor Muhwu

  6. -1

    Me preguntaba por qué esta rutina no tiene un acompañamiento decodificador de rutina. Probablemente es interpretada por MySQL exactamente de la misma manera como si no se escapó. Usted obtener la onu-se escapó de resultados al hacer una $row=mysql_fetch_array($res, MYSQL_ASSOC)';

    OriginalEl autor HELPFUL_SHADOW

  7. -1

    Incluso si es una vieja pregunta…
    He tenido el mismo problema que Peter Craig.
    De hecho, he de lidiar con un viejo CMS. Con el fin de evitar la Inyección de SQL, la totalidad de los $_POST y $_GET valores son «sql-se escapó». Por desgracia, esto se hace en un punto central, para todos los módulos están recibiendo todos los datos de sql-escapado! En algunos casos, usted desea que se muestre directamente estos datos para que se enfrentan a un problema: cómo mostrar un sql-escapó de la cadena sin gettng de DB?
    La respuesta es:
    uso stripcslashes (NO stripslashes!!)

    http://php.net/manual/en/function.stripcslashes.php

    OriginalEl autor Peter

  8. -1

    utilizar la siguiente función para quitar barras mientras se muestra en la página HTML:

    stripslashes();

    por ejemplo.
    $html=stripslashes($html);
    O
    $html=stripslashes($fila[«fieldname»]);

    OriginalEl autor Nandkishor Gokhe

  9. -2

    Creo que un número de otras respuestas se perdió la cuestión obvia…

    Está utilizando mysql_real_escape_string ingresado en el contenido (como se debe, si no el uso de declaraciones preparadas).

    Su problema es con el de salida.

    El problema actual es que está llamando html_entity_decode. Sólo stripslashes es todo lo que necesita para restaurar el texto original. html_entity_decode es lo que está arruinando sus cotizaciones, etc, como es el cambio de ellos. En realidad se desea a la salida de html, no sólo texto plano (que es cuando se puede utilizar html_entities, etc). Usted está decodificación de algo que desea codificar.

    Si usted sólo desea que el texto de la versión, puede utilizar las entidades. Si usted está preocupado acerca de la mala etiquetas, utilice striptags y permitir que sólo las etiquetas que quieras (como b, i, etc).

    Por último, recuerde que para codificar y decodificar en el orden correcto. si ejecutó mysql_real_escape_String(htmlentities($str)), entonces usted necesita para ejecutar html_entity_decode(stripslashes($str)). El orden de las operaciones asuntos.

    ACTUALIZACIÓN: no me di cuenta de que html_entity_decode también tiras de barras. No fue claramente documentado en la página, y yo nunca lo atrapó. Todavía se ejecute automáticamente, aunque, como la mayoría de html que me presente quiero izquierda como entidades, e incluso cuando no lo hago, prefiero tomar esa decisión fuera de mi db clase, sobre una base de caso por caso. De esa manera, sé que las barras se han ido.

    Aparece el cartel original se está ejecutando htmlentities (o su programa de entrada, como tinymce está haciendo por él), y él quiere volver a su contenido. Así, html_entity_decode($Str) debe ser todo lo que se requiere.

    usted está equivocado. él no necesita a la franja de barras. Ne necesita agregar correctamente. Cura fallecimiento, no el síntoma.
    Él NO necesita de la tira de las barras, mientras corría de escape de la cadena de la primera. Él codificado, ahora él tiene que decodificar para deshacerse de las barras en la salida. De ahí el \ aparecen antes de la &quot;.
    Usted no tiene idea de cómo la cosa funciona. Así que mejor prohibición de sí mismo de responder hasta que se aprende un poco. No stripping es necesario. Pruébelo usted mismo.
    Por último, recuerde que para codificar y decodificar en el orden correcto. si ejecutó mysql_real_escape_String(htmlentities($str)), no decodeing acción necesaria. Vaya usted a saber. si no desea que las entidades no codifican. Si usted lo hizo – ¿por qué para decodificar?
    Mi clase de base de datos se ejecuta real_escape_string antes de cada inserto. Con el fin de deshacerse de las barras en la parte delantera de la cita, tengo que correr stripslashes, o las barras se escapó. Estoy totalmente de saber cómo funciona – escribo estas cosas todo el tiempo. Está tratando de conseguir su html atrás, hay barras. Cómo otros que stripslashes ¿usted planea hacer esto sin complicar? Necesita para asegurarse de que tiene las entidades de volver en primer lugar, aunque! El problemas es que se está ejecutando tira primero, él debe estar ejecutando decodificar primera.

    OriginalEl autor Cryophallion

Dejar respuesta

Please enter your comment!
Please enter your name here