Securite PHP/SQL


user2home
WRInaute discret
WRInaute discret
 
Messages: 228
Inscription: 19 Déc 2007

Securite PHP/SQL

Message le Lun Juin 06, 2011 10:27

Salutations à tous, dans le cadre d'un projet pour mes études je créer un site étant relativement novice en sécurité j'aurai aimé savoir si mes codes sont "sécurisés".

J'utilise ce code pour rendre dynamique le changement de page sur le site, il n'est pour le moment pas en ligne je test en local, j'ai volontairement changé le nom des variables, logs et autres donc ne vous étonnez pas de certains noms :wink:

Merci à ceux qui prendront le temps de me lire !

Cordialement

PS: Je précise que je suis étudiant donc si mon code vous parait archaïque c'est que j'ai appris, vos conseils seront précieux pour améliorer celui ci :)

Code: Tout sélectionner
if (!isset($_GET["page"]))
                {
                    include ("content/content.php");
                }
                else
                {
                    include ("content/" . $_GET["page"] . ".php ");
                    if (isset($_POST["id"]))
                    {
                       $_SESSION['id']  =  $_POST["id"];
                       
                    }
                }


Mon formulaire avec ma page d'identification vient compléter la partie " base de donnée"

Code: Tout sélectionner
<?php

if (!isset($_POST['nomcarte'])) {
    $nomcarte = 'NULL';
} else {
    $nomcarte = $_POST['nomcarte'];
}
if (!isset($_POST['qualite'])) {
    $qualite = 'NULL';
} else {
    $qualite = $_POST['qualite'];
}
if (!isset($_POST['manablanc'])) {
    $manablanc = 'NULL';
} else {
    $manablanc = $_POST['manablanc'];
}
if (!isset($_POST['manableu'])) {
    $manableu = 'NULL';
} else {
    $manableu = $_POST['manableu'];
}
if (!isset($_POST['mananoir'])) {
    $mananoir = 'NULL';
} else {
    $mananoir = $_POST['mananoir'];
}
if (!isset($_POST['manarouge'])) {
    $manarouge = 'NULL';
} else {
    $manarouge = $_POST['manarouge'];
}
if (!isset($_POST['manavert'])) {
    $manavert = 'NULL';
} else {
    $manavert = $_POST['manavert'];
}
if (!isset($_POST['manaincolore'])) {
    $manaincolore = 'NULL';
} else {
    $manaincolore = $_POST['manaincolore'];
}
if (!isset($_POST['genre'])) {
    $genre = 'NULL';
} else {
    $genre = $_POST['genre'];
}
if (!isset($_POST['lien'])) {
    $lien = 'NULL';
} else {
    $lien = $_POST['lien'];
}
if (!isset($_POST['image'])) {
    $image = 'NULL';
} else {
    $image = $_POST['image'];
}
include ("../cfg/connect_sql.php");
$textSQL = "INSERT INTO caras
(id, nomcarte, qualite, manablanc, manableu, mananoir, manarouge, manavert, manaincolore, genre, lien, image)
VALUES
('', '$nomcarte', '$qualite',  '$manablanc', '$manableu', '$mananoir', '$manarouge', '$manavert', '$manaincolore', '$genre', '$lien', '$image')";

mysql_query($textSQL);
mysql_close();
header('location:../../index.php?page=lapagedelenfer');

?>


à ceci le formulaire d'identification :

Code: Tout sélectionner
<form action="index.php?page=action/action_identification" method=POST>
        <input type="text" name="login" value="Login"></input>
        <input type="password" name="pwd" value="Mot de pass"></input>
        <input type="submit" value="Connexion">
        <INPUT TYPE="reset" NAME="nom" VALUE="Annuler">
        </form>


Avec la page action d'identification :

Code: Tout sélectionner
  <?php
$connexion = mysql_connect("localhost","login","motdepassedesql");
if (!$connexion)
{
die('Connexion impossible : ' . mysql_error());
}
mysql_select_db("dblocal", $connexion);
$login =$_POST['login'];
$pwd=$_POST['pwd'];
$sql = "SELECT id, login, mdp FROM compte WHERE login='" . $login . "' AND mdp='" . $pwd . "';";
$resultat = mysql_query($sql);
$ligne = mysql_fetch_array($resultat, MYSQL_ASSOC);
$login_valide = $ligne['login'];
$pwd_valide = $ligne['mdp'];

    
   if (isset($_POST['login']) && isset($_POST['pwd'])) {
     
          if ($login_valide == $login && $pwd_valide == $pwd) {
                session_start ();
                $_SESSION['login'] = $_POST['login'];
                $_SESSION['pwd'] = $_POST['pwd'];
      $_SESSION['id']   = $ligne['id'];
                $_SESSION['auth'] = "ok";
      header("Location: index.php?page=raremagic");
          }
          else {
             echo 'Erreur de login';
          } 
    } 
    else {
          echo 'Connexion impossible'; 
    } 
    ?
>

Et la page deconnection :

Code: Tout sélectionner
<?php
session_start();
unset($_SESSION);
session_destroy();
header("Location: index.php?page=lapagedelenfer");
?>


spout
WRInaute accro
WRInaute accro
 
Messages: 4382
Inscription: 14 Mai 2003

Re: Securite PHP/SQL

Message le Lun Juin 06, 2011 11:05

Belles failles dans ton formulaire, tu fais juste des tests sur isset() et aucun contrôle des données, et pas non plus de mysql_real_escape_string()


user2home
WRInaute discret
WRInaute discret
 
Messages: 228
Inscription: 19 Déc 2007

Re: Securite PHP/SQL

Message le Lun Juin 06, 2011 11:22

spout a écrit:Belles failles dans ton formulaire, tu fais juste des tests sur isset() et aucun contrôle des données, et pas non plus de mysql_real_escape_string()



Tu veux dire des test via expressions régulières ?

Après recherche, j'ai appliqué mysql_real_escape_string() pour contrôler les entrées sur mes $_POST, $_GET c'est bien de cela que tu parlais ?


spout
WRInaute accro
WRInaute accro
 
Messages: 4382
Inscription: 14 Mai 2003

Re: Securite PHP/SQL

Message le Lun Juin 06, 2011 11:29

Des tests style is_int(), filter_var(), ...

Oui mysql_real_escape_string() pour construire tes requêtes SQL.


Zecat
WRInaute accro
WRInaute accro
 
Messages: 12003
Inscription: 1 Mar 2005

Re: Securite PHP/SQL

Message le Lun Juin 06, 2011 11:29

Je suis pas expert en secu ... phprank1 .. mais il me semble que le minimum syndical serait deaj d'ajouter un

strip_tags

sur tes $_POST :roll:


Blount
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 430
Inscription: 18 Nov 2010

Re: Securite PHP/SQL

Message le Lun Juin 06, 2011 12:23

Zecat a écrit:Je suis pas expert en secu ... phprank1 .. mais il me semble que le minimum syndical serait deaj d'ajouter un

strip_tags

sur tes $_POST :roll:


Et pourquoi ?

Si je veux mon pseudo de ce style : "<tag pseudo="Blount" />", j'en ai bien le droit ;)

Je me demande toujours pourquoi vous vous butez à toujours vouloir utiliser ces fonctions pour « protéger » (en fait, ça ne protège rien du tout). Les données entrées par l'utilisateur ne doivent pas être modifiées.
Bien entendu, il ne faut pas confondre « protéger » avec « interdire », ce qui n'est pas du tout pareil.

Par exemple, je ne veux pas de majuscule dans le texte entré par l'utilisateur. En théorie, il faudrait l'avertir de son erreur :
Code: Tout sélectionner

if 
($_POST['pseudo'] != mb_strtolower($_POST['pseudo'])) {
    $erreur['pseudo'] = 'Attention, vous ne pouvez pas utiliser des majuscules dans votre pseudo.';
}
 


C'est un exemple.


