Pregunta: Es la prevención de XSS (cross-site scripting) como simple usando strip_tags en cualquier guardan campos de entrada y ejecuta htmlspecialchars en cualquier muestra de salida … y la prevención de de Inyección de SQL mediante el uso de PHP PDO declaraciones preparadas?

He aquí un ejemplo:

//INPUT: Input a persons favorite color and save to database
//this should prevent SQL injection ( by using prepared statement)
//and help prevent XSS  (by using strip_tags)
$sql = 'INSERT INTO TABLE favorite (person_name, color) VALUES (?,?)';
$sth = $conn->prepare($sql);
$sth->execute(array(strip_tags($_POST['person_name']), strip_tags($_POST['color'])));


//OUTPUT: Output a persons favorite color from the database
//this should prevent XSS (by using htmlspecialchars) when displaying
$sql = 'SELECT color FROM favorite WHERE person_name = ?';
$sth = $conn->prepare($sql);
$sth->execute(array(strip_tags($_POST['person_name'])));
$sth->setFetchMode(PDO::FETCH_BOTH);
while($color = $sth->fetch()){
  echo htmlspecialchars($color, ENT_QUOTES, 'UTF-8');
}
No acababa de coger – ¿vas a mysql_query ($save_to_database valor? A continuación, usted todavía necesita para llamar a mysql_real_escape_string() antes de enviar su consulta, de lo contrario usted no está protegido de las inyecciones de SQL (que no es XSS, de nuevo)
Está usted seguro de eso? Él está usando sentencias preparadas.

OriginalEl autor TimTim | 2010-01-03

6 Comentarios

  1. 8

    Es aún más simple. Sólo htmlspecialchars() (con el estilo de las comillas y el conjunto de caracteres) en la controlada por el usuario de entrada es suficiente. El strip_tags() sólo es útil si ya quieres desinfectar los datos antes de procesar y guardar en la base de datos, que a menudo no se utiliza en el mundo real. El código HTML no se daño en la fuente de PHP, pero el código PHP puede hacer esto si usted utiliza eval() en no potable controlada por el usuario de entrada o ese tipo de cosas mal.

    Sin embargo, esto no nos salva de Las inyecciones de SQL, pero esa es otra historia.

    Actualización: para obtener limpio de usuario de entrada de la solicitud para evitar magic quotes en el usuario controla la entrada, puede utilizar la siguiente función:

    function get_string($array, $index, $default = null) {
        if (isset($array[$index]) && strlen($value = trim($array[$index])) > 0) {
             return get_magic_quotes_gpc() ?  stripslashes($value) : $value;
        } else {
             return $default;
        }
    }

    que puede ser utilizado como:

    $username = get_string($_POST, "username");
    $password = get_string($_POST, "password");

    (usted puede hacer simliar para get_number, get_boolean, get_array, etc)

    Para preparar la consulta SQL para evitar Las inyecciones de SQL, hacer:

    $sql = sprintf(
        "SELECT id FROM user WHERE username = '%s' AND password = MD5('%s')",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password)
    ); 

    A la pantalla de control en la entrada para evitar XSS, hacer:

    echo htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
    ¿Cómo puedo modificar también me protege de las inyecciones de SQL, además de XSS?
    Uso mysql_real_esacpe_string(): php.net/manual/en/function.mysql-real-escape-string.php. Por otra parte, también es necesario tomar get_magic_quotes_gpc() en consideración. Si este devuelve true en el entorno de PHP, usted necesita para ejecutar stripslashes() en la entrada así.
    Si he utilizado PDO declaraciones preparadas, ¿ que evitar la inyección SQL?
    Oh, ciertamente, si se utiliza de la manera correcta.
    será actualizado mi post original me protege de todas las actividades maliciosas de los usuarios (XSS, SQL injection y cualquier otra cosa que tal vez no conozca)?

    OriginalEl autor BalusC

  2. 5

    Depende de dónde y cómo desea utilizar los datos de usuario. Usted necesita saber el contexto que desea insertar los datos y la meta caracteres de ese contexto.

    Si sólo desea permitir que el usuario ponga el texto en su página web, htmlspecialchars es suficiente para escapar de la meta de HTML caracteres. Pero si usted desea permitir a ciertos HTML o desea incrustar datos de usuario existentes en los elementos HTML (como una dirección URL en un A/IMG elemento), htmlspecialchars no es suficiente, ya que no está en el contexto de HTML, sino en la dirección URL contexto.

    Para entrar <script>alert("xss")</script> en una dirección URL de la imagen de campo producirá:

    <img src="&lt;script&gt;alert(&quot;xss&quot;)&lt;/script&gt" />

    Pero entrar en javascript:alert("xss") tendrá éxito:

    <img src="javascript:alert(&quot;xss&quot;)" />

    Aquí usted debe echar un vistazo a la fabulosa XSS (Cross Site Scripting) Hoja de Trucos a ver qué contextos tus datos de usuario puede ser inyectado en.

    hace actualizado mi post original me protege de su ejemplo de no usar una etiqueta de secuencia de comandos?
    Sólo depende del contexto en el que usted desea utilizar los datos.
    ¿cómo se puede prevenir ese tipo de ataque? Estoy leyendo el owasp enlace que te dio, pero no veo donde dice cómo prevenir los ataques..
    Validar la entrada.

    OriginalEl autor Gumbo

  3. 4

    strip_tags no es necesario. En la mayoría de los casos strip_tags sólo es irritante, porque algunos de sus usuarios lo desea, puede utilizar < y > en sus textos. Sólo uso htmlspecialchars (htmlentities o si usted lo prefiere) antes de eco de los textos para el navegador.

    (No olvides mysql_real_esacpe_string antes de insertar nada en su base de datos!)

    OriginalEl autor Emil Vikström

  4. 3

    La regla general/meme es «Filtro de Entrada, Salida de fuga.» El uso de strip_tags en tu entrada para quitar todo el código HTML es una buena idea para la entrada de filtrado, pero usted debe ser lo más estricto posible en lo que de entrada le permiten. Por ejemplo, si un parámetro de entrada sólo se debe ser un número entero, solo se aceptará una entrada numérica y siempre convertirlo a entero antes de hacer nada con ella. Bien examinada filtro de entrada de la biblioteca va a ayudar mucho aquí; uno que no es específico para un determinado marco es Inspekt (que escribí, así que estoy un poco sesgado).

    Para la salida, htmlspecialchars debe ser capaz de escapar de los ataques de XSS, pero sólo si se pasan los parámetros correctos. Usted debe aprobar el presupuesto de escapar de estilo y un conjunto de caracteres.

    En general, este debe eliminar los ataques de XSS:

    $safer_str = htmlspecialchars($unsafe_str, ENT_QUOTES, 'UTF-8');

    Sin pasar ENT_QUOTES como el segundo parámetro, solo cita los caracteres que no están codificados. Además, los ataques de XSS han demostrado que cuando el conjunto de caracteres correcto no se pasa (normalmente UTF-8 es la adecuada). htmlspecialchars debe siempre ser llamado con ENT_QUOTES y un parámetro charset.

    Tenga en cuenta que PHP 5.2.12 contiene una solución para un multibyte ataque XSS.

    Usted puede encontrar el OWASP ESAPI PHP puerto interesante y útil, aunque la versión de PHP no es completa AFAIK.

    así es mi actualizado el post original que me proteja de todo mal?
    Parece ser relativamente seguro, sí.
    No creo que strip_tags es una buena idea. Rompe algunos legítimo de entrada, pero no es suficiente para la seguridad. Sólo htmlspecialchars() es suficiente y no tiene pérdida.

    OriginalEl autor Funkatron

  5. 3

    Sí, utilizando PDO declaraciones preparadas protege de la inyección de SQL. El ataque de inyección SQL se basa en el hecho de que los datos enviados por el atacante es tratada como parte de la consulta. Por ejemplo, el atacante envía la cadena «a’ o ‘a’=’a» como su contraseña. En lugar de la totalidad de la cadena ser en comparación con las contraseñas en la base de datos, se incluye en la consulta, por lo que la consulta se convierte en «SELECT * FROM users where login=’joe’ Y la contraseña=’a’ o ‘a’=’a'». La parte del atacante entrada es interpretada como una parte de la consulta. Sin embargo, en caso de declaraciones preparadas, le está diciendo al motor de SQL específicamente, ¿qué parte es la consulta, y qué parte es de datos (mediante la configuración de los parámetros), así que no hay tal confusión es posible.

    No, el uso de strip_tags no protege siempre de cross-site scripting. Considere el siguiente ejemplo. Digamos que su página contiene:

    <script>
    location.href='newpage_<?php echo strip_tags($_GET['language']); ?>.html';
    </script>

    El atacante envía la solicitud con «idioma» set «‘;somethingevil();'» . strip_tags() devuelve estos datos como es (no hay etiquetas en ella). El código de la página se convierte en:

    <script>
    location.href='newpage_';somethingevil();'.html';
    </script>

    somethingevil() es ejecutada. Reemplazar somethingevil() con el actual código de vulnerabilidad de XSS.

    Su último ejemplo con htmlspecialchars() proteger en contra de esto, porque va a escapar de las comillas simples. Sin embargo he visto incluso más raro de los casos de los datos proporcionados por el usuario en el interior de código JavaScript, en donde ni siquiera dentro de una cadena entre comillas. Creo que fue en la variable o nombre de la función. En este último caso no hay ninguna cantidad de escapar probablemente va a ayudar. Yo piensan que es mejor evitar el uso de la entrada del usuario para generar el código JavaScript.

    <script> ha CDATA modelo de contenido, que no admite entidades. Tienes que escapar de </ como <\/. json_encode() hace esto.

    OriginalEl autor Alla

  6. 2

    Respuesta Simple : no

    Respuesta larga : Hay maneras de inyectar xss que PHP strip_stags no se puede evitar.

    Para una mejor protección intentar HTML purifier

    Gracias por la sugerencia! Yo no creo que sea la única solución a este problema exacto, pero es cetainly bueno si quiero permitir que algunos de formato HTML.
    Imaginemos que tenemos una página con sólo <?echo strip_tags($_GET['query']);?> en su cuerpo. Lo de las inyecciones son posibles aquí?
    .. cuando strip_tags() se utiliza sin htmlspecialchars().
    Puede XSS ser alcanzado incluso si htmlspecialchars se utiliza en la salida?
    por favor nota – lo que escribió no es mi caso. Yo estaba hablando sobre el uso de strip_tags en los datos INTRODUCIDOS, no EMITIDA (muestra) de datos

    OriginalEl autor MaxiWheat

Dejar respuesta

Please enter your comment!
Please enter your name here