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é] [Optimisation] Sécurisation des Variables POST et GET


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 29
    Points : 22
    Points
    22
    Par défaut [Sécurité] [Optimisation] Sécurisation des Variables POST et GET
    Voila j'ai crée un script pour sécuriser les variables pouvant être modifiées manuellement par un utilisateur.
    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
    function secure($nomvar,$type)
    {
    	if($type == 'post')
    	{
    		$var = $_POST[$nomvar];
    		$_POST[$nomvar] = &$var;
    		$var = str_replace('\'', '\\\'',$var);
    		$var = str_replace('#', '', $var);
    		$var = str_replace('<', '&lt;', $var);
    		$var = str_replace('[', '', $var);
    		$var = str_replace(']', '', $var);
    		$var = str_replace('`', '', $var);
    		$var = str_replace('\\', '', $var);
    	}
    	elseif($type == 'get')
    	{
    		$var = $_GET[$nomvar];
    		$_GET[$nomvar] = &$var;
    		$var = str_replace('\'', '\\\'',$var);
    		$var = str_replace('#', '', $var);
    		$var = str_replace('<', '&lt;', $var);
    		$var = str_replace('[', '', $var);
    		$var = str_replace(']', '', $var);
    		$var = str_replace('`', '', $var);
    		$var = str_replace('\\', '', $var);
    	}
     
    }
    Je voudrais savoir si il y avait des améliorations possibles sur le traitement de ma variable, si j'avais oublié des choses ou autres.

    Merci d'avance pour votre aide.

  2. #2
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    et pourquoi tu fais tout ca ??

    htmlentities()

    addslashes() et stripslashes()

    voila.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 29
    Points : 22
    Points
    22
    Par défaut
    Jme disais bien que c'était un peu long comme code

    Mici

    Edit :

    Donc en gros ca donnerait quelque chose comme ca :
    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
    <?php
    function secure($nomvar,$type)
    {
    	if($type == 'post')
    	{
    		$var = $_POST[$nomvar];
    		$_POST[$nomvar] = &$var;
    		$var = htmlentities ($var);
    		$var = addslashes ($var);
    	}
    	elseif($type == 'get')
    	{
    		$var = $_GET[$nomvar];
    		$_GET[$nomvar] = &$var;
    		$var = htmlentities ($var);
    		$var = addslashes ($var);
    	}
     
    }
    ?>

  4. #4
    Membre éprouvé Avatar de macbook
    Inscrit en
    Février 2006
    Messages
    838
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 838
    Points : 1 009
    Points
    1 009
    Par défaut
    Ecraser l'environnement global est parfois une bonne idée.
    Fais une recherche sur le Poka-Yoké.

  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
    @macbook : Ça en impose plus si on l'écrit correctement
    ポカヨケ

    @CritikKiller : Pourquoi ne pas faire un return dans ta fonction ?
    Sérieusement, le sujet a été traité maintes fois. Regarde la doc de mysql_real_escape_string(), ils y donnent une fonction intéressante. Ensuite, à l'affichage seulement, utilise htmlentities().

  6. #6
    Membre averti Avatar de ShinJava
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 413
    Points : 357
    Points
    357
    Par défaut
    Desolé de squatter ce sujet...
    J'ai du mal a comprendre l'interet de securiser les variables GET et POST
    Car ces variables ne sont pas là par hasard... et heuh... non je ne vois pas pourquoi
    Merci de m'éclairer sur ce sujet

    ++
    ShinJava

  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
    @ShinJava : Normalement, ce ne sont pas les variables elles-mêmes que nous cherchons à modifier mais leur valeur avant de les utiliser dans une requête. Renseigne-toi sur l'injection SQL.

  8. #8
    Membre éprouvé Avatar de macbook
    Inscrit en
    Février 2006
    Messages
    838
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 838
    Points : 1 009
    Points
    1 009
    Par défaut
    Citation Envoyé par Kirkis
    @macbook : Ça en impose plus si on l'écrit correctement
    ポカヨケ
    Mande pardon ????

  9. #9
    Membre averti Avatar de ShinJava
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 413
    Points : 357
    Points
    357
    Par défaut
    Citation Envoyé par Kirkis
    @ShinJava : Normalement, ce ne sont pas les variables elles-mêmes que nous cherchons à modifier mais leur valeur avant de les utiliser dans une requête. Renseigne-toi sur l'injection SQL.

    Houla ! Merci, j'ai commencé à chercher des infos dessus et ca fait peur !
    *s'en va verifier son code*

    merci

    ++
    ShinJava

  10. #10
    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
    @macbook : Peut-être ne vois-tu pas les caractères japonais, peu importe.

    @ShinJava : Renseigne-toi sur toutes les injections, tant que tu y es !
    Au passage : http://thierrylhomme.developpez.com/php/php_secure/

  11. #11
    Membre averti Avatar de ShinJava
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 413
    Points : 357
    Points
    357
    Par défaut
    Citation Envoyé par Kirkis
    @macbook : Peut-être ne vois-tu pas les caractères japonais, peu importe.

    @ShinJava : Renseigne-toi sur toutes les injections, tant que tu y es !
    Au passage : http://thierrylhomme.developpez.com/php/php_secure/


    Houla merci, entre temps j'ai lu l'article de PHP Secure, ma vision sur les requetes SQL à completement changé ! Je vais faire des test beaucoup plus poussé, interdire certains caractères (meme des mots !) , voir meme limité la taille de certains GET/POST...
    Bah dit donc j'ai bien fais d'etre passé par ce sujet.
    Merci beaucoup !

    Sinon j'arrive pas a lire les caracteres japonais aussi : o

    ++
    ShinJava

  12. #12
    Membre averti Avatar de XtofRoland
    Profil pro
    Inscrit en
    Août 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 357
    Points : 392
    Points
    392
    Par défaut
    peux ton provoquer des erreurs, en mofiant un formulaire?

    par exemple en creant un input type=text name="$login"
    qui créerait un variable $_POST['$login'] ... ou qqc de similaire?

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 29
    Points : 22
    Points
    22
    Par défaut
    @CritikKiller : Pourquoi ne pas faire un return dans ta fonction ?
    C'est à dire ca :

    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
    <?php
    function secure($nomvar,$type)
    {
       if($type == 'post')
       {
          $var = $_POST[$nomvar];
          $_POST[$nomvar] = &$var;
          $var = htmlentities ($var);
          $var = addslashes ($var);
          return($var);
       }
       elseif($type == 'get')
       {
          $var = $_GET[$nomvar];
          $_GET[$nomvar] = &$var;
          $var = htmlentities ($var);
          $var = addslashes ($var);
          return($var);
       }
     
    }
    ?>
    Je ne vois pas l'interet du return en faite... Le code php après n'est pas lu?

  14. #14
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Et si la variable derriere $_POST[$nomvar] est un tableau ?
    Pourquoi appliquer htmlentities avant d'insérer en base ?
    Pourquoi appliquer addslashes avant d'afficher sur le navigateur ?
    Pourquoi appliquer addslashes qui ne sera pas suffisant pour certains moteurs de recherche (comme mysql par exemple) ?

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 29
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Mr N.
    Et si la variable derriere $_POST[$nomvar] est un tableau ?
    Dans mon cas, les données qui transitent sont des variables envoyées par un formulaire.

    Citation Envoyé par Mr N.
    Pourquoi appliquer htmlentities avant d'insérer en base ?
    Que ca soit fait avant ou après ca revient en meme. (Enfin c'est vrai qu'après ca pourrait être plus judicieux dans certains cas)

    Citation Envoyé par Mr N.
    Pourquoi appliquer addslashes avant d'afficher sur le navigateur ?
    C'est pas pour afficher sur le navigateur, mais pour pouvoir les traiter sans risques (Injection SQL par exemple...)

    Citation Envoyé par Mr N.
    Pourquoi appliquer addslashes qui ne sera pas suffisant pour certains moteurs de recherche (comme mysql par exemple) ?
    La je ne comprends pas ce que tu veux dire par contre.

  16. #16
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par CritikKiller
    Citation Envoyé par Mr N.
    Et si la variable derriere $_POST[$nomvar] est un tableau ?
    Dans mon cas, les données qui transitent sont des variables envoyées par un formulaire.
    Je ne vois pas le rapport. Les données d'un formulaire peuvent très bien arriver sous forme de tableau, suivant comment tu nommes tes champs.
    Citation Envoyé par CritikKiller
    Citation Envoyé par Mr N.
    Pourquoi appliquer htmlentities avant d'insérer en base ?
    Que ca soit fait avant ou après ca revient en meme. (Enfin c'est vrai qu'après ca pourrait être plus judicieux dans certains cas)
    Non ca revient pas au même puisque tu va te retrouver avec des entités dans ta base et du coup les recherche seront légèrement plus difficile. De plus le contenu d'une base n'est pas forcément à destination de html, donc des entités n'ont pas forcément lieu de s'y trouver.
    Citation Envoyé par CritikKiller
    Citation Envoyé par Mr N.
    Pourquoi appliquer addslashes avant d'afficher sur le navigateur ?
    C'est pas pour afficher sur le navigateur, mais pour pouvoir les traiter sans risques (Injection SQL par exemple...)
    Oui, mais une donnée qui provient d'un formulaire peut très bien être affichées sur un écran intermédiaire de confirmation par exemple. Du coup le addslashes n'est pas pertinent.
    Citation Envoyé par CritikKiller
    Citation Envoyé par Mr N.
    Pourquoi appliquer addslashes qui ne sera pas suffisant pour certains moteurs de recherche (comme mysql par exemple) ?
    La je ne comprends pas ce que tu veux dire par contre.
    Tout simplement que addslashes n'est pas suffisant pour se prémunir des injections SQL sous mysql. Chaque moteur pocède ses caractères d'échappements, et addslashes n'est pas suffisant dans tous les cas.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 29
    Points : 22
    Points
    22
    Par défaut
    Tout simplement que addslashes n'est pas suffisant pour se prémunir des injections SQL sous mysql. Chaque moteur pocède ses caractères d'échappements, et addslashes n'est pas suffisant dans tous les cas.
    C'est à dire?

    Et que me propose tu comme solution alors pour eviter les injections SQL et les attaques XSS? Le Poka Yoké? (je suis en train de lire l'article)

  18. #18
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Deux types d'attaques différentes == deux méthodes de protection différentes.
    pour XSS, htmlentities (a priori et ca dépend des cas)
    pour SQL, ca dépend de ton moteur. Si c'est MySQL alors mysql_real_escape_string sera sufffisant dans 99% des cas.

    Sinon l'article de pokatruc je l'ai pas encore lu donc je ne peux rien dire dessus...

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 29
    Points : 22
    Points
    22
    Par défaut
    Par contre je suis sur la doc de la fonction :
    mysql_real_escape_string()

    Mais je n'arrive pas à comprendre les arguments :
    mysql_real_escape_string(MYSQL *mysql, char *en, const char *de, unsigned long longueur)

    [MYSQL *mysql] : ?
    [char *en] : ?
    [const char *de] : ?
    [unsigned long longueur] : ?

    Si on pouvait m'éclairer, merci d'avance.

  20. #20
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Gné ? Quelle doc ? apparemment tu t'es trompé de bible
    http://g-rossolini.developpez.com/tu...ncepts#LVI-D-6

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Optimisation script pour réordonner des N° de Lots
    Par polemoss dans le forum MySQL
    Réponses: 1
    Dernier message: 06/06/2007, 18h37
  2. [Optimisation] Mémoire occupée par des images
    Par Crowell dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 23/05/2007, 16h34
  3. [Optimisation] Le plus rapide des 2 ?
    Par shadowbob dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 27/12/2006, 10h52
  4. Optimiser les requetes POST et GET
    Par localhost dans le forum Langage
    Réponses: 3
    Dernier message: 02/04/2006, 02h53
  5. Optimiser les jointures dans des requêtes
    Par klereth dans le forum PostgreSQL
    Réponses: 12
    Dernier message: 23/04/2005, 17h29

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