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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Gérant
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Dom-Tom

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    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 : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    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
    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 : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    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
    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
    Membre éprouvé
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 509
    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 509
    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.

+ 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