Pregunta

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 los escapes (\) con doble escape (\\).
  • Reemplaza comillas simples (') con una comilla simple escapada (\').

¿Es esto adecuado?¿Hay un agujero en mi código?¿Existe alguna biblioteca que pueda hacer esto de forma rápida y fiable por mí?

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

¿Fue útil?

Solución

Para máxima seguridad, rendimiento y corrección, utilice declaraciones preparadas.A continuación se explica cómo hacer esto con muchos ejemplos en diferentes idiomas, incluido PHP:

https://stackoverflow.com/questions/1973/cuál-es-la-mejor-manera-de-evitar-ataques-de-inyección-sql

Otros consejos

También escaparía de los comentarios (doble guión)

--

Una gran cosa para usar en PHP es el DOP.Se eliminan muchas conjeturas al tratar de proteger su SQL (y todo su material SQL en general).Admite declaraciones preparadas, que contribuyen en gran medida a frustrar los ataques de inyección SQL.

En el libro se incluye una excelente introducción a la DOP. La antología PHP 101 consejos, trucos y trucos esenciales de Davey Shafik, etc.2da edición.Facilita el aprendizaje y es excelente como referencia.Ya ni siquiera tengo que pensar en nada más que en la consulta SQL real.

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

Por ejemplo, PHP tiene mysql_real_escape_string y agrega pestañas.

Es mejor que utilice declaraciones preparadas con marcadores de posición.¿Está utilizando PHP, .NET? De cualquier manera, las declaraciones preparadas brindarán más seguridad, pero podría proporcionarle una muestra.

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 todo, disfruta!(Espero que la publicación envíe guiones bajos correctamente y no _)

¡Utilice consultas preparadas/parametrizadas!

Utilice declaraciones preparadas.

En la consulta MySQL, cuando utilice LIKE, asegúrese también de evitar los caracteres "_", ya que mysql_real_escape_string no los escapa.

Como referencia, consulte aquí

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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top