mysql - De quoi ai-je besoin pour échapper lors de l'envoi d'une requête?

Translate

Lorsque vous exécutez une requête SQL, vous devez nettoyer vos chaînes ou 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 adéquat? 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 élégantes en Perl, Java et PHP.

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

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

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

La source
Translate

J'échapperais aussi aux commentaires (double tiret)

--
La source
Translate

Une bonne chose à utiliser en PHP est leAOP. La sécurisation de votre SQL (et de tous vos trucs SQL en général) nécessite beaucoup de conjectures. Il prend en charge les instructions préparées, qui contribuent grandement à contrecarrer les attaques par injection SQL.

Une excellente introduction à l'AOP est incluse dans le livreL'anthologie PHP 101 trucs, astuces et astuces essentiels par Davey Shafik etc. 2nd Ed. Rend l'apprentissage un jeu d'enfant et constitue une excellente référence. Je n'ai même plus à penser à autre chose que la requête SQL réelle.

La source
Translate

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 amysql_real_escape_stringetajoute des barres obliques.

La source
Translate

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

La source
Translate

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

Ça y est, profitez-en! (j'espère que le message enverra correctement des traits de soulignement et non & # 95;)

La source
Translate

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

La source
King Lee
Translate

Utilisez des déclarations préparées.

La source
Translate

Dans une requête MySQL, lorsque vous utilisez LIKE, assurez-vous également d'échapper les caractères "_" car il n'est pas échappé par mysql_real_escape_string.

Pour référence, vérifiezici

La source
BCS
Translate

l'API MySQL C a sa propremysql_escape_string(). Il serait préférable de l'utiliser ou de son équivalent.

La source
Bob
Translate

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

Sinon, quelques "mauvais" caractères en plus de ce que vous avez mentionné seraient des points-virgules (;) et des commentaires (- et / * * /).

La source