URL: https://linuxfr.org/forums/programmation-php/posts/%C3%A9viter-les-injections-sql Title: Éviter les Injections SQL Authors: astennu Date: 2005年03月22日T16:19:08+01:00 Tags: Score: 0 Bonjour à tous, Tout d'abord, un petit lien pour sensibiliser les devs php au douloureux problème des injections SQL : [http://www.php.net/manual/fr/security.database.sql-injection.php(...)](http://www.php.net/manual/fr/security.database.sql-injection.php) L'exemple 27-4 fait froid dans le dos : au lieu d'afficher le nom du produit, le hacker réussi à afficher tous les logins/mot de passes stockés dans la base! Afin de remédier à ce problème, j'ai codé trois petites fonctions qui permettraient d'empecher ça : function coreSecureString ($stringValue) { £spaces£ £/spaces£//On isole tout ce qui pourrait être derrière un espace, £spaces£ £/spaces£//pour ne garder que le premier mot £spaces£ £/spaces£$newString = explode(" ", $stringValue); £spaces£ £/spaces£return $newString[0]; } function coreSecureQuery ($Query, $valuesArray) { £spaces£ £/spaces£$securedValuesArray = array (); £spaces£ £/spaces£//On récupère la requête dans le tableau £spaces£ £/spaces£$securedValuesArray[] = $Query; £spaces£ £/spaces£//Pour chaque valeur envoyée, on ajoute des \ devant les " et les ' £spaces£ £/spaces£foreach ($valuesArray as $value) { £spaces£ £/spaces£$securedValuesArray[] = addslashes ($value); £spaces£ £/spaces£} £spaces£ £/spaces£$securedQuery = call_user_func_array ("sprintf", $securedValuesArray); £spaces£ £/spaces£return $securedQuery; } function coreSecureInteger ($integerValue) { £spaces£ £/spaces£//Super simple : on récupère un entier à tous les coups £spaces£ £/spaces£if (settype ($integerValue, "integer")) £spaces£ £/spaces£return $integerValue; £spaces£ £/spaces£else die ("$integerValue is not a valid integer. Execution aborted"); } pour la fonction coreSecureString(), on part du principe qu'il y a forcément des espaces dans une injection SQL. On récupère donc le premier mot de la chaine, et on oublie tout le reste. La fonction coreSecureQuery() mixe une requete avec le tableau de ses arguments, après que chacun d'entre eux aient été "sécurisés" avec la fonction addslashes (), cette dernière ajoutant des \ avant chaque ' ou ". Je pense que cette fonction prend tout son sens dans le cadre de chaines de caractères longues envoyées par l'internaute, comme un message posté dans un forum à l'aide d'un formulaire de saisie. La fonction coreSecureInteger () est terriblement efficace : si l'argument commence par un nombre suivi d'une chaine de caractère, coreSecureInteger () renverra seulement le nombre. Si l'argument commence par un caractère, elle renvoie 0. Un script pour tester tout ça : <?php //Nos fonctions sont stockées dans un fichier à part include 'includes/lib.php'; /********************************* On part du principe que la table 'datas' contient les champs suivants : - id integer - category VARCHAR(32) - member integer - content text *********************************/ $sql = "SELECT * from datas where member = %s and category = \"%s\""; //Le premier argument est un entier, on le sécurise $securedInt = coreSecureInteger ($_GET['arg1']); $arg = array ($securedInt, $_GET['arg2']); //On génère une requête SQL sécurisée $securedSQL = coreSecureQuery ($sql, $arg); echo $securedSQL; /****************************** config.php assure la connection à la base On va utiliser MySQL pour l'exemple ******************************/ include 'includes/config.php' //Instant critique : on envoie la requête au serveur $handle = mysql_query ($securedSQL); echo mysql_error (); //On affiche les infos retournées par le serveur while ($loadedDatas = mysql_fetch_array ($handle)) { £spaces£ £/spaces£echo $loadedDatas[0] ... } ?> J'ai tenté pas mal de possibilités pour injecter du code malveillant, je n'ai pas réussi. Mais je ne suis pas sûr à 100% que ce code soit vraiment sécurisé, il y aurait-il des volontaires pour m'aider à le rendre vraiment sûre? Merci d'avance.

AltStyle によって変換されたページ (->オリジナル) /