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 :

rawurlencode après un htmlentities


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Points : 82
    Points
    82
    Par défaut rawurlencode après un htmlentities
    Bonjour,

    Je fais passer un paramètre en GET d'une page P1 à une autre P2 pour un traitement.

    Du coup, j'utlise la fonction rawurlencode(paramètre) avant de l'accoler à l'URL de la nouvelle page où on a besoin de ce paramètre (afin de gérer les accents etc...)
    Le traitement se passe bien et on revient à la première page avec ce paramètre sur lequel je fais un decodeURIComponent(parametre) en Javascript afin de le décoder et pouvoir le remettre dans un formulaire.

    Les informations passant en clair étant donné qu'au tout début qu'avant le premier rawurlencode, je ne fais pas de htmlentities, ce n'est pas trop sécurisé.

    Le problème se pose lorsque je veux sécuriser la chose et que je souhaite utiliser htmlentities avant de faire l'encodage du paramètre avec rawurlencode.

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $parametre = tèst
    $param = rawurlencode($parametre)
    me donne

    Puis, après décodage au niveau du JS avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var param = decodeURIComponent(parametre)
    J'obtiens bien:

    Maintenant, je veux sécuriser la chose avec htmlentities.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $param = htmlentities($parametre)
    $paramnew = rawurlencode($parametre)
    J'obtiens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    t%26Atilde%3B%26uml%3Bst
    Ensuite, avec la fonction JS que j'ai trouvé sur StackOverFlow qui est censé fonctionner:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function htmldecode(s){
    		window.HTML_ESC_MAP = {
    		"nbsp":" ","iexcl":"¡","cent":"¢","pound":"£","curren":"¤","yen":"¥","brvbar":"¦","sect":"§","uml":"¨","copy":"©","ordf":"ª","laquo":"«","not":"¬","reg":"®","macr":"¯","deg":"°","plusmn":"±","sup2":"²","sup3":"³","acute":"´","micro":"µ","para":"¶","middot":"·","cedil":"¸","sup1":"¹","ordm":"º","raquo":"»","frac14":"¼","frac12":"½","frac34":"¾","iquest":"¿","Agrave":"À","Aacute":"Á","Acirc":"Â","Atilde":"Ã","Auml":"Ä","Aring":"Å","AElig":"Æ","Ccedil":"Ç","Egrave":"È","Eacute":"É","Ecirc":"Ê","Euml":"Ë","Igrave":"Ì","Iacute":"Í","Icirc":"Î","Iuml":"Ï","ETH":"Ð","Ntilde":"Ñ","Ograve":"Ò","Oacute":"Ó","Ocirc":"Ô","Otilde":"Õ","Ouml":"Ö","times":"×","Oslash":"Ø","Ugrave":"Ù","Uacute":"Ú","Ucirc":"Û","Uuml":"Ü","Yacute":"Ý","THORN":"Þ","szlig":"ß","agrave":"à","aacute":"á","acirc":"â","atilde":"ã","auml":"ä","aring":"å","aelig":"æ","ccedil":"ç","egrave":"è","eacute":"é","ecirc":"ê","euml":"ë","igrave":"ì","iacute":"í","icirc":"î","iuml":"ï","eth":"ð","ntilde":"ñ","ograve":"ò","oacute":"ó","ocirc":"ô","otilde":"õ","ouml":"ö","divide":"÷","oslash":"ø","ugrave":"ù","uacute":"ú","ucirc":"û","uuml":"ü","yacute":"ý","thorn":"þ","yuml":"ÿ","fnof":"ƒ","Alpha":"Α","Beta":"Β","Gamma":"Γ","Delta":"Δ","Epsilon":"Ε","Zeta":"Ζ","Eta":"Η","Theta":"Θ","Iota":"Ι","Kappa":"Κ","Lambda":"Λ","Mu":"Μ","Nu":"Ν","Xi":"Ξ","Omicron":"Ο","Pi":"Π","Rho":"Ρ","Sigma":"Σ","Tau":"Τ","Upsilon":"Υ","Phi":"Φ","Chi":"Χ","Psi":"Ψ","Omega":"Ω","alpha":"α","beta":"β","gamma":"γ","delta":"δ","epsilon":"ε","zeta":"ζ","eta":"η","theta":"θ","iota":"ι","kappa":"κ","lambda":"λ","mu":"μ","nu":"ν","xi":"ξ","omicron":"ο","pi":"π","rho":"ρ","sigmaf":"ς","sigma":"σ","tau":"τ","upsilon":"υ","phi":"φ","chi":"χ","psi":"ψ","omega":"ω","thetasym":"ϑ","upsih":"ϒ","piv":"ϖ","bull":"•","hellip":"…","prime":"′","Prime":"″","oline":"‾","frasl":"⁄","weierp":"℘","image":"ℑ","real":"ℜ","trade":"™","alefsym":"ℵ","larr":"←","uarr":"↑","rarr":"→","darr":"↓","harr":"↔","crarr":"↵","lArr":"⇐","uArr":"⇑","rArr":"⇒","dArr":"⇓","hArr":"⇔","forall":"∀","part":"∂","exist":"∃","empty":"∅","nabla":"∇","isin":"∈","notin":"∉","ni":"∋","prod":"∏","sum":"∑","minus":"−","lowast":"∗","radic":"√","prop":"∝","infin":"∞","ang":"∠","and":"∧","or":"∨","cap":"∩","cup":"∪","int":"∫","there4":"∴","sim":"∼","cong":"≅","asymp":"≈","ne":"≠","equiv":"≡","le":"≤","ge":"≥","sub":"⊂","sup":"⊃","nsub":"⊄","sube":"⊆","supe":"⊇","oplus":"⊕","otimes":"⊗","perp":"⊥","sdot":"⋅","lceil":"⌈","rceil":"⌉","lfloor":"⌊","rfloor":"⌋","lang":"⟨","rang":"⟩","loz":"◊","spades":"♠","clubs":"♣","hearts":"♥","diams":"♦","\"":"quot","amp":"&","lt":"<","gt":">","OElig":"Œ","oelig":"œ","Scaron":"Š","scaron":"š","Yuml":"Ÿ","circ":"ˆ","tilde":"˜","ndash":"–","mdash":"—","lsquo":"‘","rsquo":"’","sbquo":"‚","ldquo":"“","rdquo":"”","bdquo":"„","dagger":"†","Dagger":"‡","permil":"‰","lsaquo":"‹","rsaquo":"›","euro":"€"};
    		if(!window.HTML_ESC_MAP_EXP)
    			window.HTML_ESC_MAP_EXP = new RegExp("&("+Object.keys(HTML_ESC_MAP).join("|")+");","g");
    		return s?s.replace(window.HTML_ESC_MAP_EXP,function(x){
    			return HTML_ESC_MAP[x.substring(1,x.length-1)]||x;
    		}):s;
    	}
    je reviens sur la première page mais avec cette valeur pour le paramètre:

    Connaissez vous pourquoi j'obtiens ce résultat? N'y a t'il rien de déjà existant qui pourrait m'aider à régler ce problème et faire que j'arrive à faire ce que j'aimerais.

    Je vous remercie par avance,

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    En quoi htmlentities() "sécurise" l'URL ?
    Et ça "sécurise" quoi, en fait ? (un exemple à donner ?)

    Utilise plutôt htmlspecialchars().
    Ou rien.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Points : 82
    Points
    82
    Par défaut
    htmlentities() est à priori comme la fonction htmlspecialchars() qui permet de se protéger contre les attaques XSS en remplaçant les caractères spéciaux par leurs équivalent HTML.

    Après je peux aussi ne rien mettre mais du coup, l'utilisateur pourrait ajouter un script JS malicieux. J'aimerais faire quelque chose de propre.

    Quel est votre avis là dessus?

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 232
    Points : 15 525
    Points
    15 525
    Par défaut
    la fonction en elle même ne protège rien toute seule, cela dépend de l'utilisation que vous en faites.
    montrez nous un exemple de votre code où un utilisateur peut insérer du code malveillant.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...Je fais passer un paramètre en GET...
    Que tu "protèges" la variable ou pas, il faut être conscient qu'elle peut être facilement modifiée à la main dans l'URL !

    Donc, ce n'est pas en amont qu'il faut la protèger, mais en aval, au moment de sa récupération.
    Donc, ici, en JavaScript.

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Rappels sur les fonctions en question :
    rawurlencode encode les caractères spéciaux pour les rendre compatible avec une url. Aucune protection ici, juste on évite de juste 1) d'avoir une url qui ne fonctionne pas et/ou 2) de perdre des données. A utiliser à la construction de l'url. On peut aussi utiliser http_​build_​query (qui évite d'avoir à encoder les paramètres un par un)
    htmlentities (et htmlspecialchars dans une moindre mesure) transforme les caractères qui peuvent l'être en entités HTML. Le but est d'afficher les caractères spéciaux au lieu d'essayer de les interpréter, ce qui permet notamment d'éviter les injections XSS. A utiliser à l'affichage d'une donnée potentiellement problématique.

    Citation Envoyé par Henry22 Voir le message
    Les informations passant en clair étant donné qu'au tout début qu'avant le premier rawurlencode, je ne fais pas de htmlentities, ce n'est pas trop sécurisé.
    Tant que tu ne fais pas d'affichage, ce n'est pas un problème.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Points : 82
    Points
    82
    Par défaut
    Effectivement, les informations passent en GET et non en POST.

    Les informations peuvent donc être modifier directement au niveau de l'URL. Donc il n'y a rien qui pourrait empêcher une personne de modifier l'URL.

    Du coup, je me pose une question. J'ai une page page1.html qui contient:

    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
     
    //Fonction qui permet de réccupérer un paramètre de l'URL
    function $_GET(param) {
    	var vars = {};
    	window.location.href.replace( location.hash, '' ).replace( 
    		/[?&]+([^=&]+)=?([^&]*)?/gi, // regexp
    		function( m, key, value ) { // callback
    			vars[key] = value !== undefined ? value : '';
    		}
    	);
     
    	if ( param ) {
    		return vars[param] ? vars[param] : null;	
    	}
    	return vars;
    }
     
    function valider() {
    	var parametre1 = document.getElementById("parametre1").value;
     
    	var parametre2 = $_GET('parametre2');
     
    	var parametres = document.getElementById("parametres");
    	parametres.value = "parametre1="+parametre1.replace(" ","%20")+"&parametre2="+parametre2;
     
    	if (parametre1=="") {
    		alert("Saisissez le parametre1");
    	}
    	else {
    		window.location.href = "./page2.php"+parametres.value;
    	}
    }
     
    <body>
    	<div class="form-group">
    		<label for="titre">Entrer le paramètre</label>
    		<input type="text" class="form-control" id="parametre" />
    	</div>
    	<button type="button" onClick="valider();">Valider</button>
    </body>
    Voilà le code de page2.php:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
    $parametre2 = htmlentities($_GET["parametre2"]);
     
    //Du coup, ici j'évite le htmlentities comme cela ne fonctionne pas très bien et que c'est ce paramètre qui contiendra des accents etc...
    $parametre1 = $_GET["parametre1"];
     
    $parametre_encode = rawurlencode($parametre1);
     
    $complement_url = "parametre1=".$parametre_encode."&parametre2=".$parametre2;
     
    //Un code cURL ici pour aller vers une 3e page et passer l'ensemble des paramètres de l'URL
    Ensuite de la page2.php, j'ai besoin de pouvoir éventuellement revenir sur la page1.html avec les paramètres dans le cas où la personne souhaiterait remettre ces même paramètres.

    Sinon, à priori, il n'y a pas d'affichage donc d'après ce que je comprends, je n'ai en aucun cas besoin des fonctions htmlentities.
    Que pensez vous de ce code? Peut on faire passer les paramètres en POST sans qu'on ait besoin d'un submit par exemple pour revenir vers page1.html à partir de page2.php?

    Merci par avance,

  8. #8
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Tu n'as effectivement pas besoin des htmlentities dans le code de ta page2 (ce que tu nous montres en tout cas) : htmlentities sert à faire de l'affichage HTML, et tu ne fais aucun affichage.

    Pour la page 1 :
    Ce que tu as c'est un formulaire que tu veux envoyer par url. Pourquoi ne pas simplement pas faire un formulaire classique en methode GET ? Au passage, pour valider si le champ est renseigné, tu peux utiliser l'attribut HTML5 required qui va faire ça automatiquement.

    Par ailleurs, je ne comprends pas bien pourquoi tu parles de formulaire "sans bouton submit" : tu as un bouton qui déclenche une fonction qui fait une redirection. Honnêtement je ne vois pas bien la différence avec un bouton submit classique

    Et ya-t-il une raison pour laquelle ta page1 n'est pas un script PHP ? Ce serait quand même vachement plus simple.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 162
    Points : 82
    Points
    82
    Par défaut
    En fait, le cURL de la page2.php permet d'appeler via l'URL un script sur un autre serveur qui produit un PDF. Sur ce PDF apparaitra le paramètre.

    Sans le htmlentities, il apparaît correctement et effectivement il n'y a pas pas de echo qui est fait, d'affichage en particulier. Du coup, à priori, on n'a pas besoin de se protéger contre d'éventuelles attaques XSS étant qu'on ne fait pas réellement d'affichage en tant que tel.

    Concernant page1.html il n'y a pas réellement de raison. Le principal pour moi, c'est de bien comprendre qu'il n'y a pas besoin d'htmlentities étant donné qu'au final c'est juste une inscription sur un PDF qui est effectuée.

  10. #10
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Utiliser htmlentities ici, c'est comme mettre un déguisement pour ne pas être reconnu, mais ne pas sortir de chez soi : au mieux ça ne sert à rien, au pire ton alarme à reconnaissance faciale va refuser de te reconnaitre et t'envoyer la police.

    Ce que tu peux utiliser ici, ce sont des fonctions de validation et de nettoyage, comme filter_​input ou strip_​tags. Par exemple, si un champ devrait être un entier, tu peux soit vérifier que c'est un entier(et renvoyer une erreur si ce n'est pas le cas), soit supprimer tous les caractères qui ne sont pas des chiffres.

    Dans un autre registre, si ton formulaire est accessible au public, tu peux ajouter un anti-spam-bot
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  11. #11
    Invité
    Invité(e)
    Par défaut
    @Celira
    As-tu déjà pensé à faire un "Recueil de métaphores" ?

  12. #12
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    @jreaux : C'est vrai que j'use et j'abuse de la métaphore.
    Il faut dire que la métaphore c'est LE truc génial pour expliquer. Quand tu dis à ton oncle qui a un problème avec son ordinateur qui fume "Non, je ne peux pas t'aider, moi je suis dév web front, je n'y connais rien en hardware" en général tu as droit à un regard vide et une réponse du genre "mais tu es informaticien non ?". Si tu lui dis, "l'informatique c'est comme la médecine, ya plein de spécialités. Là métaphoriquement, ton ordi il a un problème de digestion, et moi je suis ophtalmo, j'y connais rien en système digestif", ça passe en général beaucoup mieux.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  13. #13
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par Henry22 Voir le message
    htmlentities() est à priori comme la fonction htmlspecialchars() qui permet de se protéger contre les attaques XSS en remplaçant les caractères spéciaux par leurs équivalent HTML
    htmlspecialchars est suffisant pour cela. htmlentities va encoder tous les caractères qui ont des équivalents en entités HTML et ça fait un code super lourd, inutile si ton but est simplement de te protéger des attaques xss (comme l'a déjà dit jreaux62).

Discussions similaires

  1. [MySQL] affichage après conversion htmlentities
    Par mims1664 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 23/03/2007, 13h22
  2. action APRES chargement complet ...
    Par PinGuy dans le forum Delphi
    Réponses: 7
    Dernier message: 06/07/2006, 17h16
  3. Réponses: 34
    Dernier message: 24/05/2006, 01h08
  4. [MySQL] Chaine tronquée apres htmlentities.
    Par castaka dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 16/05/2005, 12h54
  5. Comment ne pas rejouer une animation après un clic ?
    Par mmmmhhh dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 04/09/2002, 16h11

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