Bonjour à tous,
Towl a commencé de me parler de failles MySql ici: discussion
Quelqu'un peut-il m'expliquer un peu mieux les failles connues et les moyens des les éviter svp?
A+
-----
Bonjour à tous,
Towl a commencé de me parler de failles MySql ici: discussion
Quelqu'un peut-il m'expliquer un peu mieux les failles connues et les moyens des les éviter svp?
A+
Tiens on parle de moi
Les failles SQL sont généralement des SQL Injections. Le but est d'injecter des données spécialement formée afin de modifier les requêtes.
Un petit exemple valant mieux qu'un long discours (volontairement ultra simpliste et assez peu réel) :
Voici un code vulnérable à ce type d'attaque :
On suppose que $user et $pass sont des données entrées dans un formulaire.Code:$query = 'SELECT user, pass FROM users WHERE user=$user and pass=$pass'; $res = mysql_query($squery); if(mysql_num_rows($res) != 1){print("Bad login";}
Supposons que l'on entre ces données la :
$user = admin or 1 = 1 limit 1 #
pass = titi
On a alors $query qui devient :
SELECT user, pass FROM users WHERE user=admin or 1 = 1 limit 1 # and pass=titi
Le # étant le commentaire avec MySQL (à vérifier ), on a alors la requete :
SELECT user, pass FROM users WHERE user=admin or 1 = 1 limit 1
Et cette requete à la particularité de toujours renvoyer 1 seule ligne si l'utilisateur existe. On se retrouve donc connecté en administrateur
La faille vient donc des données entrées par l'utilisateur. La s'en est une simple, mais elle peuvent devenir tres vite plus sioux (la par exemple il est possible de s'amuser à vider toutes tes tables).
C'est pourquoi il est nécessaire de n'authoriser que les caractères nécessaires lors des paramètres récupéré d'un utilisateur (voir du coté des expression régulieres):
- un nom d'utilisateur : que des lettres, des chiffres, et peut etre un espace
- une date : que des chiffres et des /
- penser à echapper les caractères (addslashes() et / ou mysql_real_escape_string())
Une meilleure version du code si dessous (flemme de voir comment le nom des vrai méthode en php)
Comme tu le vois, cela fait un code un peu plus lourd, mais bon en général, on fait des fonctions comme valid_int(), valid_str, ... qui fera tout le nécessaire.Code:/* On ajoute les \ si les magic quotes sont à off */ if (! $magic_quotes) { $user = addslashes($user); $pass = addslashes($pass); } /* On vérifie que user ne contient pas de caracteres interdit */ /* Expression reguliere : [a-zA-Z0-9]+ (un ou plusieur chiffre / lettre maj-min */ if (! preg_match("[a-zA-Z0-9]+", $user) { print "Bad Username"; } $query = "SELECT user, pass FROM users WHERE user='$user' and pass='$pass'"; $res = mysql_query($squery); if(mysql_num_rows($res) != 1){print("Bad login";}
La c'était un exemple avec le SQL, mais toute les fonctions sont potentiellement vulnérable : fopen(), system()...
Merci pour la réponse claire et rapide Towl
Ca va clairement compliquer mes codes ça
Je vais mettre ça dans mon fichier de connexion et puis les include feront le resteComme tu le vois, cela fait un code un peu plus lourd, mais bon en général, on fait des fonctions comme valid_int(), valid_str, ... qui fera tout le nécessaire.
A+
Ah oui, j'oubliais l'essentiel quand on parle de faille de sécurité
L'utilisation (ou la tentative d'utilisation) de ces techniques et punie par les articles du code pénal :
323-1
323-2Le fait d'accéder ou de se maintenir, frauduleusement, dans tout ou partie d'un système de traitement automatisé de données est puni de deux ans d'emprisonnement et de 30000 euros d'amende.
Lorsqu'il en est résulté soit la suppression ou la modification de données contenues dans le système, soit une altération du fonctionnement de ce système, la peine est de trois ans d'emprisonnement et de 45000 euros d'amende.
323-3Le fait d'entraver ou de fausser le fonctionnement d'un système de traitement automatisé de données est puni de cinq ans d'emprisonnement et de 75000 euros d'amende.
323-3-1Le fait d'introduire frauduleusement des données dans un système de traitement automatisé ou de supprimer ou de modifier frauduleusement les données qu'il contient est puni de cinq ans d'emprisonnement et de 75000 euros d'amende.
Le fait, sans motif légitime, d'importer, de détenir, d'offrir, de céder ou de mettre à disposition un équipement, un instrument, un programme informatique ou toute donnée conçus ou spécialement adaptés pour commettre une ou plusieurs des infractions prévues par les articles 323-1 à 323-3 est puni des peines prévues respectivement pour l'infraction elle-même ou pour l'infraction la plus sévèrement réprimée.
juriste en plus?
Oula non absolument pas Je connais juste les quelques articles obligatoire dans la sécurité informatique
Ca me permet surtout d'avoir une réponse standard quand je donne certains type d'information, qui me permet d'affirmer qu'il s'agissait d'info à caractère informatif et que je déconseille très fortement l'utilisation de ces méthodes.
La sécurité informatique étant (malheureusement) une activité assez 'sur le fil du rasoir', je préfère me proteger le plus possible dans mes interventions
j'ai une question qui n'a rien à voir (php):
est-ce que tu sais comment connaître la largeur d'un caractère?
je m'explique: j'ai besoin de connaître la longueur d'une chaine en pixel pour un affichage. Pour l'instant j'applique un coéfficient au nombre de lettre mais c'est pas top...
Il est quasiment impossible pour le serveur de connaitre la taille en pixel affichée par un navigateur : un site web ne fait que des suggestions de polices / taille de caractères, c'est le navigateur qui prend la décision finale. Si l'utilisateur n'a pas la police demandée, il va en utiliser une autre. Si l'utilisateur avait demandé d'avoir une police en taille 12 et +, il va augmenter la taille pour correspondre a ces critères.
Bref, ca reste assez aléatoire
Peut etre que le javascript le permet, mais cela m'etonnerais. Mais dans tous les cas, il y a souvent une manière de faire plus propre (fixer les tailles de caractère pour la mise en page n'est jamais très bon)
en fait je vais plutôt utiliser la fonction mysql_real_escape_string():
mysql_real_escape_string(): doc
Oui, c'est la plus adaptée, mais seulement pour les requetes MySQL.
Si tu as des entrées qui te servent ailleurs que pour la base de données, (nom d'un fichier à ouvrir, ou autre), il faut utiliser addslahes().