Pour revenir au sujet, une seule fonction doit être utilisée : mysql_real_escape_string (et oubliez les htmlentities, htmlspecialchars, etc. avant enregistrement en base de données).


Zecat
WRInaute accro
WRInaute accro
 
Messages: 12003
Inscription: 1 Mar 2005

Re: Securite PHP/SQL

Message le Lun Juin 06, 2011 15:03

noté. bon ben ja ferais les deux à la suite, ca mange pas de pain :mrgreen:


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Re: Securite PHP/SQL

Message le Lun Juin 06, 2011 16:59

@Blount : pourquoi oublier certaines fonctions sur les chaines de caractères telle que stripcslashes et htmlspecialchars ?


Blount
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 430
Inscription: 18 Nov 2010

Re: Securite PHP/SQL

Message le Lun Juin 06, 2011 17:18

Parce que ces fonctions sont à faire à l'affichage et non à l'enregistrement des données. J'ai pour habitude de conserver les données tel que l'utilisateur les a entrés. Si je veux qu'il les entre dans un certain format, je lui indique et contrôle ce qu'il entre (comme une adresse E-Mail).

Il n'est pas à exclure que les données de la base soit traitées exclusivement par PHP. Faire des "html_entity_decode" (par exemple) dans un autre langage pourrait devenir très vite compliqué.

_Soul
WRInaute impliqué
WRInaute impliqué
 
Messages: 508
Inscription: 26 Avr 2011

Re: Securite PHP/SQL

Message le Mar Juin 07, 2011 9:15

mysql_real_escape_string a une faille, il ne gère pas le #, le commentaire en sql, pour régler ça, passes par pdo.

Je te conseille de faire un htmlentities de toutes les données donné par l'utilisateur, sa prendra plus de place das la bdd mais tu ne te fera pas chier a l'affichage.


spout
WRInaute accro
WRInaute accro
 
Messages: 4382
Inscription: 14 Mai 2003

Re: Securite PHP/SQL

Message le Mar Juin 07, 2011 9:19

_Soul a écrit:Je te conseille de faire un htmlentities de toutes les données donné par l'utilisateur, sa prendra plus de place das la bdd mais tu ne te fera pas chier a l'affichage.

Mauvais conseil, comme Blount l'a souligné, c'est à l'affichage qu'il faut faire ce genre de traitement.


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Re: Securite PHP/SQL

Message le Mar Juin 07, 2011 9:29

Je ne pige pas ...

Si vous ne faites pas de traitement des données au niveau du formulaire, donc avant insertion en bd, vous n'êtes pas emmerdé avec par exemple des antislash suite à des mots contenant des apostrophes ?

Exemple :
Code: Tout sélectionner
$ma_variable = stripcslashes(htmlspecialchars($_POST["toto"]));
//Insertion
'".mysql_real_escape_string($ma_variable)."'


spout
WRInaute accro
WRInaute accro
 
Messages: 4382
Inscription: 14 Mai 2003

Re: Securite PHP/SQL

Message le Mar Juin 07, 2011 9:32

tryan a écrit:vous n'êtes pas emmerdé avec par exemple des antislash suite à des mots contenant des apostrophes ?

Si les magic quotes sont désactivées: non.
C'est mysql_real_escape_string() qui se charge de ça.

_Soul
WRInaute impliqué
WRInaute impliqué
 
Messages: 508
Inscription: 26 Avr 2011

Re: Securite PHP/SQL

Message le Mar Juin 07, 2011 9:34

spout a écrit:
_Soul a écrit:Je te conseille de faire un htmlentities de toutes les données donné par l'utilisateur, sa prendra plus de place das la bdd mais tu ne te fera pas chier a l'affichage.

Mauvais conseil, comme Blount l'a souligné, c'est à l'affichage qu'il faut faire ce genre de traitement.

Et t'oublie combien de fois de le faire à l'affichage?


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Re: Securite PHP/SQL

Message le Mar Juin 07, 2011 9:34

Donc dans le cas contraire on est bien obligé d'effectué un traitement ..?

Securite PHP/SQL

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités