Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Echappement Javascript

5 réponses
Avatar
Yliur
[multiposté sur fr.comp.lang.java et fr.comp.lang.javascript]


Bonjour

Dans une page jsp qui contient un javascript, certains paramètres du
script ne sont pas en dur dans la page mais sont des paramètres venant
de la requête. Le script est appelé dans un attribut onChange, comme
ça :

onChange="javascript ('${parametre}')"

Pour éviter les ennuis il me faut échapper les caractères de la valeur
du paramètre. Donc j'appelle une fonction d'échappement javascript
(celle de la fondation Apache), ça ressemble en gros à ça :

onChange="javascript ('${fnechap:js(parametre)}')"

Et dans certains cas ça ne fonctionne pas.

Ça fonctionne mieux en appliquant aussi un échappement HTML :

onChange="javascript ('${fnechap:js(fnechap:html(parametre))}')"

mais je ne comprends pas pourquoi.
L'échappement Javascript devrait suffire, non ?

Et si le paramètre passé à mon script sert à autre chose qu'à être
réinséré dans du code HTML, est-ce que l'échappement HTML ne va pas
gêner ? A moins que l'échappement HTML ne soit "résolu" par le
navigateur web avant de passer le paramètre au script ?

Voilà, toutes les indications sont les bienvenues...

Yliur

5 réponses

Avatar
SAM
Le 21/09/10 18:32, Yliur a écrit :

[multiposté sur fr.comp.lang.java et fr.comp.lang.javascript]


Bonjour

Dans une page jsp qui contient un javascript, certains paramètres du
script ne sont pas en dur dans la page mais sont des paramètres venant
de la requête. Le script est appelé dans un attribut onChange, comme
ça :

onChange="javascript ('${parametre}')"



Je ne connais pas le jsp.
Cette ligne-là est où ?

${} est censé faire quoi ? et où ? (serveur? navigateur?)

parametre ... c'est quoi ?

Car, au final, le brouteur devrait avoir en code-source qque chose comme :

onchange="faireQueChose('param1','param2');"

et non pas
onChange="javascript(faireQueChose('param1','param2')"



Pour éviter les ennuis il me faut échapper les caractères de la valeur
du paramètre. Donc j'appelle une fonction d'échappement javascript
(celle de la fondation Apache), ça ressemble en gros à ça :

onChange="javascript ('${fnechap:js(parametre)}')"



et :

${fnechap:js('onchange="'+${parametre}+'"')}
?


Et dans certains cas ça ne fonctionne pas.

Ça fonctionne mieux en appliquant aussi un échappement HTML :

onChange="javascript ('${fnechap:js(fnechap:html(parametre))}')"

mais je ne comprends pas pourquoi.
L'échappement Javascript devrait suffire, non ?



tant qu'on ne saura pas en quel string est passé ${parametre}
...
pas fastoche de voir ce qu'il y aurait à échapper

Et si le paramètre passé à mon script sert à autre chose qu'à être
réinséré dans du code HTML, est-ce que l'échappement HTML ne va pas
gêner ? A moins que l'échappement HTML ne soit "résolu" par le
navigateur web avant de passer le paramètre au script ?



??? c'est le navigateur qui est maintenant chargé de traduire le
JavaScript du serveur ?




--
Stéphane Moriaux avec/with iMac-intel
Avatar
Yliur
Le Tue, 21 Sep 2010 19:08:43 +0200
SAM a écrit :

Le 21/09/10 18:32, Yliur a écrit :
>
> [multiposté sur fr.comp.lang.java et fr.comp.lang.javascript]
>
>
> Bonjour
>
> Dans une page jsp qui contient un javascript, certains paramètres du
> script ne sont pas en dur dans la page mais sont des paramètres
> venant de la requête. Le script est appelé dans un attribut
> onChange, comme ça :
>
> onChange="javascript ('${parametre}')"

Je ne connais pas le jsp.
Cette ligne-là est où ?



Dans une jsp.


${} est censé faire quoi ? et où ? (serveur? navigateur?)

parametre ... c'est quoi ?




${parametre} est remplacé sur le serveur par la valeur de
"parametre" (une variable attachés en gros). Ce paramètre est un texte
qui peut éventuellement contenir n'importe quoi, y compris des
caractères comme <, ', >, /, ...


Car, au final, le brouteur devrait avoir en code-source qque chose
comme :

onchange="faireQueChose('param1','param2');"

et non pas
onChange="javascript(faireQueChose('param1','param2')"



Rhââââ, pardon, c'est
onChange="javascript:faireQuelqueChose('${parametre}')"

(avec ':' entre javascript et le reste)


> Pour éviter les ennuis il me faut échapper les caractères de la
> valeur du paramètre. Donc j'appelle une fonction d'échappement
> javascript (celle de la fondation Apache), ça ressemble en gros à
> ça :
>
> onChange="javascript ('${fnechap:js(parametre)}')"

et :

${fnechap:js('onchange="'+${parametre}+'"')}
?



Non, il faut appeler la fonction d'échappement.
En supposant que la valeur de parametre contienne une apostrophe, il
faut la traiter pour que cette apostrophe ne termine pas la chaîne
javascript.
Par exemple si parametre = "coucou'voilà" le code résultant serait
'coucou'voilà', la chaîne se terminant après "coucou" et la "voilà"
étant en dehors. Donc la fonction d'échappement sert à ça.


>
> Et dans certains cas ça ne fonctionne pas.
>
> Ça fonctionne mieux en appliquant aussi un échappement HTML :
>
> onChange="javascript ('${fnechap:js(fnechap:html(parametre))}')"
>
> mais je ne comprends pas pourquoi.
> L'échappement Javascript devrait suffire, non ?

tant qu'on ne saura pas en quel string est passé ${parametre}
...
pas fastoche de voir ce qu'il y aurait à échapper



Comment ça "en quel string" ?


> Et si le paramètre passé à mon script sert à autre chose qu'à être
> réinséré dans du code HTML, est-ce que l'échappement HTML ne va pas
> gêner ? A moins que l'échappement HTML ne soit "résolu" par le
> navigateur web avant de passer le paramètre au script ?

??? c'est le navigateur qui est maintenant chargé de traduire le
JavaScript du serveur ?



Mes exemples semblent marcher quand en plus de l'échappement javascript
j'applique l'échappement html sur le paramètre.

Donc si on a côté serveur
parametre = "blabla<b>"
onChange = "javascript:faireQuelqueChose
('${echapJS (echapHtml (parametre))}')"
le script résultant dans la page html devrait ressembler à ça :
onChange = "javascript:faireQuelqueChose ('blabla&lt;b&gt;')"

Dans ce cas, est-ce qu'au moment de l'appel du javascript le navigateur
web passe 'blabla&lt;b&gt;' ou 'blabla<b>' à la fonction javascript ?
Donc est-ce qu'il "résout" l'échappement html avant de passer le
paramètre la fonction javascript ?
Avatar
Yliur
SAM a écrit :

[...]



Oulala !

Pour recentrer/simplifier :
- Je veux appeler une fonction Javascript.
- Je passe comme paramètre à cette fonction javascript la valeur
d'une variable (une chaîne pouvant contenir n'importe quoi).
- L'appel de la fonction javascript se retrouve écrit dans du code
html, y compris la valeur de la variable, comme paramètre de
l'appel.
- J'ai déjà une fonction d'échappement Javascript et une fonction
d'échappement html et je sais les utiliser (au moment de la
génération du code html contenant le javascript).

Question : pour écrire dans du code html l'appel de la fonction
javascript, y compris le paramètre qui était contenu dans la variable,
je dois appliquer l'échappement javascript au contenu de la variable.
Est-ce que je dois aussi appliquer systématiquement l'échappement html
pour que le code html soit correct ?
Avatar
Mayeul
On 21/09/2010 18:32, Yliur wrote:

[multiposté sur fr.comp.lang.java et fr.comp.lang.javascript]


Bonjour

Dans une page jsp qui contient un javascript, certains paramètres du
script ne sont pas en dur dans la page mais sont des paramètres venant
de la requête. Le script est appelé dans un attribut onChange, comme
ça :

onChange="javascript ('${parametre}')"

Pour éviter les ennuis il me faut échapper les caractères de la valeur
du paramètre. Donc j'appelle une fonction d'échappement javascript
(celle de la fondation Apache), ça ressemble en gros à ça :

onChange="javascript ('${fnechap:js(parametre)}')"

Et dans certains cas ça ne fonctionne pas.

Ça fonctionne mieux en appliquant aussi un échappement HTML :

onChange="javascript ('${fnechap:js(fnechap:html(parametre))}')"

mais je ne comprends pas pourquoi.
L'échappement Javascript devrait suffire, non ?

Et si le paramètre passé à mon script sert à autre chose qu'à être
réinséré dans du code HTML, est-ce que l'échappement HTML ne va pas
gêner ? A moins que l'échappement HTML ne soit "résolu" par le
navigateur web avant de passer le paramètre au script ?

Voilà, toutes les indications sont les bienvenues...




Une règle simple :

- Ça va être mis dans du HTML ? => nécessite un échappement HTML
- Ça va être mis dans du JavaScript ? => nécessite un échappement
JavaScript.
- Ça va être mis dans message UTF-7 ? => nécessite un échappement UTF-7
- Ça va être mis dans du MIME ? => nécessite un échappement MIME
- Ça va être mis dans du JavaScript, embarqué dans du HTML, qui est
transmis en UTF-7, à l'intérieur d'un message MIME ? => Ça nécessite un
échappement JavaScript, suivi d'un échappement HTML, suivi d'un
échappement UTF-7, suivi d'un échappement MIME.

