Il y a généralement moyen de modifier le comportement des scripts php en mettant certains infos dans les champs d'un formulaire.
On prend le cas le plus basique de chez basique. Le formulaire d'identification avec stockage des infos dans une base MySQL ! Un champ login, un champ password.
Généralement quand tu débutes avec ce genre de trucs tu recupères les données de tes champs via $_POST['login'] et $_POST['password'], et tu colles tout ça dans une requete MySQL mal fichue (pas de quotes, etc...).
"SELECT * FROM users WHERE login=".$_POST['login']." AND password=".$_POST['password']
Et tu testes si ça renvois quelque chose pour donner ou non acces a la page. La requete est peut-etre mal fichue, mais dans l'ensemble, ça ne parait pas poser de problème particulier de sécurité. Et pourtant si ... imagines que tu ais mis dans le champs password :
1 AND 1=1
La requete devient
SELECT * FROM users WHERE login=xxx AND password=1 AND 1=1
En gros, tu as une requete qui dis : selectionnes tout ou c'est vrai. Bref, il selectionne tout et le gars rentre dans la page sans meme s'etre cassé la tete.
Cas encore plus vicieux ... dans le champs login tu mets :
1; DROP TABLE `users`; COMMIT; --
La requete devient
SELECT * FROM users WHERE login=1; DROP TABLE `users`; COMMIT; -- AND password=1 AND 1=1
Une requete qui se transforme en trois requete, et ta table users qui disparait ! Et même pas de message d'erreur car la partie apres le -- est commenté.
Pour palier à ce genre de probleme il faut bien construire ses requetes pour emmerder le vilain mechant potentiel :
SELECT * FROM `users` WHERE `login` = 'xxx' AND `password` = 'yyyyy'
Secondo il faut vérifier le login, et le password entré dans le champ avant de les passer dans la requete. Pour les vérifications il faut tout d'abord virer tous les caractères ', ou tout du moins les transformet en \'. Pourquoi ? Pour obliger le vilain à mettre ses donnees vicieuses entre apostrophes :
1' AND 1=1
Si tu transforme le ' en \' la requete sql devient
SELECT * FROM `users` WHERE `login` = 'xxx' AND `password` = '1\' AND 1=1
Ce qui n'est pas une requete valide car il n'y a pas d'apostrophe de fin. bref MySQL ne va rien faire.
Ensuite il faut se prévenir des --, et autres ; ... bref il faut tripatouiller les infos pour etre sur que c'est de la forme demandée.
A chaque fois que l'on demande des infos venant de l'utilisateur, il faut absolument penser à un systeme qui ne soit pas détournable, et tester toutes les infos. C'est faisable, mais ça demande de farfouiller sur le net, et de faire des tests ... beaucoup de tests