Question

Lorsque vous exécutez une requête SQL, vous devez nettoyer vos chaînes, sinon les utilisateurs peuvent exécuter du SQL malveillant sur votre site Web.

J'ai généralement juste une fonction escape_string(blah), qui :

  • Remplace les échappements (\) avec doubles évasions (\\).
  • Remplace les guillemets simples (') avec un guillemet simple échappé (\').

Est-ce suffisant ?Y a-t-il un trou dans mon code ?Existe-t-il une bibliothèque qui peut le faire rapidement et de manière fiable pour moi ?

J'aimerais voir des solutions gracieuses en Perl, Java et PHP.

Était-ce utile?

La solution

Pour une sécurité, des performances et une exactitude maximales, utilisez des instructions préparées.Voici comment procéder avec de nombreux exemples dans différents langages, dont PHP :

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

Autres conseils

J'échapperais aussi aux commentaires (double tiret)

--

Une bonne chose à utiliser en PHP est le AOP.Cela élimine beaucoup de conjectures liées à la sécurisation de votre SQL (et de tous vos éléments SQL en général).Il prend en charge les instructions préparées, qui contribuent grandement à contrecarrer les attaques par injection SQL.

Une excellente introduction au PDO est incluse dans le livre L'anthologie PHP 101 trucs, astuces et hacks essentiels par Davey Shafik etc.2e édition.Facilite l'apprentissage et constitue une excellente référence.Je n'ai même plus besoin de penser à autre chose qu'à la requête SQL proprement dite.

Quelle langue utilisez-vous ?Il semble que presque tous disposent de fonctions d'échappement SQL intégrées qu'il serait préférable d'utiliser.

Par exemple, PHP a mysql_real_escape_string et ajoute des cils.

Il est préférable d'utiliser des instructions préparées avec des espaces réservés.Utilisez-vous PHP, .NET... de toute façon, les instructions préparées offriront plus de sécurité, mais je pourrais fournir un exemple.

En PHP, j'utilise celui-ci et j'apprécierai chaque commentaire à ce sujet :

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

Nécessite une vérification supplémentaire si un champ peut être 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}';
    ";

Voilà, profitez-en !(j'espère que le message enverra correctement les traits de soulignement et non &#95 ;)

Utilisez des requêtes préparées/paramétrées !

Utilisez des déclarations préparées.

Dans la requête MySQL, lorsque vous utilisez LIKE, assurez-vous également d'échapper les caractères "_" car ils ne sont pas échappés par mysql_real_escape_string.

Pour référence, vérifiez ici

l'API MySQL C a sa propre mysql_escape_string().L'utiliser ou son équivalent serait préférable.

Je ne sais pas si MySql prend en charge les requêtes paramétrées, si c'est le cas, vous devriez faire un effort pour suivre cette voie.Cela garantira que les entrées des utilisateurs ne pourront rien faire de malveillant.

Sinon, certains "mauvais" caractères en plus de ce que vous avez mentionné seraient le point-virgule (;) et les commentaires (-- et /* */).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top