Il est vrai que les navigateurs sont assez permissifs avec le JavaScript
mal échappé en HTML. Mais parfois ils ne s'y retrouvent pas.
Normalement, ils doivent être échappés HTML... Parce qu'ils sont dans du
HTML.

--
Mayeul
Avatar
Yliur
Le Wed, 22 Sep 2010 10:51:21 +0200
Mayeul a écrit :

On 21/09/2010 18:32, Yliur wrote:
>
> [multiposté sur fr.comp.lang.java et fr.comp.lang.javascript]
>
>
> Bonjour
>
> Dans une page jsp qui contient un javascript, certains paramètres du
> script ne sont pas en dur dans la page mais sont des paramètres
> venant de la requête. Le script est appelé dans un attribut
> onChange, comme ça :
>
> onChange="javascript ('${parametre}')"
>
> Pour éviter les ennuis il me faut échapper les caractères de la
> valeur du paramètre. Donc j'appelle une fonction d'échappement
> javascript (celle de la fondation Apache), ça ressemble en gros à
> ça :
>
> onChange="javascript ('${fnechap:js(parametre)}')"
>
> Et dans certains cas ça ne fonctionne pas.
>
> Ça fonctionne mieux en appliquant aussi un échappement HTML :
>
> onChange="javascript ('${fnechap:js(fnechap:html(parametre))}')"
>
> mais je ne comprends pas pourquoi.
> L'échappement Javascript devrait suffire, non ?
>
> Et si le paramètre passé à mon script sert à autre chose qu'à être
> réinséré dans du code HTML, est-ce que l'échappement HTML ne va pas
> gêner ? A moins que l'échappement HTML ne soit "résolu" par le
> navigateur web avant de passer le paramètre au script ?
>
> Voilà, toutes les indications sont les bienvenues...
>

Une règle simple :

- Ça va être mis dans du HTML ? => nécessite un échappement HTML
- Ça va être mis dans du JavaScript ? => nécessite un échappement
JavaScript.
- Ça va être mis dans message UTF-7 ? => nécessite un échappement
UTF-7
- Ça va être mis dans du MIME ? => nécessite un échappement MIME
- Ça va être mis dans du JavaScript, embarqué dans du HTML, qui est
transmis en UTF-7, à l'intérieur d'un message MIME ? => Ça nécessite
un échappement JavaScript, suivi d'un échappement HTML, suivi d'un
échappement UTF-7, suivi d'un échappement MIME.

Il est vrai que les navigateurs sont assez permissifs avec le
JavaScript mal échappé en HTML. Mais parfois ils ne s'y retrouvent
pas. Normalement, ils doivent être échappés HTML... Parce qu'ils sont
dans du HTML.

--
Mayeul




Ok, merci.

Je pensais que l'échappement javascript empêcherait le contenu de
"déborder" et d'être interprété comme du code HTML. Le navigateur
disant : "de là à là c'est la valeur d'un paramètre d'une fonction
javascript, je ne m'occupe pas de ce qu'il y a dedans". Mais
effectivement sur certains exemples ça ne fonctionnait pas.

Donc dans le code html, si la valeur "réelle" du paramètre est
"coucou<b>blabla"
je peux me retrouver après échappement avec quelque chose comme
maFonction ('coucou&lt;b&gt;blabla')

A ce moment, qu'est-ce qui est réellement passé en paramètre à la
fonction ? Est-ce que le navigateur interprète le code html et passe à
la fonction javascript
'coucou<b>blabla'
ou est-ce qu'il se contente de lui passer le contenu tel qu'écrit dans
le code html ?
'coucou&lt;b&gt;blabla'

En d'autres termes, est-ce que le navigateur web applique
systématiquement l'"interprétation html" à tout le code html (et
transforme tous les &lt; en < par exemple) au moment de la lire, avant
de l'interpréter, d'afficher la page, de se demander si c'est
dans un javascript, ... ?
C'est ce qui semblerait correspondre à ton explication : on applique
l'échappement html à tout ce qu'on insère dans le code html parce que
le navigateur va commencer par faire l'opération inverse
(l'"interprétation html"), avant même de se demander ce que ça veut
dire. C'est bien ça ?


Le problème se pose également avec des URL. J'ai des valeurs dans des
variables à insérer dans des URL (comme valeurs de paramètres). Donc si
je ne dis pas de bêtise, je dois constituer mon URL comme ça :
"http://www.serveur.fr?param1=&quot; + encodageURL (val1)
+ "&param2=" + encodageURL (val2)
Sans échappement html, parce que l'encodage des URL n'est pas un
simple échappement mais un encodage assez complet pour éviter les
ennuis dans le code HTML. Ou non ? Sans doute que ça ne risque pas non
plus de produire de cochonneries si j'applique en plus l'échappement
HTML (?).

Hum... ceci dit si par exemple c'était du code XHTML (donc XML), je
serais sans doute obligé d'appliquer l'échappement HTML à *l'ensemble*
de l'URL, par exemple pour transformer toutes les les & en &amp; non ?