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 17/08/2006, 00h08   #1
Membre actif
 
Homme
Inscription : février 2006
Messages : 199
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39
Localisation : Dom-Tom

Informations forums :
Inscription : février 2006
Messages : 199
Points : 165
Points : 165
Par défaut [Sécurité] Vos avis sur mes scripts sécurisés

Bonjour,

Je viens de mettre au point des fonctions sécurisées compatible UTF-8.

Fonction pour vérifier un email et une autre pour du texte à partir d'un formulaire.

On peut facilement le modifier pour d'autre type de vérification (par ex adresse d'un site)

Concernant l'UTF-8, j'ai fait en sorte d'avoir un regex compatible étant donné que je n'ai rien trouvé sur le net sur une expression rationnelle existante, donc je l'ai fait à ma petite sauce...

Voilà donc le code à mettre dans une page nommée security.php et tester vous-même...

Donc merci de dire si vous voyez des trous de sécurités, ainsi que leurs solutions possible, ça permettra d'améliorer les fonctions pour le grand bien de la communauté.

A bientôt...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
<?php
session_start();
 
function mail_secure($value,$token1,$token2)
{
	if (isset($value) && $value != "" && isset($token1) && $token2 == $token1)
	{
		$verif = eregi('^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4}$', $value);
		if ($verif == "1")
		{
			$string = mb_convert_encoding(htmlentities(trim(strip_tags(addslashes($value)))),"HTML-ENTITIES","UTF-8");
			return $string;
		}
	}
}
 
function text_secure($value,$token1,$token2)
{
	if (isset($value) && $value != "" && isset($token1) && $token2 == $token1)
	{
		$verif = eregi('^[[:alnum:]\&\;]{1,}$', htmlentities($value));
		if ($verif == "1")
		{
			$string = mb_convert_encoding(htmlentities(trim(strip_tags(addslashes($value)))),"HTML-ENTITIES","UTF-8");
			return $string;
		}
	}
}
 
if (!empty($_POST['register']))
{
	$test1 = mail_secure($_POST['email'],$_SESSION['token'],$_POST['token']);
	echo $test1,"<br />";
 
	$test2 = text_secure($_POST['words'],$_SESSION['token'],$_POST['token']);
	echo $test2,"<br />";
}
 
$token = md5(uniqid(rand(), true));
$_SESSION['token'] = $token;
?>
<form method="post" action="security.php">
<input type="text" name="email">
<br>
<input type="text" name="words">
<br>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<input type="submit" name="register" value="Soumettre">
</form>
nazoreen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2006, 10h47   #2
Rédacteur
 
Avatar de wamania
 
Développeur Web
Inscription : juillet 2003
Messages : 676
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2003
Messages : 676
Points : 678
Points : 678
Suivant ton SGDB, addslashes ne suffit pas
Pour mysql par exemple, il faut mysql_real_escape_string.

Si on ne prend pas l'aspect SGDB en compte, alors pas besoin du addslashes.
Je serais plus d'avis donc de ne pas mettre le addslashes ici automatiquement, mais au cas par pas à l'insertion dans les requetes.

Toujours pour addslashes, je te conseil,
  • soit $str = addslashes(stripslashes($str))
  • soit if ( ! get_magic_quotes_gpc() ) { $str = addslashes($str); }
pour éviter les magics quotes.

Je traiterais pas le mail pareil que le text.
Pour moi, si htmlentities($mail) != $mail , alors ALERTE GENERALE
Quand on est dans ce cas la, l'email ne peut pas être accepté.

Sinon, le principe est bon.
__________________
Articles sur developpez.com
- Gestion des exceptions avec PHP5
- Chiffrement et hash en PHP contre l'attaque Man in the middle
- Aedituus - Espace membre sécurisé en PHP5

Lithium : ORM ActiveRecord PHP5 extrêmement léger
wamania est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2006, 11h35   #3
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

