¿Qué necesito para escapar cuando envío una consulta?

votos
18

Cuando ejecuta una consulta SQL, debe limpiar sus cadenas o los usuarios pueden ejecutar SQL malicioso en su sitio web.

Normalmente solo tengo una función escape_string (blah), que:

  • Reemplaza escapes ( \) con dobles escapes ( \\).
  • Reemplaza las comillas simples ( ') con una comilla simple escapada ( \').

¿Es esto adecuado? ¿Hay un agujero en mi código? ¿Hay una biblioteca que pueda hacer esto de manera rápida y confiable para mí?

Me gustaría ver soluciones elegantes en Perl, Java y PHP.

Publicado el 05/08/2008 a las 19:45
fuente por usuario
En otros idiomas...                            


11 respuestas

votos
7

Para obtener la máxima seguridad, rendimiento y corrección, use declaraciones preparadas. Aquí se explica cómo hacer esto con muchos ejemplos en diferentes idiomas, incluido PHP:

https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks

Respondida el 05/08/2008 a las 20:38
fuente por usuario

votos
2

También me escaparé de los comentarios (doble guion)

--
Respondida el 05/08/2008 a las 19:46
fuente por usuario

votos
1

Una gran cosa para usar en PHP es el PDO . Se requieren muchas conjeturas al tratar de asegurar su SQL (y todas sus cosas de SQL en general). Admite declaraciones preparadas, que contribuyen en gran medida a frustrar los ataques de inyección de SQL.

Se incluye una excelente introducción a PDO en el libro The PHP Anthology 101 Essential Tips, Tricks & Hacks de Davey Shafik, etc. 2nd Ed . Facilita el aprendizaje y es excelente como referencia. Ni siquiera tengo que pensar en nada más que en la consulta SQL real.

Respondida el 05/08/2008 a las 20:28
fuente por usuario

votos
0

En la consulta de MySQL, al usar LIKE, también asegúrese de escapar de los caracteres "_" ya que mysql_real_escape_string no lo escapa.

Como referencia, consulte aquí

Respondida el 14/10/2008 a las 05:57
fuente por usuario

votos
0

Use declaraciones preparadas.

Respondida el 16/09/2008 a las 22:14
fuente por usuario

votos
0

la API C de MySQL es propia mysql_escape_string(). Usarlo o su equivalente sería lo mejor.

Respondida el 14/08/2008 a las 18:59
fuente por usuario

votos
0

¡Utilice consultas preparadas / parametrizadas!

Respondida el 05/08/2008 a las 20:55
fuente por usuario

votos
0

En PHP, estoy usando este y agradeceré cada comentario al respecto:

function quote_smart($valeur) 
{ 
    if (get_magic_quotes_gpc()) 
        $valeur = stripslashes($valeur); 

    if (!is_numeric($valeur)) 
        $valeur = mysql_real_escape_string($valeur); 

    return $valeur; 
}


$IdS = quote_smart($_POST['theID']); 
$sql = " 
SELECT * FROM Students 
WHERE IdStudent={$IdS}; 
";

Necesita una verificación más si un campo puede ser NULL:

$picture = NULL;
$theidyouwant = 7;
$Name = 'WOOD';


if(is_null($picture)) 
    $p = 'NULL'; 
else
    $p = "'".quote_smart($picture)."'"; 

$IdS = quote_smart($theidyouwant);

$requete = "SELECT * FROM Students
    WHERE IdStudent={$IdS} AND
    PictureStudent={$p} AND
    NameStudent='{$Name}';
    ";

Eso es, ¡disfruta! (Espero que la publicación envíe correctamente guiones bajos y no & # 95;)

Respondida el 05/08/2008 a las 20:21
fuente por usuario

votos
0

Es mejor utilizar declaraciones preparadas con marcadores de posición. ¿Está usando PHP, .NET ... de cualquier manera, las declaraciones preparadas proporcionarán más seguridad, pero podría proporcionar una muestra.

Respondida el 05/08/2008 a las 19:48
fuente por usuario

votos
0

¿Qué idioma están usando? Parece que casi todos ellos tienen funciones de escape SQL integradas que sería mejor usar.

Por ejemplo, PHP tiene mysql_real_escape_string y addslashes .

Respondida el 05/08/2008 a las 19:46
fuente por usuario

votos
-1

No estoy seguro si MySql admite consultas parametrizadas, de ser así, debería hacer un esfuerzo para seguir esta ruta. Esto asegurará que la entrada de los usuarios no pueda hacer nada malicioso.

De lo contrario, algunos caracteres "malos" además de los que mencionó serían punto y coma (;) y comentarios (- y / * * /).

Respondida el 05/08/2008 a las 19:49
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more