IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Sécurité] Vos avis sur mes scripts sécurisés [Fait]


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 262
    Points : 329
    Points
    329
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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>

  2. #2
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    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

  3. #3
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    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

  4. #4
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    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

  5. #5
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    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.

  6. #6
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 494
    Points : 6 062
    Points
    6 062
    Par défaut
    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 !...

  7. #7
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    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().

  8. #8
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  9. #9
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 262
    Points : 329
    Points
    329
    Par défaut
    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...

  10. #10
    Membre averti
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 262
    Points : 329
    Points
    329
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Vos avis sur mon script
    Par debdarky dans le forum Shell et commandes GNU
    Réponses: 19
    Dernier message: 09/09/2013, 10h13
  2. [MySQL] vos avis sur un script qui fonctionne pas
    Par younek dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/12/2008, 16h47
  3. Vos avis sur Lazarus
    Par JoseF dans le forum Lazarus
    Réponses: 18
    Dernier message: 16/10/2007, 16h01
  4. Réponses: 1
    Dernier message: 06/10/2006, 21h03
  5. Vos avis sur les Blog's SVP
    Par Marc Lussac dans le forum Evolutions du club
    Réponses: 9
    Dernier message: 16/02/2005, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo