Nous avons une autre discussion ici au travail sur l'utilisation de requêtes sql paramétrées dans notre code. Nous avons deux camps dans la discussion : Moi et quelques autres qui disons que nous devrions toujours utiliser des paramètres pour se protéger contre les injections sql et les autres gars qui ne pensent pas que c'est nécessaire. Au lieu de cela, ils veulent remplacer les apostrophes simples par deux apostrophes dans toutes les chaînes de caractères pour éviter les injections sql. Nos bases de données fonctionnent toutes sous Sql Server 2005 ou 2008 et notre code fonctionne sous .NET framework 2.0.
Laissez-moi vous donner un exemple simple en C# :
Je veux qu'on utilise ça :
string sql = "SELECT * FROM Users WHERE Name=@name";
SqlCommand getUser = new SqlCommand(sql, connection);
getUser.Parameters.AddWithValue("@name", userName);
//... blabla - do something here, this is safe
Alors que les autres gars veulent faire ça :
string sql = "SELECT * FROM Users WHERE Name=" + SafeDBString(name);
SqlCommand getUser = new SqlCommand(sql, connection);
//... blabla - are we safe now?
Où la fonction SafeDBString est définie comme suit :
string SafeDBString(string inputValue)
{
return "'" + inputValue.Replace("'", "''") + "'";
}
Maintenant, tant que nous utilisons SafeDBString sur toutes les valeurs de chaîne dans nos requêtes, nous devrions être en sécurité. N'est-ce pas ?
Il y a deux raisons d'utiliser la fonction SafeDBString. Premièrement, c'est la façon de faire depuis l'âge de pierre, et deuxièmement, il est plus facile de déboguer les instructions SQL puisque vous voyez la requête exacte qui est exécutée sur la base de données.
Ainsi donc. Ma question est de savoir s'il suffit vraiment d'utiliser la fonction SafeDBString pour éviter les attaques par injection sql. J'ai essayé de trouver des exemples de code qui enfreint cette mesure de sécurité, mais je n'en trouve aucun.
Y a-t-il quelqu'un qui puisse le casser ? Comment le ferais-tu ?
EDIT : Pour résumer les réponses jusqu'à présent :
- Personne n'a encore trouvé un moyen de contourner le SafeDBString sur Sql Server 2005 ou 2008. C'est bien, je pense ?
- Plusieurs réponses ont souligné que vous obtenez un gain de performance en utilisant des requêtes paramétrées. La raison en est que les plans de requête peuvent être réutilisés.
- Nous sommes également d'accord pour dire que l'utilisation de requêtes paramétrées donne un code plus lisible et plus facile à maintenir.
- En outre, il est plus facile de toujours utiliser des paramètres que d'utiliser différentes versions de SafeDBString, des conversions de chaînes de caractères en nombres et des conversions de chaînes de caractères en dates.
- En utilisant les paramètres, vous obtenez une conversion automatique des types, ce qui est particulièrement utile lorsque nous travaillons avec des dates ou des nombres décimaux.
- Et enfin : N'essayez pas de faire la sécurité vous-même comme l'a écrit JulianR. Les fournisseurs de bases de données consacrent beaucoup de temps et d'argent à la sécurité. Nous ne pouvons pas faire mieux et nous n'avons aucune raison d'essayer de faire leur travail.
Ainsi, alors que personne n'a été en mesure de briser la simple sécurité de la fonction SafeDBString, j'ai obtenu beaucoup d'autres bons arguments. Merci !