Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/07/2007, 15h01   #1
En attente de confirmation mail
 
Inscription : novembre 2005
Messages : 52
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : novembre 2005
Messages : 52
Points : 31
Points : 31
Par défaut [Sécurité] Question sécurité PHP

Bonjour à tous,

Je suis actuellement en train de développer un site et je me pose quelques questions quant à la sécurité de celui-ci.

Tout d'abord, j'aimerais savoir s'il est nécessaire de sécurisée une valeur d'un formulaire si on l'utilise dans une condition ou si PHP le fait automatiquement.
Par exemple :
Code :
1
2
3
4
if (!empty($_POST['test']) AND htmlentities($_POST['test'])=='truc')
{
...
}
Ensuite j'aimerais aussi savoir s'il est préférable d'utiliser mysql_real_escape_string(); ou htmlentitites(); pour tout ce qui est récupération de données d'un formulaire. Actuellement j'utilise uniquement mysql_real_escape_string(); mais bon avec toutes ces commandes de protection qu'il existe je ne sais plus trop laquelle utiliser ^^

Pour finir j'ai développé un espace membre. J'enregistre le login et le mot de passe dans un cookie. Le problème c'est que j'ai souvent besoin de récupérer l'ID du compte donc je dois faire une requête SQL à chaque fois. J'ai donc trouver la solution de récupérer à chaque fois l'ID du membre une seule fois au début de la page et de l'enregistrer dans une session. Est-ce un bon choix ?

Ah j'oubliais aussi, les membres peuvent upload un avatar. Cependant pour éviter tout conflit de nom de fichier et surtout pour éviter d'utiliser la base de données je renomme chaque image par l'ID du membre. Mais je n'y mets pas d'extention. Est-ce un gros problème sachant que les images s'affichent correctement ?

Voilà merci d'avance pour vos réponses et bonne journée
adidas40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 15h41   #2
Rédacteur/Modérateur
 
Avatar de Deepin
 
Homme Deepin
Ingénieur - Chef de projet Modélisation/Simulation
Inscription : avril 2004
Messages : 1 341
Détails du profil
Informations personnelles :
Nom : Homme Deepin
Localisation : Ile Maurice

Informations professionnelles :
Activité : Ingénieur - Chef de projet Modélisation/Simulation
Secteur : Industrie

Informations forums :
Inscription : avril 2004
Messages : 1 341
Points : 7 085
Points : 7 085
Envoyer un message via Skype™ à Deepin
voici une fonction sympa pour verifier la valeur de ton post
Code :
1
2
3
4
5
6
7
function getPost($post){
	if(isset($_POST[$post]) && $_POST[$post] != '' ){
		return $_POST[$post];
	}
	return false; 
 
}
Pour eviter les injections tu peux utiliser :
Code :
$username =mysql_real_escape_string(htmlentities($_POST['username']));
le stockage de l ID en session me parait etre un bon choix
par contre stocker le password dans un cookie ma pas l air genial.
Pour l avatar la solution est bonne.
A++
Deepin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 19h19   #3
En attente de confirmation mail
 
Inscription : novembre 2005
Messages : 52
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : novembre 2005
Messages : 52
Points : 31
Points : 31
Citation:
Envoyé par buns
voici une fonction sympa pour verifier la valeur de ton post
Code :
1
2
3
4
5
6
7
function getPost($post){
	if(isset($_POST[$post]) && $_POST[$post] != '' ){
		return $_POST[$post];
	}
	return false; 
 
}
Pour eviter les injections tu peux utiliser :
Code :
$username =mysql_real_escape_string(htmlentities($_POST['username']));
le stockage de l ID en session me parait etre un bon choix
par contre stocker le password dans un cookie ma pas l air genial.
Pour l avatar la solution est bonne.
A++
Bonsoir buns,

Tout d'abord merci ta réponse ;-)
Mon problème n'était pas vraiment pour vérifier la valeur d'un formulaire mais plus savoir si il était nécessaire de mettre la fonction mysql_real_escape_string(); dans la condition.

Ensuite pour éviter les injections est-il vraiment nécessaire d'utiliser mysql_real_escape_string(); et htmlentities(); ? Les deux fonctions ont la même fonction je crois.