Non, ce n'est pas tout à fait correct. Dès lors que l'on utilise addslashes() et htmlentities() dans le même objectif, il y a un gros souci.
  • addslashes() et ses équivalents (il est préférable d'utiliser mysql_real_escape_string(), comme cela a été suggéré par wamania) sont à utiliser exclusivement avant d'envoyer des données dans une requête destinée à la base de données.
  • htmlentities(), en revanche, est à utiliser exclusivement pour les données à afficher dans la page Web.
En effet, un mail est une page Web qui n'est pas nécessairement affichée par un navigateur. À ce titre, il faut traiter son contenu de la même manière que l'on traite le contenu d'une page Web classique.

Lis au moins l'introduction de ce tutoriel : Initiation aux expressions régulières en PHP
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2006, 11h39   #4
Rédacteur
 
Avatar de wamania
 
Développeur Web
Inscription : juillet 2003
Messages : 676
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2003
Messages : 676
Points : 678
Points : 678
Citation:
htmlentities(), en revanche, est à utiliser exclusivement pour les données à afficher dans la page Web
Oui, c'est vrai, pour facilité la modification, mais c'est pas incorrect de la faire avant l'enregistrement en base.
Mais oui, dans un contexte général (seul à prendre en compte vu que tu partage tes sources), alors le htmlentities doit être fait juste avant l'affichage et pas avant
__________________
Articles sur developpez.com
- Gestion des exceptions avec PHP5
- Chiffrement et hash en PHP contre l'attaque Man in the middle
- Aedituus - Espace membre sécurisé en PHP5

Lithium : ORM ActiveRecord PHP5 extrêmement léger
wamania est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2006, 12h17   #5
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Dans le sens où une base de données est prévue pour conserver uniquement des données brutes, dénuées de tout caractère de présentation, c'est une erreur d'utiliser htmlentities() à des fins de stockage. Que se passe-t-il le jour où tu dois utiliser ta BDD pour créer autre chose qu'une page Web, par exemple un PDF, un fichier Flash ou que sais-je encore ? Il te faudra réviser le contenu de la BDD ainsi que tous les scripts...


Non, vraiment, arrêtez d'utiliser htmlentities() à tout va. Laissez son rôle à chaque élément : la BDD stocke des infos brutes, le langage de script remplit la BDD, récupère les infos et les met en forme, etc. Si vous ne vous y conformez pas, vous rencontrerez de gros problèmes un jour ou l'autre.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2006, 13h06   #6
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Citation:
Envoyé par Yogui
Dans le sens où une base de données est prévue pour conserver uniquement des données brutes, dénuées de tout caractère de présentation, c'est une erreur d'utiliser htmlentities() à des fins de stockage. Que se passe-t-il le jour où tu dois utiliser ta BDD pour créer autre chose qu'une page Web, par exemple un PDF, un fichier Flash ou que sais-je encore ? Il te faudra réviser le contenu de la BDD ainsi que tous les scripts...


Non, vraiment, arrêtez d'utiliser htmlentities() à tout va. Laissez son rôle à chaque élément : la BDD stocke des infos brutes, le langage de script remplit la BDD, récupère les infos et les met en forme, etc. Si vous ne vous y conformez pas, vous rencontrerez de gros problèmes un jour ou l'autre.
Prosternez-vous sur ces paroles, développeur infidèles.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2006, 13h18   #7
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
J'y pense, tu utilises strip_tags() en combinaison avec htlmentities() : cela signifie que je ne pourrais pas poster du code HTML, même pour donner un exemple. C'est très peu pratique.
Si tu le fais à des fins de sécurité, dis-toi que l'appel à htmlentities() convertit tous les < et > en leurs équivalents HTML, ce qui fait que personne ne peut exploiter la faille XSS qui, j'imagine, est la cause principale de la présence de strip_tags().
Conclusion : si tu utilises htmlentities(), tu n'as pas besoin d'utiliser strip_tags().
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2006, 13h37   #8
Rédacteur
 
Avatar de wamania
 
Développeur Web
Inscription : juillet 2003
Messages : 676
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2003
Messages : 676
Points : 678
Points : 678
Je dirais même plus

En fait, je pense qu'il faut distinguer 2 types de filtres.
Ceux qui permettent d'obtenir un string "propre" et ceux qui IMPOSENT un modèle.
Personnellement, pour chaque variable dont je connais clairement le modèle, il doit être ainsi, ou ne sera pas.
Par exemple, si on attend un chiffre, pas besoin de htmlentities, addslashes, strip_tag.....ni rien. On vérifie, c'est un chiffre, pas besoin d'aller plus loin dans les filtres, c'est pas un chiffre -> Exception directe.

Ainsi, tu vérifie pour ton mail
Code :
eregi('^[a-zA-Z0-9\._-]+@[a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4}$', $value);
Clairement, il ne peut pas y avoir de tag dedans, donc pas la peine de faire stip_tag


Ensuite, pour les textes sans "modèles", comme le dit Yogui, éviter le strip_tag car ça supprime beaucoup d'informations, les slashes, uniquement lors de la requete SQL et les htmlentities et htmlspecialchars uniquement avant l'affichage.
__________________
Articles sur developpez.com
- Gestion des exceptions avec PHP5
- Chiffrement et hash en PHP contre l'attaque Man in the middle
- Aedituus - Espace membre sécurisé en PHP5

Lithium : ORM ActiveRecord PHP5 extrêmement léger
wamania est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2006, 06h13   #9
Membre actif
 
Homme
Inscription : février 2006
Messages : 199
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39
Localisation : Dom-Tom

Informations forums :
Inscription : février 2006
Messages : 199
Points : 165
Points : 165
Bonjour et merci à tous pour la participation...

Si j'ai le temps la semaine prochaine, je mettrais à jour le code en prenant en compte vos remarques.

A bientôt...
nazoreen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2006, 22h13   #10
Membre actif
 
Homme
Inscription : février 2006
Messages : 199
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39
Localisation : Dom-Tom

Informations forums :
Inscription : février 2006
Messages : 199
Points : 165
Points : 165
Bonjour à tous,

Donc voic ce que j'ai fait d'après ce que vous m'avez dit. Remarquez que ce soit destiné à l'affichage direct ou la mise en base de donnée, je veux avoir le même code d'où l'utilisation du htmlentities au sein du script et non à l'affichage.

Je pense qu'il y a une erreur quelque part justement concernant les potentielles attaques XSS, mais je n'arrive pas hacker mon script, donc si vous arrivez dites le moi afin de palier au manque de sécurité.

J'ai mis 2 fonctions pareilles actives, donc désactivez l'une d'entre-elle pour tester le script.

A bientôt...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?php
session_start();
 
function mail_secure($value,$token1,$token2)
{
	if (isset($value) && $value != "" && isset($token1) && $token2 == $token1)
	{
		$verif = eregi('^[[:alnum:]\.\_\-]+@[[:alnum:]\.\-]+\.[[:alpha:]]{2,4}$', $value);
		if ($verif == "1")
		{
			$string = $value;
			return $string;
		}
	}
}
 
/* chiffre, texte multilingue, espace, tabulation, ponctuation acceptés */
function text_secure($value,$token1,$token2)
{
	if (isset($value) && $value != "" && isset($token1) && $token2 == $token1)
	{
		$verif = eregi('^[[:alnum:][:blank:][:punct:]\&\;]{1,}$', htmlentities($value));
		if ($verif == "1")
		{
			$string = mb_convert_encoding(htmlentities(trim(strip_tags($value))),"HTML-ENTITIES","UTF-8");
			return $string;
		}
	}
}
 
/* chiffre, texte multilingue, espace, tabulation, ponctuation, code html acceptés */
function text_secure($value,$token1,$token2)
{
	if (isset($value) && $value != "" && isset($token1) && $token2 == $token1)
	{
		$verif = eregi('^[[:alnum:][:blank:][:punct:]\&\;]{1,}$', htmlentities($value));
		if ($verif == "1")
		{
			$string = mb_convert_encoding(htmlentities(trim($value)),"HTML-ENTITIES","UTF-8");
			return $string;
		}
	}
}
 
if (!empty($_POST['register']))
{
	$test1 = mail_secure($_POST['email'],$_SESSION['token'],$_POST['token']);
	echo $test1,"<br />";
 
	$test2 = text_secure($_POST['words'],$_SESSION['token'],$_POST['token']);
	echo $test2,"<br />";
}
 
$token = md5(uniqid(rand(), true));
$_SESSION['token'] = $token;
?>
<form method="post" action="security.php">
<input type="text" name="email">
<br>
<input type="text" name="words">
<br>
<input type="hidden" name="token" value="<?php echo $token; ?>">
<input type="submit" name="register" value="Soumettre">
</form>
nazoreen 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 16h13.


 
 
 
 
Partenaires

Hébergement Web