Failles sql lié au paramètre de l'url
cocodu67...
Messages postés
3178
Date d'inscription
Statut
Membre
Dernière intervention
-
cocodu67... Messages postés 3178 Date d'inscription Statut Membre Dernière intervention -
cocodu67... Messages postés 3178 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je suis en train de développer un site web et un ami m'a dit que sur toutes les pages où je passe un paramètre via l'url il a réussit à accéder à la base de données.
Pour le système de news je faisais un truc du genre abcabc.fr?id=6 puis je contrôle si le paramètre après "id" est un nombre, si c'est vrai alors je continu d'exécuter le code.
Voici le code en lui même :
Ensuite dans la requête je fais .... WHERE id = :ID;
Et j'ajoute un paramètre
Je pensais que le fait de contrôle si c'est un nombre me protégera mais visiblement ce n'est pas le cas.
Pouvez vous m'aider ?
Merci d'avance
Je suis en train de développer un site web et un ami m'a dit que sur toutes les pages où je passe un paramètre via l'url il a réussit à accéder à la base de données.
Pour le système de news je faisais un truc du genre abcabc.fr?id=6 puis je contrôle si le paramètre après "id" est un nombre, si c'est vrai alors je continu d'exécuter le code.
Voici le code en lui même :
<?php
include ("q4s65v21vfdf6ve89rf85.php");
mysql_query("SET NAMES UTF8");
if (is_numeric($_GET['id'])) // sécurité qui contrôle le paramètre présent dans l'url, si c'est pas un nombre rien ne s'affiche
{
$id = '';
$good = true;
$id = $_GET['id'];
} else {
$good = false;
}
if ($good == true) {
try {
// si $good est à true, l'id est un nombre, donc je continu pour afficher la news
Ensuite dans la requête je fais .... WHERE id = :ID;
Et j'ajoute un paramètre
$req->bindParam(':ID', $id, PDO::PARAM_STR, 4);
Je pensais que le fait de contrôle si c'est un nombre me protégera mais visiblement ce n'est pas le cas.
Pouvez vous m'aider ?
Merci d'avance
1 réponse
-
is_numeric ne te protège pas contre les chaînes exprimées en puissance. Par exemple: "?id=-3e6" passera. Les effets de bords peuvent ouvrir la voie à des failles.
Je te conseille de faire une regexp /^[0-9]+$/ pour vérifier le contenu de ta variable.-
Merci pour le conseil, que je vais appliquer immédiatement. Du coup, j'ai deux questions supplémentaires :
- Les regexp :
Comment créer facilement une expression comme ça ? Par exemple je veux que mon expression ne contient qu'un point et un tiret et des chiffres et lettres, comment "construire" l'expression sans risque de me tromper ? Ou alors si je veux qu'une expression contient par exemple blabla mais pas bloblo donc dfsblablafff ça passe, blablaooobloblo ça ça passe pas dsfghfgdsdfgd ça passe pas.
- Les fonctions de contrôle
Devrais-je utiliser systématiquement mysqli_real_escape_string pour toutes les variables utilisées dans une requête sql ? Si la réponse est non, vaudrait-il mieux utiliser autre chose en plus du regexp ?
-