Pour mes cookies, je stocke le login & le mot de passe (crypté en md5) dans des cookies et ma page index.php (la principale puisque tout passe par la) vérifie avant quoi que ce soit que le login/mot de passe correspondent, sinon ca supprime les cookies et actualise la page. Donc je ne pense pas qu'il y ait de problème avec ça.
adidas40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 19h29   #4
Rédacteur/Modérateur
 
Avatar de Deepin
 
Homme Deepin
Ingénieur - Chef de projet Modélisation/Simulation
Inscription : avril 2004
Messages : 1 341
Détails du profil
Informations personnelles :
Nom : Homme Deepin
Localisation : Ile Maurice

Informations professionnelles :
Activité : Ingénieur - Chef de projet Modélisation/Simulation
Secteur : Industrie

Informations forums :
Inscription : avril 2004
Messages : 1 341
Points : 7 085
Points : 7 085
Envoyer un message via Skype™ à Deepin
hello,
Regarde ce lien cela va surement t'aider a comprendre les deux fonctions.
http://richardkmiller.com/blog/archi...l-php-security
A++

PS: je ne crois que tu aie a utiliser htmlentities() dans ta condition.J'ai jamais vu ça.
Deepin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 10h54   #5
Membre confirmé
 
Avatar de ShinJava
 
Inscription : septembre 2004
Messages : 411
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 411
Points : 287
Points : 287
Hello,
Je te conseil aussi de regarder ce tutorial fait par un membre de developpez, tu en apprendra beaucoup sur les types d'attaques que peut subir un site web :
http://julien-pauli.developpez.com/t...-web-securite/

Bonne lecture
++
ShinJava
__________________
Petit débutant deviendra grand... débutant
ShinJava est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2007, 02h54   #6
Membre régulier
 
Avatar de The Nux
 
Inscription : février 2006
Messages : 79
Détails du profil
Informations personnelles :
Âge : 22

Informations forums :
Inscription : février 2006
Messages : 79
Points : 84
Points : 84
Envoyer un message via MSN à The Nux
Salut,

Pour répondre à tes questions en t'évitant le cour (même si c'est quand même conseillé de le lire), déjà je peut te dire que le htmlentities ou une quelconque protection des valeurs dans une comparaison est complètement inutile. En revanche, ce qu'il ne faut jamais oublier, c'est d'utiliser l'opérateur identique === au lieu de l'opérateur égal ==. Pourquoi ? À cause de la conversion implicite des types de variables. Essayes par exemple de faire
Code :
1
2
3
4
<?php
if (0 + 0 == "la tête à toto") echo "C'était donc vrai !";
else echo "Que des cracks";
?>
À cause de la conversion implicite des types on a vu des failles monumentales, comme par exemple une faille qui permetait de devenir administrateur d'un phpbb en modifiant son numero de session...
Par contre, toutes les variables de $_GET ou $_POST par exemple sont de type string, ce qui veut dire qu'il ne faut pas oublier de les convertir en integer si il faut les comparer à un numéro, ou quoi que ce soit dans ces eaux là.

