summaryrefslogtreecommitdiff
path: root/talermerchantdemos/blog/articles/fr/javascript-trap.html
blob: afde8b971b33fd86ad0aa2b09fa790bf68416c8c (plain)
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
<!--#set var="ENGLISH_PAGE" value="/philosophy/javascript-trap.en.html" -->

<!--#include virtual="/server/header.fr.html" -->
<!-- Parent-Version: 1.90 -->

<!-- This file is automatically generated by GNUnited Nations! -->
<title>Le piège JavaScript</title>

<!--#include virtual="/philosophy/po/javascript-trap.translist" -->
<!--#include virtual="/server/banner.fr.html" -->
<h2>Le piège JavaScript</h2>

<p>par <a href="http://www.stallman.org/">Richard Stallman</a></p>

<p><strong>Vous exécutez peut-être des programmes non libres sur votre
ordinateur chaque jour sans même vous en apercevoir – par l'intermédiaire de
votre navigateur web.</strong></p>

<!-- any links that used to point to the appendices should point to
     free-your-javascript.html instead.  -->
<blockquote>
<p>À l'attention des webmestres : il y a <a
href="/software/librejs/free-your-javascript.html">plusieurs moyens</a>
d'indiquer la licence des programmes JavaScript présents sur un site web.</p>
</blockquote>

<p>Dans la communauté du logiciel libre, l'idée que <a
href="/philosophy/free-software-even-more-important.html">les programmes non
libres nuisent à leurs utilisateurs</a> est familière. Certains d'entre nous
défendent leur liberté en interdisant l'accès de leur machine à tous les
logiciels privateurs<a id="TransNote1-rev"
href="#TransNote1"><sup>1</sup></a> et beaucoup d'autres considèrent que la
non-liberté d'un programme est un point négatif.</p>

<p>Beaucoup d'utilisateurs sont conscients que ce problème s'applique aussi aux
modules que les navigateurs proposent d'installer, puisqu'ils peuvent être
libres ou non. Mais les navigateurs exécutent d'autres programmes non libres
sans vous demander votre avis ni même vous prévenir – des programmes inclus
dans des pages web ou vers lesquels elles ont des liens. Ces programmes sont
le plus souvent écrits en JavaScript, bien que d'autres langages puissent
être utilisés.</p>

<p>JavaScript (dont le nom officiel, mais peu utilisé, est ECMAScript) servait
autrefois à orner les pages web de fioritures mineures, comme des
fonctionnalités de navigation et d'affichage agréables mais non
essentielles. Il était acceptable de les considérer comme de pures
extensions du langage de balises HTML et d'ignorer le problème.</p>

<p>Certains sites utilisent encore JavaScript de cette façon, mais beaucoup
l'utilisent pour des programmes conséquents réalisant des tâches
importantes. Par exemple, Google Docs essaie d'installer dans votre
navigateur un programme JavaScript qui pèse un demi mégaoctet, sous une
forme compactée que nous pourrions appeler ObfuScript. Cette forme compactée
s'obtient à partir du code source en supprimant les espaces supplémentaires
qui rendent le code lisible ainsi que les remarques explicatives qui le
rendent compréhensible, et en remplaçant chaque nom évocateur par un nom
court arbitraire pour qu'on ne puisse pas savoir ce qu'il est censé
représenter.</p>

