Failles sql lié au paramètre de l'url

Fermé
cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 4 avril 2024 - 5 juil. 2015 à 14:28
cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 4 avril 2024 - 5 juil. 2015 à 15:50
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 :

<?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
A voir également:

1 réponse

prosthetiks Messages postés 1189 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 12 juin 2020 431
5 juil. 2015 à 14:55
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.
0
cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 4 avril 2024 145
5 juil. 2015 à 15:50
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 ?
0