En ce qui concerne le mysql_real_escape_string() VS htmlentities(), les deux sont nécessaires dans la plupart des cas, mais pas pour les mêmes raisons. Le premier, mysql_real_escape_string(), sert à empêcher les injections SQL, il est donc primordial de traiter toute valeur insérée dans mysql avec cette fonction (attention cependant aux altercations avec les magic_quote. Le mieux est dans un premier temps d'enlever les éventuelles quotes magiques avec stripslashes() pour ensuite traiter la valeur avec mysql_real_escape()). htmlentities() quand à lui sert à transformer les caractères html spéciaux en entité html. L'utilité est que cela empêche l'utilisateur de mettre du HTML dans son contenu, ce qui peut lui permettre de faire du cross scripting. On traitera donc avec htmlentities() les données que l'on compte afficher sur une page HTML et qui ont été écrites par un auteur en lequel on n'a pas confiance. Il n'est pas obligatoire de traiter les données insérées dans la base de données avec htmlentities(), par contre, si on veut protéger son site du XSS alors il faut obligatoirement traiter toutes les valeurs qui proviennent d'auteurs auxquels on ne fait pas confiance avec htmlentities() avant l'affichage. Le fait de le faire à l'insertion des données dans la BDD permet de ne pas oublier quand on affiche, mais on peut par exemple ne pas vouloir dénaturer le contenu...

Pour résumer :
- mysql_real_escape() pour protéger des injections SQL
- htmlentities() pour protéger du XSS

Concernant les sessions, c'est une très mauvaise idée de mettre le login et le mot de passe dans le cookie car ça veut dire qu'ils vont transiter en clair sur le réseau à chaque fois que l'utilisateur va ouvrir une page. Le plus simple est je pense d'utiliser le mécanisme de sessions proposé par PHP, ou un mécanisme similaire (c'est à dire que tu donnes à chaque visiteur un numero de session unique, et tu stockes dans une base de données toutes les variables que tu veux en les associant à ce numero de session). Tu peux stocker par exemple juste l'ID de l'utilisateur et récupérer toutes les infos sur lui au début de chaque page (t'en fais pas, mysql c'est très performant).

Pour les avatars ça peut aller mais c'est pas top, avec l'extension ça serai mieux, car en fait l'extension permet que le serveur dise au navigateur le format de l'image et donc que le navigateur se prépare à afficher une image, tandis que sans extension le serveur ne sait pas et donc le navigateur ne sait pas non plus, ce qui peut produire des résultats bizarres, comme par exemple l'apparition d'une fenêtre "télécharger le fichier". Par contre fait attention que ce que les utilisateurs envoient c'est bien une image (en utilisant les librairies de PHP prévues à cet effet, pas seulement en regardant l'extension), et non pas un script php par exemple.
The Nux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2007, 23h52   #7
En attente de confirmation mail
 
Inscription : novembre 2005
Messages : 52
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : novembre 2005
Messages : 52
Points : 31
Points : 31
Un grand merci à toi The Nux!
J'ai bien lu les articles à propos de la sécurité mais ils ne sont pas toujours clair, au lieu d'en venir à l'essentiel comme tu viens de le faire. Encore merci
adidas40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2007, 20h45   #8
En attente de confirmation mail
 
Inscription : novembre 2005
Messages : 52
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : novembre 2005
Messages : 52
Points : 31
Points : 31
Re bonjour,

J'aurais besoin d'une petite précision. Tu m'as dit que je devais utiliser '===' plutôt que '==' et qu'il était préférable de définir le type de variable.
Il faut donc que je change, par exemple, mon :

Code :
1
2
3
4
if (!empty($_POST['log']) AND $_POST['log']==1 AND !empty($_POST['login']) AND !empty($_POST['pwd']))
{
  // Désidentification
}
par quelque chose comme ça :

Code :
1
2
3
4
5
6
7
8
9
if (!empty($_POST['log']))
  {
    $log = $_POST['log'];
    settype($log, 'integer');
  }
  if (!empty($log) AND $log===1 AND !empty($_POST['login']) AND !empty($_POST['pwd']))
  {
     // Désidentification
  }
J'ai bien comprit la chose ou bien je suis a côté de la plaque ?

(Je pense que je vais reposer quelques questions ces jours-ci car je revois tout mon code)
adidas40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2007, 23h39   #9
Membre régulier
 
Avatar de The Nux
 
Inscription : février 2006
Messages : 79
Détails du profil
Informations personnelles :
Âge : 22

Informations forums :
Inscription : février 2006
Messages : 79
Points : 84
Points : 84
Envoyer un message via MSN à The Nux
Comme ça ça marche, mais tu peux faire plus simple ^^

Pour commencer, le !empty($_POST['log']) n'est pas très utile, par ce que si $_POST['log'] === 1 alors ça veut dire que $_POST['log'] n'est pas vide (c'est logique quoi).

Ensuite, pour faire une conversion de type ce n'est pas obligatoire de faire ça avec settype. Par exemple là tu pourrais faire
Code :
if ((int)$_POST['log'] === 1)
Ou dans le cas général, pour convertir une variable tu fais
Code :
$var_convertie = (type_que_je_veux) $var_pasconvertie;
Et pour finir, je pense que c'est plus simple (et plus rapide en terme de temps d'execution) de faire
Code :
if ($_POST['log'] === "1")
Mais ça marche aussi bien que l'autre.

Cependant c'est bien t'a compris le principe
The Nux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2007, 15h11   #10
En attente de confirmation mail
 
Inscription : novembre 2005
Messages : 52
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : novembre 2005
Messages : 52
Points : 31
Points : 31
Si je mets la condition sans être sur que la valeur du formulaire n'est pas vide j'ai une notice qui s'affiche :
Citation:
Notice: Undefined index: log in d:\sites\easyphp\www\template\index.php on line 22
C'est donc pour celà que j'utilise toujours !empty() avant de vérifier la valeur.
adidas40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2007, 17h00   #11
Membre régulier
 
Avatar de The Nux
 
Inscription : février 2006
Messages : 79
Détails du profil
Informations personnelles :
Âge : 22

Informations forums :
Inscription : février 2006
Messages : 79
Points : 84
Points : 84
Envoyer un message via MSN à The Nux
Ah... J'avais oublié que ça produit une NOTICE... Mais c'est rare que les NOTICE s'affichent en fait, généralement le niveau de rapport d'erreurs est pas si élevé.
The Nux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2007, 23h21   #12
En attente de confirmation mail
 
Inscription : novembre 2005
Messages : 52
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : novembre 2005
Messages : 52
Points : 31
Points : 31
Tu m'as précisé de plutôt utiliser les sessions aux cookies, chose que j'ai faite. J'ai suivi un tutorial permettant de créer un système de sessions via ma base de données (http://a-pellegrini.developpez.com/t...hp/session-db/). Cependant j'aimerais que l'utilisateur reste identifié plusieurs jours.
J'ai fait quelques recherches afin de lié sessions & cookies mais j'ai rien trouvé. Est ce que quelqu'un aurait un tutorial la dessus ou pourrait m'expliquer le fonctionnement ?
adidas40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2007, 00h22   #13
Membre régulier
 
Avatar de The Nux
 
Inscription : février 2006
Messages : 79
Détails du profil
Informations personnelles :
Âge : 22

Informations forums :
Inscription : février 2006
Messages : 79
Points : 84
Points : 84
Envoyer un message via MSN à The Nux
Il te suffit juste de paramétrer le cookie de session comme il faut, à l'aide de la fonction session_set_cookie_params()

Par exemple, pour que l'utilisateur reste connecte 7 jours :
Code :
1
2
3
<?php
session_set_cookie_params(604800);
?>
__________________
Nouveau bachelier et futur ingénieur
Et j'ai même un blog !
The Nux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2007, 02h12   #14
En attente de confirmation mail
 
Inscription : novembre 2005
Messages : 52
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : novembre 2005
Messages : 52
Points : 31
Points : 31
Ah vraiment tout bête, je n'ai même pas pensé à chercher si les sessions le permettait tout simplement. Merci!
adidas40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2007, 18h55   #15
En attente de confirmation mail
 
Inscription : novembre 2005
Messages : 52
Détails du profil
Informations personnelles :
Âge : 23

Informations forums :
Inscription : novembre 2005
Messages : 52
Points : 31
Points : 31
Bonsoir,

Comme prévenus, je reviens demander de l'aide
Ce que je vais demandé n'est pas dans la bonne catégorie du forum puisque cela concerne AJAX mais je ne voulais pas ré-ouvrir un sujet, je préfère continuer dans celui-ci. Donc venons-en au problème.

Je suis en train de développer un site avec la technologie AJAX en supplément. Je m'en sers pour charger mes pages, comme si j'utilisais des frames. Cependant lorsque la page demandée se charge, tous les caractères spéciaux sont remplacés par des points d'interrogation et la page demandée ne prend pas en compte la feuille de style déjà chargée dans la page index.

Si quelqu'un à des solutions à me proposer je le remercie d'avance, sinon et bien je n'utiliserai pas cette méthode tout simplement.

Bonne fin de journée à tous.
adidas40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h00.


 
 
 
 
Partenaires

Hébergement Web