On ne parle pas ici de la sécurité des mots de passe.
Premièrement :
\' or login = substr(\'administrateur\', 2, 14)
C'est un mot de passe absolument valide sous Windows par exemple. Et au contraire, il est très content, car on mélanges lettres, chiffres et caractères étendus.
Deuxièmement :
Ici, la question n'est pas de savoir si le mot de passe est "toto", mais si l'utilisateur tente une injection lorsqu'il saisi son mot de passe, ou toute autre information, dans un formulaire.
Les méthodes que tu indique à propos des contrôles de mot de passe ne s'appliquent pas par exemple à une adresse postale ou un message sur un forum, dans lequel on doit pouvoir taper n'importe quel caractère.
Troisièmement :
La non-utilisation de requêtes paramétrées est la principale source de failles de sécurité dans les applications (web ou non d'ailleurs). Même pour la moindre requête, même si les données proviennent d'un fichier de paramètres, de la base de données elle-même ou autre, il faut systématiquement utiliser les requêtes paramétrées. C'est une habitude de développement qu'il faut prendre, pas un truc à dépoussiérer une fois de temps en temps quand on s'en sort pas avec une séquence d'échappement de caractères.
Quatrièmement, et dernièrement :
Que ce soit SQL Server, Oracle, MySQL ou n'importe quel SGBD, les requêtes paramétrées sont "infiniment" plus performances.
En effet, l'interprétation de la requête SQL, le calcul du plan d'exécution et le choix des index est, pour la plupart des requêtes, de loin ce qui prends le plus de temps.
Par conséquent, l'interprétation des requêtes est mise en cache, ainsi, que le plan d'exécution et les index.
Ce cache à pourtant une limite : lorsque deux requêtes strictement identiques sont reçues, alors il est utilisé. Mais si une seul caractère change, alors la requête doit être ré-interprétée depuis le début.
Ainsi :
select * from matable where login = '@login' and password = '@password'
=> Ne sera interprétée qu'une et une seule fois, quelles que soient les valeurs de @login et @password.
En revanche :
select * from matbale where login = 'toto' and password = 'titi';
et
select * from matbale where login = 'toto2' and password = 'titi2';
Sont deux requêtes parfaitement différentes, et nécessitent d'être interprétées toutes les deux. Ceci implique ensuite qu'elles sont chargées en cache... et par conséquent qu'elles viennent prendre la place d'autres requêtes éventuellement paramétrées, qui devront alors être ré-interprétées la fois suivante.
Ne pas utiliser les requêtes paramétrées, au niveaux performances, c'est donc parfaitement catastrophique, exactement comme sur le plan de la sécurité et de la lisibilité.
Maintenant, si tu préfères ne pas les utiliser, libre à toi. Mais ne viens pas chouiner un jour si tu as des problèmes avec ton employeur s'il se rend compte de la merde que tu fais.
Partager