summaryrefslogtreecommitdiff
path: root/talermerchantdemos/blog/articles/br/javascript-trap.html
blob: 4d44c19b3e37c832744ac3a17856035b7fe086cc (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
343
<!--#set var="ENGLISH_PAGE" value="/philosophy/javascript-trap.en.html" -->

<!--#include virtual="/server/header.pt-br.html" -->
<!-- Parent-Version: 1.96 -->
<!-- This page is derived from /server/standards/boilerplate.html -->
<!--#set var="TAGS" value="essays licensing traps" -->
<!--#set var="DISABLE_TOP_ADDENDUM" value="yes" -->

<!-- This file is automatically generated by GNUnited Nations! -->
<title>A Armadilha do JavaScript - Projeto GNU - Free Software Foundation</title>

<!--#include virtual="/philosophy/po/javascript-trap.translist" -->
<!--#include virtual="/server/banner.pt-br.html" -->
<!--#include virtual="/philosophy/ph-breadcrumb.pt-br.html" -->
<!--GNUN: OUT-OF-DATE NOTICE-->
<!--#include virtual="/server/top-addendum.pt-br.html" -->
<div class="article reduced-width">
<h2>A Armadilha do JavaScript</h2>

<address class="byline">por <a href="https://www.stallman.org/">Richard Stallman</a></address>

<p><strong>Você pode estar executando programas não livres em seu computador
todo dia sem perceber &ndash; por meio de seu navegador web.</strong></p>

<!-- any links that used to point to the appendices should point to
     free-your-javascript.html instead.  -->
<div class="announcement">
<hr class="no-display" />
<p>Webmasters: há <a href="/software/librejs/free-your-javascript.html">várias
formas</a> de indicar a licença de programas JavaScript em um site.</p>
<hr class="no-display" />
</div>

<p>Na comunidade de software livre, a ideia de que <a
href="/philosophy/free-software-even-more-important.html"> qualquer programa
não livre maltrata seus usuários</a> é familiar. Alguns de nós defendem
nossa liberdade rejeitando todos os softwares privativos em seus
computadores. Muitos outros reconhecem a falta de liberdade como uma afronta
ao programa.</p>

<p>Muitos usuários estão cientes de que essa questão se aplica aos plug-ins que
navegadores oferecem para instalar, já que eles podem ser livres ou não
livres. Mas os navegadores executam outros programas não livres sem pedir
autorização e sem avisar &ndash; programas contidos ou vinculados em páginas
web. Esses programas são muito frequentemente escritos em JavaScript, porém
outras linguagens também são usadas.</p>

<p>JavaScript (oficialmente chamado de ECMAScript, mas poucos usam este nome)
foi, certa vez, usado para pequenas decorações estéticas em páginas web, tal
como recursos de exibição e navegação fofas, mas não essenciais. Era
aceitável considerá-los como meras extensões de marcação HTML, em vez de
verdadeiros softwares, e em desconsideração da questão.</p>

<p>Alguns sites ainda usam JavaScript desta forma, mas muitos o usam para
programas maiores que fazem trabalhos maiores. Por exemplo, Google Docs
tenta baixar para sua máquina um programa JavaScript no tamanho de meio
megabyte, em uma forma compacta que poderíamos chamar de “Obfuscript”. Essa
forma compactada é feita a partir do código-fonte, excluindo os espaços
extras que tornam o código legível e as observações explicativas que o
tornam compreensível e substituindo cada nome significativo no código por um
nome arbitrário abreviado, para que não seja possível dizer qual é seu
suposto significado.</p>

<p>Parte do <a href="/philosophy/free-sw.html">significado do software
livre</a> é que os usuários têm acesso ao código-fonte do programa (seu
plano). O código-fonte de um programa significa a forma preferida para os
programadores modificarem &ndash; incluindo espaçamento útil, observações
explicativas e nomes significativos. Código compactado é um substituto falso
e inútil do código-fonte; o código-fonte real desses programas não está
disponível para os usuários, portanto os usuários não podem entendê-lo;
portanto, os programas são não livres.</p>

<p>Além de ser não livre, muitos desses programas são <em>malwares</em> porque
eles <a
href="https://github.com/w3c/fingerprinting-guidance/issues/8">bisbilhotam o
usuário</a>. Ainda mais desagradável, alguns sites usam serviços que
registram <a
href="https://freedom-to-tinker.com/2017/11/15/no-boundaries-exfiltration-of-personal-data-by-session-replay-scripts/">todas
as ações do usuário enquanto olha para a página</a>. Os serviços
supostamente “redigem” os registros para excluir alguns dados confidenciais
que o site não deve obter. Mas mesmo que isso funcione de forma confiável,
todo o propósito desses serviços é fornecer ao site dados pessoais (de
outras pessoas) que ele não deveria obter.</p>

<p>Navegadores normalmente não lhe informam quando eles carregaram programas
JavaScript. Alguns navegadores apresentam uma forma de desligar
completamente o JavaScript, mas mesmo se eles estiverem cientes desta
questão, você ainda teria um problema considerável para identificar
programas não livres e não triviais para, então, bloqueá-los. Porém, mesmo
na comunidade de software livre, a maioria dos usuários não estão cientes
desta questão, o silêncio dos navegadores tende a ocultar isso.</p>

<p>Para ser claro, a linguagem JavaScript não é inerentemente melhor ou pior
para a liberdade dos usuários do que qualquer outra linguagem. É possível
lançar um programa JavaScript como software livre, por meio da distribuição
do código-fonte sob uma licença de software livre. Se o programa é
independente &ndash; se sua funcionalidade e propósito são independentes da
página na qual ele veio &ndash; não há problema; você pode copiá-lo para um
arquivo em sua máquina, modificá-lo e visitar aquele arquivo com um
navegador para executá-lo. É ainda possível empacotá-lo para instalação como
outros programas livres e invocá-lo com um comando shell. Esses programas
não apresentam nenhum problema moral especial diferente daqueles dos
programas C.</p>

<p>O problema da armadilha do JavaScript se aplica quando o programa JavaScript
vem junto com uma página web que os usuários visitam. Esses programas
JavaScript são escritos para funcionar com uma página ou site específico, e
a página ou site depende deles para funcionar.</p>

<p>Digamos que você copie e modifique o código JavaScript da página. Então, um
outro problema surge: mesmo se o fonte do programa estiver disponível,
navegadores não oferecem uma forma de executar sua versão modificada em vez
do original ao visitar aquela página ou aquele site. O efeito é comparável à
tivoização, apesar de, em princípio, não ser tão difícil de superar.</p>

<p>JavaScript não é a única linguagem que sites web usam para programas
enviados pelo usuários. O Flash oferece suporte a programação por meio de
uma variante estendida do JavaScript, mas esta é uma coisa do
passado. Silverlight da Microsoft parece criar um problema similar ao do
Flash, só que pior, já que a Microsoft o usa como uma plataforma para codecs
não livres. Um substituto livre para o Silverlight não faz o trabalho
adequadamente para o mundo livre a menos que venha codecs livres em
substituição.</p>

<p>Os applets do Java também são executados no navegador, e trazem questões
similares. Em geral, qualquer forma de sistema de applets representa esse
tipo de problema. Tendo um ambiente de execução livre para um applet só nos
traz o suficiente para encontrar o problema.</p>

<p>Teoricamente, é possível programar em HTML e CSS, mas, na prática, essa
capacidade é limitada e inconveniente; para que seja possível que o programa
faça alguma coisa, é necessário um <cite>hack</cite> impressionante. Tais
programas devem ser livres, mas CSS não é um problema sério para a liberdade
dos usuários em 2019.</p>

<p>Um movimento forte desenvolveu aquelas chamadas (“calls”) para sites web
para se comunicar apenas por meio de formatos e protocolos que são livres
(alguns dizem “abertos”); isto é, cuja documentação está publicada e a qual
qualquer um é livre para implementar. Porém, a presença de programas
JavaScript nas páginas web tornam aquele critério ineficiente. A linguagem
do JavaScript em si, como um formato, é livre, e o uso de JavaScript em um
site web não necessariamente é ruim. Porém, como já vimos acima, pode ser
ruim &ndash; se o programa JavaScript for não livre. Quando o site transmite
um programa para o usuário, não basta o programa estar escrito em uma
linguagem documentada e desembaraçada; aquele programa também deve ser
livre. “Transmita apenas programas livres para os usuários” deve se tornar
parte do critério site web ético.</p>

<p>Carregar e executar silenciosamente programas não livres é uma dentre várias
questões levantadas por “aplicações web”. O termo “aplicações web” foi
atribuído em total desprezo à distinção fundamental entre software entregue
a usuários e software sendo executado em um servidor. Ele pode se referir a
um programa especializado para cliente ser executado em um navegador; ele
pode se referir a um software especializado para servidor; ele pode se
referir a um programa especializado para cliente que funciona de mãos dadas
com software especializado para servidor. Os lados de cliente e servidor
levantam questões éticas diferentes, mesmo se eles estiverem estritamente
integrados que eles indiscutivelmente formam partes de um único
programa. Esse artigo tem como escopo apenas a questão do software do
cliente. Nós vamos tratar da questão do servidor separadamente.</p>

<p>Em termos práticos, como nós podemos lidar com o problema de programas
JavaScript não livres e não triviais em sites? O primeiro passo é evitar
executá-lo.</p>

<p>O que nós queremos dizer por “não triviais”? É uma questão de grau, então
essa é uma questão de projetar um critério simples que fornece bons
resultados, em vez de encontrar a resposta correta.</p>
<p>
Nosso critério atual é considerar um programa JavaScript como não trivial se
qualquer uma dessas condições for atendida:</p>

<ul>
  <li>ele é referido como um script externo (de outra página).</li>

  <li>ele declara um vetor com mais de 50 elementos.</li>

  <li>ele define uma entidade dada (função ou método) que chama qualquer outra que
não seja a primitiva.</li>

  <li>ele define uma dada entidade com mais de três construtos condicionais e
construção de loop.</li>

  <li>um código fora das definições dadas chama qualquer coisa, exceto primitivas
e funções definidas anteriormente na página.</li>

  <li>um código fora das definições dadas contém mais de três construtos
condicionais e construção de loop, no total.</li>

  <li>ele chama <b>eval</b>.</li>

  <li>ele faz chamadas Ajax.</li>

  <li>ele usa a notação de colchetes para o acesso à propriedade de objeto
dinâmico, que se parece com <b><em>objeto</em>[<em>propriedade</em>]</b>.</li>

  <li>ele altera o DOM.</li>
  
  <li>ele usa construtos JavaScript dinâmicos que são difíceis de analisar sem
interpretar o programa, ou é carregado junto com scripts que usam tais
construtos. Especificamente, usando quaisquer outros construtos que não uma
string literal com determinados métodos (<b>Obj.write</b>,
<b>Obj.createElement</b> e outros).</li>
</ul>

<p>Como nós dizemos se o código JavaScript é livre? Em um <a
href="/licenses/javascript-labels.html">artigo separado</a>, propomos um
método por meio da qual um programa JavaScript não trivial em uma página
pode indicar a URL na qual seu código-fonte está localizado, e pode indicar
sua licença também, usando comentários estilizados.</p>

<p>Finalmente, precisamos mudar navegadores livres para detectar e bloquear
JavaScript não livres e não triviais em páginas web. O programa <a
href="/software/librejs/">LibreJS</a> detecta JavaScript não trivial e não
livre em páginas que você visita, e os bloqueia. LibreJS está incluso no
IceCat e disponível como uma extensão para Firefox.</p>

<p>Usuários do navegador também precisam de uma facilidade conveniente para
especificar um código JavaScript para usar <em>em vez</em> do JavaScript em
uma certa página. (O código especificado pode ser um substituto total, ou
uma versão modificada do programa JavaScript livre naquela página.)
Greasemonkey chega perto de ser capaz de fazer isso, mas não muito, já que
ele não garante modificar o código JavaScript em uma página antes daquele
programa iniciar a execução. Usar um proxy local funciona, mas é, agora,
inconveniente demais para ser uma solução real. Precisamos construir uma
solução que é confiável e conveniente, assim como um site para compartilhar
as alterações. O Projeto GNU gostaria de recomendar os sites que são
dedicados unicamente às alterações livres.</p>

<p>Esses recursos possibilitarão para um programa JavaScript incluído em uma
página web ser livre em um senso real e prático. JavaScript não será mais um
obstáculo em especial para nossa liberdade &ndash; não mais que C e Java são
agora. Seremos capazes de rejeitar e até substituir os programas JavaScript
não triviais e não livres, assim como rejeitamos e substituímos pacotes não
livres que são oferecidos para instalação na forma comum. Nossa campanha
para sites tornarem livres os seus JavaScript pode, então, começar.</p>

<p>Neste meio tempo, há um caso no qual é aceitável executar um programa
JavaScript não livre: para enviar uma reclamação para os operadores do site
dizendo que eles devem tornar livre ou remover o código JavaScript do
site. Por favor, não hesite em habilitar temporariamente JavaScript para
fazer isso &ndash; mas lembre-se de desabilitá-lo novamente em seguida.</p>

<!-- any links that used to point to the appendices should point to
     free-your-javascript.html instead.  -->
<div class="announcement">
<hr class="no-display" />
<p>Webmasters: há <a href="/software/librejs/free-your-javascript.html">várias
formas</a> de indicar a licença de programas JavaScript em um site.</p>
<hr class="no-display" />
</div>

<p><strong>Agradecimentos:</strong> Obrigado a <a
href="/people/people.html#mattlee">Matt Lee</a> e <a
href="https://ejohn.org">John Resig</a> por ajudarem na definição de nosso
critério proposto e a David Parunakian por trazer o programa à minha
atenção.</p>
</div>

<div class="translators-notes">

<!--TRANSLATORS: Use space (SPC) as msgstr if you don't have notes.-->
 </div>
</div>

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

<p>Envie perguntas em geral sobre a FSF e o GNU para <a
href="mailto:gnu@gnu.org">&lt;gnu@gnu.org&gt;</a>. Também existem <a
href="/contact/">outros meios de contatar</a> a FSF. Links quebrados e
outras correções ou sugestões podem ser enviadas para <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 contributing translations of
        our web pages, see <a
        href="/server/standards/README.translations.html">Translations
        README</a>. -->
A equipe de traduções para o português brasileiro se esforça para oferecer
traduções precisas e de boa qualidade, mas não estamos isentos de erros. Por
favor, envie seus comentários e sugestões em geral sobre as traduções para
<a
href="mailto:web-translators@gnu.org">&lt;web-translators@gnu.org&gt;</a>.
</p><p>Consulte o <a href="/server/standards/README.translations.html">Guia
para as traduções</a> para mais informações sobre a coordenação e a
contribuição com traduções das páginas deste site.</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-2019, 2021 Richard Stallman</p>

<p>Esta página está licenciada sob uma licença <a rel="license"
href="http://creativecommons.org/licenses/by-nd/4.0/deed.pt_BR">Creative
Commons Atribuição-SemDerivações 4.0 Internacional</a>.</p>

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

<!--TRANSLATORS: Use space (SPC) as msgstr if you don't want credits.-->
Traduzido por: Rafael Fontenelle
<a href="mailto:rafaelff@gnome.org">&lt;rafaelff@gnome.org&gt;</a>,
2017-2021</div>

<p class="unprintable"><!-- timestamp start -->
Última atualização:

$Date: 2021/12/26 01:29:59 $

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