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é avec $_SERVER['PHP_SELF']


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Points : 1
    Points
    1
    Par défaut Sécurité avec $_SERVER['PHP_SELF']
    Bonjour à tous,
    Je viens de passer pas mal d'heures à parcourir des forums qui expliquent que pour contrer les risques XSS quand on utilise la variable $_SERVER['PHP_SELF'], il faut utiliser les fonctions htmlentities ou htmlspecialchars, ce que je fais depuis des années.
    Mais j'ai une commission d'experts sur le dos qui m'a fait remarquer que ce genre de protection (qui code les caractères sensibles comme les chevrons) est inefficace quand $_SERVER['PHP_SELF'] est insérée dans un évènement onclick. En effet, j'ai dans la page un bouton qui comporte l'évènement onclick="location.href=\'' . htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'UTF-8') . '?supprimer=1\", ceci pour l'url shop.php?categorie=17.
    Si un malin insère dans l'url un truc du genre shop.php/r'-alert(1)-'u?categorie=17, un simple clic sur le bouton va exécuter le javascript et ouvrir une fenêtre js affichant "1". htmlentities ou htmlspecialchars feraient obstacle à des balises <script> par exemple, mais là, comme on est dans un évènement js, pas besoin de balises pour exécuter le js.
    Et même si les apostrophes sont codées en HTML, le script est exécuté. C'est effrayant !
    Pour contrer cela, je peux au préalable filtrer $_SERVER['PHP_SELF'] pour y supprimer toutes les apostrophes et les guillemets, les parenthèses éventuellement, mais je me demande si c'est suffisant.
    Je me demande aussi s'il existe une autre fonction que les 2 déjà citées pour contrer efficacement ce problème.
    Merci à toutes les bonnes volontés.
    Stéphane

  2. #2
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    Bonjour,

    Le vrai problème, c'est pourquoi vous utilisez un événement onclick pour suivre une URL.
    Pourquoi ne pas utiliser le fonctionnement normal d'un lien <a href=""></a> ??

    Je ne suis pas un grand connaisseur en sécurité mais je vais énoncer ce qui me semble correct.
    Si je fais fausse route, merci de me l'indiquer ^^

    Effectivement, il est possible d'exécuter du Javascript sur un site mais pas besoin d'un lien ou même d'un événement javascript pour le faire.
    Il suffit juste d'ouvrir la console et n'importe qui peut faire unalert() sur n'importe quel site. (y'a même l'autocompletion )
    Ce n'est pas quelque chose à protéger car c'est côté navigateur, et afficher une alert ça ne va pas casser le système.

    A l'inverse, si vous avez des requêtes qui permettent d'accéder ou de modifier des données, il faut les protéger.
    Et utiliser PHP_SELF n'est pas très bon car il est possible de modifier la valeur de cette variable.
    C'est pourquoi, on créé souvent un fichier de config qui contient l'URL de base du site, de cette façon, on peut facilement vérifier que la requête provient de la même URL ou d'une URL extérieure (tentative d'attaque)

    Egalement, si vous interprétez de l'HTML depuis une réponse d'un call AJAX, c'est là qu'il peut y avoir des problèmes car si vous ajoutez directement le code dans le DOM, il sera tout de suite exécuté (et si on y ajoute du Javascript, il est possible de l'exécuter tout en validant l'origine de la requête)

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Merci pour la réponse, Darkstar.
    Je prends un autre exemple : j'ai une liste html <select> qui liste tous les pays du monde (plus de 200, je crois). Quand un visiteur sélectionne un pays, un évènement onclick recharge la page courante pour afficher les données relatives au pays en question. Je pourrais effectivement lister plus de 200 liens <a href=""></a>, mais ça ne serait pas commode... C'est pourquoi j'utilise des évènements js.
    Ensuite, en effet, un simple alert() n'est pas grave, mais j'ai mis cet exemple c'est juste pour illustrer. Comme vous le mentionnez plus loin, une instruction ajax à la place de l'alert peut aller exécuter un script php distant, et là c'est le drame.
    Je pose la question également en me disant que d'autres codeurs ont sans doute aussi un lien sur un évènement javascript. Je souhaite donc aussi avertir contre ce danger, et en même temps trouver une réponse.
    Pour l'instant, j'ai trouvé cette solution : scruter la variable $_SERVER['PHP_SELF'], et si j'y trouve un caractère pas attendu (d'après ce que je sais des url du site), je redirige vers une page 404. Mais ce n'est pas souple, je préfèrerais quelque chose de plus efficace.
    Merci

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 440
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 440
    Points : 15 814
    Points
    15 814
    Par défaut
    comme le disait darkstar123456, la plupart du temps PHP_SELF n'est plus utilisé et les url sont construits à partir d'une valeur dans la configuration.
    cela permet d'éviter d'avoir un souci dans les 2 exemples que vous avez cités.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Merci mathieu.
    Pour être sûr de bien comprendre, parlez-vous de la balise <base> à insérer en en-tête de chaque page ?
    Merci
    Stéphane

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 440
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 440
    Points : 15 814
    Points
    15 814
    Par défaut
    je pensais plutôt aux données de configuration côté serveur. ces données peuvent ensuite être utilisées pour construire les url dans le code php ou dans la génération du code html.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Eh bien merci pour ce conseil. Je vais faire des recherches dans ce sens (pour l'instant je ne trouve rien de consistant avec une recherche Google sur "configuration serveur pour construire les url dans le code php", si quelqu'un a un lien à me donner, ce serait parfait ! ;-)
    Merci.

Discussions similaires

  1. Problème de sécurité avec MS Access
    Par jpduches dans le forum Sécurité
    Réponses: 2
    Dernier message: 13/12/2010, 16h44
  2. problème de sécurité avec Access runtime
    Par DSabah dans le forum Runtime
    Réponses: 1
    Dernier message: 18/09/2007, 15h15
  3. petite question avec $_SERVER['PHP_SELF']
    Par akara dans le forum Langage
    Réponses: 4
    Dernier message: 04/09/2007, 08h06
  4. problème de sécurité avec IE
    Par fabrice001 dans le forum Sécurité
    Réponses: 9
    Dernier message: 27/07/2006, 14h41
  5. [Sécurité] Problème de sécurité avec l'upload
    Par Gwipi dans le forum Langage
    Réponses: 2
    Dernier message: 14/04/2006, 11h54

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