<p>Le logiciel libre est <a href="/philosophy/free-sw.html">par définition</a>
un logiciel qui, entre autres, permet aux utilisateurs d'avoir accès à son
code source (c'est-à-dire à son plan). Le code source d'un programme est la
forme préférée des programmeurs pour effectuer des modifications – et il
comprend les espaces supplémentaires, les remarques explicatives et les noms
évocateurs. Le code compacté est un substitut bidon et inutile au code
source ; le véritable code source de ces programmes n'est pas disponible
pour les utilisateurs, donc ces derniers ne peuvent pas le comprendre ; par
conséquent, le programme est non libre.</p>

<p>Outre qu'ils ne sont pas libres, beaucoup de ces programmes sont
<em>malveillants</em> parce qu'ils <a
href="http://github.com/w3c/fingerprinting-guidance/issues/8">espionnent
l'utilisateur</a>. Pire encore, certains sites utilisent des services qui
enregistrent <a
href="https://freedom-to-tinker.com/2017/11/15/no-boundaries-exfiltration-of-personal-data-by-session-replay-scripts/">toutes
ce que fait l'utilisateur quand il regarde une page</a>. Ces services sont
censés « caviarder » les enregistrements pour en exclure certaines données
sensibles dont le site web ne doit pas avoir connaissance. Mais en admettant
même que cela soit fait de manière fiable, le but de ces services est de
donner au site d'autres données personnelles qu'il ne devrait pas posséder.</p>

<p>Normalement, les navigateurs ne vous disent pas quand ils chargent des
programmes JavaScript. Certains d'entre eux ont un moyen de désactiver
JavaScript totalement, mais même si vous êtes conscient du problème, vous
aurez beaucoup de mal à identifier les programmes non triviaux et non libres
pour les bloquer. De toute façon, même au sein de la communauté du logiciel
libre, la plupart des utilisateurs ne sont pas conscients de ce problème ;
le silence des navigateurs tend à le dissimuler.</p>

<p>Il est possible de publier un programme JavaScript en tant que logiciel
libre, en distribuant le code source sous une licence libre. Si le programme
est autonome (c'est-à-dire si son fonctionnement et son but sont
indépendants de la page qui l'a amené), tout va bien ; vous pouvez le copier
dans un fichier sur votre machine, le modifier, puis l'exécuter en lisant ce
fichier avec votre navigateur. Mais ce n'est pas le cas habituellement.</p>

<p>Dans le cas habituel, les programmes JavaScript sont conçus pour une page ou
un site particulier qui en dépend pour fonctionner. Alors se présente un
autre problème : même si le code source du programme est disponible, les
navigateurs ne proposent aucun moyen d'exécuter votre version modifiée à la
place de l'original lorsque vous êtes sur cette page ou ce site. L'effet est
comparable à la tivoïsation bien qu'il soit, en principe, un peu moins
difficile à contourner.</p>

<p>JavaScript n'est pas le seul langage que les sites web utilisent pour les
programmes envoyés aux utilisateurs. Flash permet la programmation à l'aide
d'une variante étendue de JavaScript ; si un jour nous avons un lecteur
Flash libre suffisamment complet, il nous faudra traiter le problème des
programmes Flash non libres. Silverlight est susceptible de poser un
problème similaire à Flash, en pire, car Microsoft l'utilise comme
plateforme pour des codecs non libres. Un remplacement libre de Silverlight
ne ferait pas l'affaire pour le monde du libre, à moins qu'il ne propose
normalement des codecs de remplacement libres.</p>

<p>Les applets Java s'exécutent aussi dans le navigateur et soulèvent des
problèmes similaires. En général, n'importe quel système d'applet pose ce
genre de problème. Avoir un environnement d'exécution libre pour un applet
ne fait que déplacer le problème.</p>

<p>Il est théoriquement possible de programmer en HTML et CSS, mais en pratique
les possibilités sont limitées et c'est assez pénible ; le simple fait de
réaliser quelque chose par cette technique est un hack impressionnant. De
tels programmes doivent être libres, mais aujourd'hui, en 2019, cela ne pose
pas de réel problème pour la liberté de l'utilisateur.</p>

<p>Un fort mouvement s'est développé qui appelle les sites web à ne communiquer
qu'avec des formats et des protocoles libres (certains disent « ouverts ») ;
c'est-à-dire des formats dont la documentation est publiée et que chacun est
libre de mettre en œuvre. Cependant, la présence de programmes JavaScript
dans les pages web rend ce critère insuffisant. Le langage JavaScript
lui-même, en tant que format, est libre ; utiliser JavaScript dans un site
web n'est donc pas nécessairement mauvais. Cependant, comme nous l'avons vu
plus haut, cela peut être mauvais si le programme JavaScript est non
libre. Quand le site transmet un programme à l'utilisateur, il ne suffit pas
que le programme soit écrit dans un langage documenté et libre d'entraves ;
ce programme doit aussi être libre. « Ne transmet que des programmes libres
aux utilisateurs » ; cette règle doit faire partie des critères définissant
un comportement correct des sites web.</p>

<p>Le chargement et l'exécution silencieux de programmes non libres est l'un
des nombreux problèmes soulevés par les « applications web ». Le terme
« application web » a été conçu pour ne pas tenir compte de la distinction
fondamentale entre un logiciel fourni aux utilisateurs et un logiciel
s'exécutant sur un serveur. Il peut faire référence à un programme client
spécialisé qui s'exécute dans un navigateur ; il peut faire référence à un
logiciel serveur spécialisé ; il peut faire référence à un programme client
spécialisé travaillant main dans la main avec un logiciel serveur
spécialisé. Les côtés client et serveur soulèvent des problèmes éthiques
différents, bien qu'ils soient si intimement intégrés qu'on pourrait les
considérer comme parties d'un seul et même programme. Cet article ne
s'occupe que du logiciel client. Nous traitons le problème du serveur
séparément.</p>

<p>Pratiquement, comment pouvons-nous traiter le problème des programmes
JavaScript non triviaux et non libres dans les sites web ? La première étape
est de ne pas les laisser s'exécuter.</p>

<p>Que voulons-nous dire par « non trivial » ? Puisque c'est une question
d'interprétation, il s'agit de concevoir un critère simple qui donne de bons
résultats, plutôt que de déterminer la seule réponse correcte.</p>
<p>
Actuellement, nous considérons un programme JavaScript comme non trivial
s'il répond à l'une des conditions suivantes :</p>

<ul>
  <li>il est appelé en tant que script externe (à partir d'une autre page) ;</li>

  <li>il déclare un tableau contenant plus de 50 éléments ;</li>

  <li>il définit une entité nommée (fonction ou méthode) qui appelle autre chose
qu'une primitive ;</li>

  <li>il définit une entité nommée comprenant plus de trois éléments de
construction conditionnels et une construction en boucle ;</li>

  <li>le code n'appartenant pas aux définitions nommées appelle autre chose que
des primitives et des fonctions définies plus haut dans la page ;</li>

  <li>le code n'appartenant pas aux définitions nommées comprend, au total, plus
de trois éléments de construction conditionnels et une construction en
boucle ;</li>

  <li>il fait appel à <b>eval</b> ;</li>

  <li>il fait des requêtes Ajax ;</li>

  <li>Pour accéder de manière dynamique aux propriétés des objets, il utilise une
notation crochet qui ressemble à <b><em>objet</em>[<em>propriété</em>]</b>.</li>

  <li>il modifie le <abbr title="Document Object Model">DOM</abbr> ;</li>
  
  <li>il utilise des constructions dynamiques JavaScript qui sont difficiles à
analyser sans interpréter le programme, ou bien il est chargé en même temps
que des scripts qui utilisent de telles constructions ; cela concerne plus
précisément l'utilisation avec certaines méthodes (<b>Obj.write</b>,
<b>Obj.createElement</b>, etc.) de tout élément de construction autre qu'une
chaîne de caractères constante.</li>
</ul>

<p>Comment savoir si du code JavaScript est libre ? Dans un <a
href="/licenses/javascript-labels.html">autre article</a>, nous proposons
une méthode qui permet à un programme JavaScript non trivial inclus dans une
page web d'indiquer l'URL de son code source, ainsi que sa licence, en
utilisant des commentaires stylisés.</p>

<p>Enfin, nous devons modifier les navigateurs pour qu'ils détectent et
bloquent le JavaScript non trivial et non libre dans les pages web. Le
programme <a href="/software/librejs/">LibreJS</a> [en] détecte le
JavaScript non libre et non trivial dans les pages que vous visitez, et le
bloque. LibreJS est intégré à IceCat et peut être ajouté à Firefox en tant
que module complémentaire.</p>

<p>Les utilisateurs de navigateurs ont aussi besoin d'une fonctionnalité facile
d'emploi, indiquant le code JavaScript à <em>substituer</em> au JavaScript
d'une page donnée (le code spécifié pourrait être un remplacement total, ou
une version modifiée du programme JavaScript libre de cette
page). Greasemonkey arrive presque à le faire, mais pas tout à fait, car il
ne garantit pas de modifier le code JavaScript d'une page avant que le
programme ne commence à s'exécuter. On peut utiliser un proxy local, mais
c'est trop malcommode actuellement pour constituer une réelle solution. Nous
avons besoin de construire une solution fiable et pratique, ainsi que des
sites pour partager les modifications. Le projet GNU voudrait recommander
les sites dédiés exclusivement aux modifications libres.</p>

<p>Ces fonctionnalités rendront possible pour un programme JavaScript inclus
dans une page web d'être réellement libre. JavaScript ne sera plus un
obstacle particulier à notre liberté – pas plus que C et Java ne le sont
maintenant. Nous serons en mesure de rejeter et même de remplacer les
programmes JavaScript non triviaux et non libres, tout comme nous avons
rejeté et remplacé les paquets non libres pour les installations
classiques. Notre campagne pour libérer le code JavaScript des sites web
pourra alors commencer.</p>

<p>Entre-temps, il existe un cas où il est acceptable d'exécuter un programme
JavaScript non libre : l'envoi d'une réclamation aux opérateurs du site web
leur demandant de libérer le code JavaScript de leur site, ou bien de
l'éliminer. N'hésitez pas à activer JavaScript temporairement pour faire ça
– mais n'oubliez pas de le désactiver après coup.</p>

<!-- any links that used to point to the appendices should point to
     free-your-javascript.html instead.  -->
<blockquote>
<p>À l'attention des webmestres : il y a <a
href="/software/librejs/free-your-javascript.html">plusieurs moyens</a>
d'indiquer la licence des programmes JavaScript présents sur un site web.</p>
</blockquote>

<p><strong>Remerciements:</strong> Je remercie <a
href="/people/people.html#mattlee">Matt Lee</a> et <a
href="http://ejohn.org">John Resig</a> pour leur aide dans la définition de
notre proposition de critère, et David Parunakian pour avoir porté ce
problème à mon attention.</p>

<div class="translators-notes">

<!--TRANSLATORS: Use space (SPC) as msgstr if you don't have notes.-->
<hr /><b>Notes de traduction</b> <ol>
<li id="TransNote1"><a href="#TransNote1-rev"
class="nounderline">&#8593;</a> également appelés « logiciels
propriétaires ».<br/><br/></li>
</ol></div>
</div>

<!-- for id="content", starts in the include above -->
<!--#include virtual="/server/footer.fr.html" -->
<div id="footer">
<div class="unprintable">

<p>Veuillez envoyer les requêtes concernant la FSF et GNU à <a
href="mailto:gnu@gnu.org">&lt;gnu@gnu.org&gt;</a>. Il existe aussi <a
href="/contact/">d'autres moyens de contacter</a> la FSF. Les liens
orphelins et autres corrections ou suggestions peuvent être signalés à <a
href="mailto:webmasters@gnu.org">&lt;webmasters@gnu.org&gt;</a>.</p>

<p>
<!-- TRANSLATORS: Ignore the original text in this paragraph,
        replace it with the translation of these two:

        We work hard and do our best to provide accurate, good quality
        translations.  However, we are not exempt from imperfection.
        Please send your comments and general suggestions in this regard
        to <a href="mailto:web-translators@gnu.org">

        &lt;web-translators@gnu.org&gt;</a>.</p>

        <p>For information on coordinating and submitting translations of
        our web pages, see <a
        href="/server/standards/README.translations.html">Translations
        README</a>. -->
Nous faisons le maximum pour proposer des traductions fidèles et de bonne
qualité, mais nous ne sommes pas parfaits. Merci d'adresser vos commentaires
sur cette page, ainsi que vos suggestions d'ordre général sur les
traductions, à <a href="mailto:web-translators@gnu.org">
&lt;web-translators@gnu.org&gt;</a>.</p>
<p>Pour tout renseignement sur la coordination et la soumission des
traductions de nos pages web, reportez-vous au <a
href="/server/standards/README.translations.html">guide de traduction</a>.</p>
</div>

<!-- Regarding copyright, in general, standalone pages (as opposed to
     files generated as part of manuals) on the GNU web server should
     be under CC BY-ND 4.0.  Please do NOT change or remove this
     without talking with the webmasters or licensing team first.
     Please make sure the copyright date is consistent with the
     document.  For web pages, it is ok to list just the latest year the
     document was modified, or published.
     
     If you wish to list earlier years, that is ok too.
     Either "2001, 2002, 2003" or "2001-2003" are ok for specifying
     years, as long as each year in the range is in fact a copyrightable
     year, i.e., a year in which the document was published (including
     being publicly visible on the web or in a revision control system).
     
     There is more detail about copyright years in the GNU Maintainers
     Information document, www.gnu.org/prep/maintain. -->
<p>Copyright &copy; 2009-2013, 2016, 2017, 2018, 2019 Richard Stallman</p>

<p>Cette page peut être utilisée suivant les conditions de la licence <a
rel="license"
href="http://creativecommons.org/licenses/by-nd/4.0/deed.fr">Creative
Commons attribution, pas de modification, 4.0 internationale (CC BY-ND
4.0)</a>.</p>

<!--#include virtual="/server/bottom-notes.fr.html" -->
<div class="translators-credits">

<!--TRANSLATORS: Use space (SPC) as msgstr if you don't want credits.-->
Traduction : Cédric Corazza.<br /> Révision : <a
href="mailto:trad-gnu&#64;april.org">trad-gnu&#64;april.org</a></div>

<p class="unprintable"><!-- timestamp start -->
Dernière mise à jour :

$Date: 2019/12/30 12:08:30 $

<!-- timestamp end -->
</p>
</div>
</div>
<!-- for class="inner", starts in the banner include -->
</body>
</html>