COURS 9 : Developpement web : un peu de sécurité

Transcription

COURS 9 : Developpement web : un peu de sécurité
COURS 9 : Developpement web : un peu de sécurité
INJECTION SQL
Une injection SQL est un type d'exploitation d'une faille de sécurité d'une application WEB. On va
injecter une requête SQL non prévue par le système et pouvant compromettre sa sécurité.
Exemple : dans un formulaire de mise a jour du nom de l'utilisateur, si l'utilisateur saisit : d'estaing,
la requête suivante :
$requete = "update salaries set nom='$nom' where idsalaries=$id" ;
devient :
update salaries set nom='d'estaing' where idsalaries=3
Ce qui va provoquer une erreur lors de son excécution
De la même manière dans un champ login, l'utilisateur peut saisir : ' or 1=1#, et la requête :
$query = "SELECT * FROM salaries where login='$login' and password='$pass'" ;
devient :
SELECT * FROM salaries where login='' or 1=1#' and password='$pass'
toutes les instructions après le # ne sont pas interprétées donc la requête retournera toujours VRAIE
Comment se protéger ?
PDO->prepare suivi de PDO - >execute, vous protègera contre les injections SQL (n’utilisez pas
directement PDO-> query sauf si votre requête SQL ne contient pas de variable).
Les fonctions PHP mysql_real_escape_string et addslashes permettent comme
PDO->prepare d’ajouter des caractères d’échappement, « \ » devant les caractères réservés.
Si vous utilisez une base mysql, il est préférable d’utiliser la fonction dédiée
mysql_real_escape_string.
Sinon, addslashes fonctionnera aussi mais rajoutera plus de « \ » devant les caractères spéciaux.
Notez que si la directive PHP magic_quotes_gpc est à on dans le fichier php.ini , elle appelle
addslashes() sur toutes les données GET, POST et COOKIE ( ce qui est le cas chez de nombreux
hébergeurs).
Remarque :
Les messages de debug qui sont utiles dans un site en développement sont à bannir d’un site en
production... en affichant l’erreur SQL avec les requêtes, vous donnez trop d'informations.
Si vous utilisez PDO, il suffit de commenter la ligne :
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) ;
Sinon vous devez supprimer tous les mysql-error()
La faille XSS
La faille XSS, a l’origine CSS (Cross Site Scripting) changé pour ne pas confondre avec le
CSS des feuilles de style (Cascading Style Sheet), est un type de faille de sécurité des sites Web,
que l’on trouve dans les applications Web mal sécurisées.
Le principe de cette faille est d’injecter un code malveillant en langage de script dans un site
web vulnérable, par exemple en déposant un message dans un forum qui redirige l’internaute vers
un faux site (phising) ou qui vole des informations (cookies).
La détection de la présence d’une faille XSS peut se faire par exemple en entrant un script
Javascript dans un champ de formulaire ou dans une URL :
<script>window.location="http://www.google.fr"</script>
Ce script redirige le visiteur vers la page google, mais on peut le rediriger vers un site malveillant.
Lorsque l'on va afficher le champ, on sera redirigé vers la page google.
Éviter la faille
Plusieurs techniques permettent d’éviter le XSS :
• Utiliser la fonction htmlspecialchars(), il convertit les caractères spéciaux en entités
HTML.
• Utiliser la fonction htmlentities() qui est identique à htmlspecialchars() sauf qu’elle filtre
tout les caractères équivalents au codage html ou javascript.
• Utiliser strip_tags(), cette fonction supprime toutes les balises.
Par conséquent avant d'afficher les données ou de traiter les champs issus d'un formulaire, il faut
impérativement les convertir en entités HTML.
Vous ne devez jamais écrire :
➢ echo ($_GET['nom']) ;
➢ echo ($ligne['salaires']) ;
On doit écrire :
➢ echo (htmlentities($_GET['nom'])) ;
➢ echo (htmlentities($ligne['salaires'])) ;
Il s'agit juste d'un petit aperçu sur la sécurité des sites WEB, si vous voulez plus de renseignements
vous pouvez consulter ce site : http://julien-pauli.developpez.com/tutoriels/securite/developpementweb-securite/