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

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

<!-- This file is automatically generated by GNUnited Nations! -->
<title>A Armadilha do JavaScript</title>

<!--#include virtual="/philosophy/po/javascript-trap.translist" -->
<!--#include virtual="/server/banner.pt-br.html" -->
<h2>A Armadilha do JavaScript</h2>

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

<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.  -->
<blockquote>
<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>
</blockquote>

<p>Na comunidade de software livre, a ideia de que <a
href="/philosophy/free-software-even-more-important.html"> qualquer
programas não livre maltrata seus usuários</a> é familiar. Alguns de nós
defendem nossa liberdade rejeitando todos os softwares proprietários 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
outros linguagens também são usados.</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 mera 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 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="http://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>É 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. Mas este é um caso incomum.</p>

<p>Geralmente, programas JavaScript são feitos para funcionar com uma página ou
site em particular, e a página ou site depende deles para funcionar. Então,
um outro problema surge: mesmo se o fonte do programa esteja 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; se nós alguma vez tivermos um
reprodutor Flash livre suficientemente completo, ainda teremos que lidar com
a questão de programas Flash não livres. Silverlight parece criar um
problema similar ao 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 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 que 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 tornar 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 programa 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 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 qualquer outra 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.  -->
<blockquote>
<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>
</blockquote>

<p><strong>Agradecimentos:</strong> Obrigado a <a
href="/people/people.html#mattlee">Matt Lee</a> e <a
href="http://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 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">
<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 submitting 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 o envio de
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, 2017, 2018, 2019 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.-->
<b>Tradução:</b> Rafael Fontenelle
<a href="mailto:rafaelff@gnome.org">&lt;rafaelff@gnome.org&gt;</a>,
2017-2019</div>

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

$Date: 2020/05/22 22:05:25 $

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