Sql , comment éviter les injections de code malicieux par les formulaires

+7 votes
4,214 vues
question 5 Juillet 15 dans Sql Phpmyadmin par jarda (249 points)  

j'écris un module de formulaire. Les données saisies sont insérées dans une table SQL

Je lis qu'un attaquant peut injecter du code.

  1. comment ferait il ?
  2. comment l'éviter ?
merci
commentée 5 Juillet 15 par BenoitXVII (927 points)  
Question très vague sans divulguer votre code :))
https://fr.wikipedia.org/wiki/Injection_de_code_dans_les_applications_web
commentée 5 Juillet 15 par jarda (249 points)  
des insert into ... on duplicate. Excellente page, merci. Mais n'étant pas expert, j'aimerais que SAV vérifie mon code

1 Réponse

+5 votes
réponse 5 Juillet 15 par paco (436 points)  

Le principe de l'injection est d'espérer que le code est mal écrit et que des données saisies sont fusionnées telles quelles

exemple , 

on saisi "Jean Valjean"  : insert into noms( nom ) values ( 'Jean Valjean') ;

mais 

si la saisie est "Jean Valjean') ; drop table users ; select 1.2 where ( 1 = 1"

on aura : insert into noms( nom ) values ( 'Jean Valjean') ; drop table users ; select 1.2 where ( 1 = 1') ;

qui est correct pour mysql mais pas pour vous.

Solution : il faut quoter proprement le code entré , ce qui aurai plutôt donné :

insert into noms( nom ) values ( 'Jean Valjean'') ; drop table users ; select 1.2 where ( 1 = 1') ;

l'apostrophe doublé préserve la falsification

programmez vous php 5.3 ou plus avec l'extension mysqli ? Voyez la documentation de prepare

$input = "Jean Valjean') ; drop table users ; select 1.2 where ( 1 = 1" ;

$sth = $dbh->prepare("insert into noms( nom ) values ( ? )");
$sth->bind_param($input, $name);
$sth->execute();
select * from noms where nom like '%Valjean%' ;
nom
Jean Valjean
Jean Valjean') ; drop table users ; select 1.2 where ( 1 = 1
2 rows , 0 warning, 0 errors.

plus aucune saisie ne peut être détourner

commentée 5 Juillet 15 par paco (436 points)  
je n'ai pas donné d'exemple de falsification efficiente... On peut récupéré les données si on a la chance de lire un fichier écrit par php en + du webmaster arboricole
commentée 5 Juillet 15 par ladmin (2,272 points)  
@Paco : bien répondu et merci pour le non-exemple. Je suis sûr qu'il marche encore avec des sites en 5.2 pas mis à jour . C'est un bon début de réponse type , on va bientôt y arriver Pourriez vous svp ajouter un exemple avec pdo. Merci pour tous
commentée 5 Juillet 15 par paco (436 points)  
@ladmin: pour pdo, il faut modifier la connection, faire 2 setAttribute et tenir compte de toute la documentation. Ca dépasse l'injection. Mysqli suffit.
Feel free to ask and answer in english

Bienvenue sur les FAQ de 123.fr, posez vos questions ou répondez à celles des autres usagers.

...