Failles sql lié au paramètre de l'url
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 ?
-