JeuWeb - Crée ton jeu par navigateur
protéger contre les XSS tout en concervant les html special char? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : protéger contre les XSS tout en concervant les html special char? (/showthread.php?tid=94)



protéger contre les XSS tout en concervant les html special char? - Argorate - 03-05-2014

bonjour,

j'aimerais savoir comment feriez-vous pour appliquez le htmlspecialchars($texte) uniquement sur des caractères qui ne sont pas eux même des spécial char.


Exemple:

$texte = '€ & du texte';

j'aimerais avoir en sortie:

€ & du texte

au lieu de quoi j'obtiens pour l'instant:

€ & du texte.

Une idée pour régler ce conflit?

thx.


RE: protéger contre les XSS tout en concervant les html special char? - Sephi-Chan - 03-05-2014

Tu n'as qu'à décoder les entités du contenu à afficher (pour le normaliser en un truc propre) puis repasser un coup dessus.

Pour le XSS ce sont les balises HTML que tu dois éviter, les entités importent peu.


RE: protéger contre les XSS tout en concervant les html special char? - Ekilio - 03-05-2014

Bonjour,

Code PHP :
<?php

$text
= "&euro; & du texte <b>et du html</b>";

echo
htmlspecialchars(html_entity_decode($text));

Comme ça ?

Edit : trop lent, c'est ce que Sephi-Chan proposait ^^'


RE: protéger contre les XSS tout en concervant les html special char? - julp - 03-05-2014

Euh, ce n'est pas à ça que sert le 4e paramètre de htmlspecialchars ?


RE: protéger contre les XSS tout en concervant les html special char? - Xenos - 03-05-2014

Julp a parfaitement raison Smile


Snippet

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<?php
function testHtmlSpecialChars($texte)
{
// $flags = ENT_QUOTES | ENT_HTML5 | ENT_QUOTES;
$flags = ENT_QUOTES | ENT_HTML401;
$encoding = "UTF-8";
var_dump(
array(
'Texte original ' => $texte
,'Texte htmlspecialchars() ' => htmlspecialchars($texte, $flags, $encoding)
,'Texte htmlspecialchars(...,false)' => htmlspecialchars($texte, $flags, $encoding, false)
)
);
}
$textes = array(
'texte simple'
,'texte l\'entité HTML non encodée & €'
,'texte avec l&quot;entité HTML encodée &euro; & l\'entité pas encodée €'
,'texte à &lt;strong&gt;balise&lt;/strong&gt;'
);
array_walk($textes, 'testHtmlSpecialChars');
?>
</body>
</html>

Résultat:
Résultat a écrit :array (size=3)
'Texte original ' => string 'texte simple' (length=12)
'Texte htmlspecialchars() ' => string 'texte simple' (length=12)
'Texte htmlspecialchars(...,false)' => string 'texte simple' (length=12)

array (size=3)
'Texte original ' => string 'texte l'entité HTML non encodée & €' (length=39)
'Texte htmlspecialchars() ' => string 'texte l'entité HTML non encodée &amp; €' (length=48)
'Texte htmlspecialchars(...,false)' => string 'texte l'entité HTML non encodée &amp; €' (length=48)

array (size=3)
'Texte original ' => string 'texte avec l&quot;entité HTML encodée &euro; & l'entité pas encodée €' (length=75)
'Texte htmlspecialchars() ' => string 'texte avec l&amp;quot;entité HTML encodée &amp;euro; &amp; l'entité pas encodée €' (length=92)
'Texte htmlspecialchars(...,false)' => string 'texte avec l&quot;entité HTML encodée &euro; &amp; l'entité pas encodée €' (length=84)

array (size=3)
'Texte original ' => string 'texte à &lt;strong&gt;balise&lt;/strong&gt;' (length=44)
'Texte htmlspecialchars() ' => string 'texte à &amp;lt;strong&amp;gt;balise&amp;lt;/strong&amp;gt;' (length=60)
'Texte htmlspecialchars(...,false)' => string 'texte à &lt;strong&gt;balise&lt;/strong&gt;' (length=44)

@Sephi:
Si l'endroit où la donnée utilisateur est mise est un attribut, l'échappement des caractères spéciaux est important Wink

Exemple:

<div data-message="<?php echo echapperLesBalises($texte); ?>">...</div>

Peut finir en:

<div data-message="foo" onmousein="java$criptSaddocument.cookie);">...</div>

Avec l'entrée suivante pour $texte:
foo" onmousein="java$criptSaddocument.cookie);

L'OWASP fournit une cheat sheet sur XSS (en) pour savoir où mettre les données utilisateurs, où ne pas les mettre et comment les échapper.


RE: protéger contre les XSS tout en concervant les html special char? - Argorate - 03-05-2014

(03-05-2014, 08:11 AM)Ekilio a écrit : Bonjour,

Code PHP :
<?php

$text
= "&euro; & du texte <b>et du html</b>";

echo
htmlspecialchars(html_entity_decode($text));

Comme ça ?

Edit : trop lent, c'est ce que Sephi-Chan proposait ^^'


htmlspecialchars(html_entity_decode('test &euro; & test')) // => test € & test => marche pas^^

Sinon julp, Xenos

en effet... super intuitif d'ailleurs
Citation :htmlspecialchars($texte, ENT_QUOTES | ENT_HTML40, 'UTF-8', false)
^^

merci


RE: protéger contre les XSS tout en concervant les html special char? - Xenos - 04-05-2014

je pense que tu auras corrigé, mais au cas où quelqu'un passe sur le sujet sans l'envie de tout lire: ENT_HTML401 (il manque un 1).


htmlspecialchars($texte, ENT_QUOTES | ENT_HTML401, 'UTF-8', false);



RE: protéger contre les XSS tout en concervant les html special char? - Argorate - 04-05-2014

mauvais copier coller Smile

dsl