Como ofuscar (proteger) o JavaScript? [fechadas]

714

Quero criar um aplicativo JavaScript que não seja de código aberto e, portanto, desejo aprender como ofuscar meu código JS? Isso é possível?

Teifion
fonte
15
Gostaria de saber o motivo pelo qual você está tentando ofuscar o código; ele pode fornecer o contexto necessário para fornecer uma resposta útil.
JohnFx
45
A única maneira de realmente manter algo em segredo é não enviá-lo ao cliente . Se eles não têm, eles não podem ler. Enviá-lo criptografado está apenas pedindo problemas nas mãos de poucas pessoas que realmente se importam, e todo mundo não fica bisbilhotando, mesmo que você o envie de maneira clara (cf DRM).
Donal Fellows
8
Ofuscar seu código não é uma boa ideia. Isso incomodará apenas usuários legítimos (por exemplo, quando eles precisam corrigir um bug) e não faz nada para "protegê-lo" de pessoas que têm um incentivo (financeiro) para fazer engenharia reversa. É fundamentalmente impossível impedir a engenharia reversa do código Javascript.
Sven Slootweg 29/03
14
O argumento de não ofuscar parece falho para mim. A menos que você realmente pense que seus usuários possam corrigir / relatar bugs, você deve fazê-lo. Pode diminuir o tempo de carregamento diminuindo. Ele nunca irá parar um hacker realmente dedicado, mas o tornará lento e interromperá as tentativas de invasão pela metade. É muito fácil de fazer e existem muitas ferramentas (veja outras respostas), eu diria que certamente o faz, pois existem apenas vantagens na maioria das vezes, mas não espere que traga segurança real ou impeça alguém de copiar seu código se eles realmente querem. A única maneira de fazer isso é manter o lado do servidor de código e usar o ajax.
Benjamin

Respostas:

405

Ofuscação:

Experimente o Compressor YUI . É uma ferramenta muito popular, criada, aprimorada e mantida pela equipe de interface do usuário do Yahoo.

Você também pode usar:

ATUALIZAÇÃO: Esta pergunta foi feita originalmente há mais de 10 anos e a YUI não é mais mantida. O Google Closure Compiler ainda está em uso e o UglifyJS pode ser executado localmente através do gerenciador de pacotes do nó:npm install -g uglify-js

Dados da sequência privada:

Manter os valores das strings em sigilo é uma preocupação diferente, e a ofuscação não trará muitos benefícios. Obviamente, ao empacotar sua fonte em uma bagunça distorcida e minificada, você tem uma versão leve da segurança através da obscuridade . Na maioria das vezes, é o usuário que está visualizando a fonte, e os valores da cadeia de caracteres no cliente destinam-se a seu uso, de modo que esse tipo de valor de cadeia particular nem sempre é necessário.

Se você realmente tivesse um valor que nunca desejaria que um usuário visse, teria algumas opções. Primeiro, você pode fazer algum tipo de criptografia, que é descriptografada no carregamento da página. Essa provavelmente seria uma das opções mais seguras, mas também muito trabalho que pode ser desnecessário. Você provavelmente poderia codificar em base64 alguns valores de string, e isso seria mais fácil .. mas alguém que realmente queria esses valores de string poderia decodificá-los facilmente . A criptografia é a única maneira de impedir verdadeiramente alguém de acessar seus dados, e a maioria das pessoas acha que é mais segurança do que precisa.

Nota:

Sabe-se que a ofuscação em Javascript causa alguns erros. Os obfuscators estão ficando um pouco melhor sobre isso, mas muitos equipamentos decidir que eles vêem benefício suficiente de minifying e gzipping , e as economias adicionais de ofuscação nem sempre vale a pena . Se você está tentando proteger sua fonte, talvez decida que vale a pena, apenas para tornar seu código mais difícil de ler. JSMin é uma boa alternativa.

keparo
fonte
32
Quero acrescentar que fazer uma codificação base64 não trará benefícios à segurança, pois é um procedimento trivialmente reversível. Mesmo criptografar não ajudará se for descriptografado no lado do cliente. A única maneira de garantir a segurança de uma string é ter o cliente vê apenas a string encriptada, e isso é passado para
Claudiu
16
o servidor para processamento adicional.
Claudiu
9
FYI, compressor YUI on-line pode ser encontrada aqui: refresh-sf.com/yui
mtness
7
Criptografar os valores das cadeias de caracteres terá apenas um benefício marginalmente maior que a base64 que os codifica, se eles tiverem que ser descriptografados pelo navegador para usá-los. O motivo é que você também precisará fornecer a chave de criptografia ao navegador, e qualquer coisa que o navegador possa fazer o usuário também.
Ben
9
Ao fazer a minificação com o Compressor YUI, certifique-se de que ele use métodos de minificação "seguros", ou seja, mantenha os pontos e vírgulas --preserve-semi. Reescrever as variáveis ​​privadas para a, b, c etc geralmente é seguro. Outra coisa que faço é fazer com que o minificador coloque uma quebra de linha após cada ponto e vírgula no código --line-break 0. Em seguida, na produção, se houver erro, tenho pelo menos uma linha de referência válida para trabalhar e posso encontrar esse código na minha cópia de desenvolvimento. Caso contrário, você acaba com um erro em uma enorme linha de código e não faz ideia de onde está o erro.
Zuallauz
136

Estou surpreso que ninguém tenha mencionado o Closure Compiler do Google . Ele não apenas minimiza / compacta, mas analisa para encontrar e remover código não utilizado e reescreve para obter a máxima minimização. Ele também pode fazer a verificação de tipo e avisa sobre erros de sintaxe.

O JQuery mudou recentemente do YUI Compresser para o Closure Compiler e viu uma " melhoria sólida "

Jason Hall
fonte
60
sim, mas recentemente eles deixaram o compilador Closure e estão usando o UglifyJS agora. O código JQuery foi Buggy após compressão com fecho compilador
Chielus
Gostaria de observar que, se você está trabalhando com angular. essa ferramenta não funcionará realmente devido à injeção de dependência e à renomeação de argumentos, a menos que haja uma caixa de seleção que não consiga ver.
IConnor
1
Ferramenta útil, mas não ofusca, e é provavelmente por isso que ninguém mais o mencionou.
Madbreaks
1
@Madbreaks com otimizações avançadas ( developers.google.com/closure/compiler/docs/api-tutorial3 ), ele reduzirá o código ao ponto de ofuscação. As variáveis ​​podem ser renomeadas por questões de brevidade, por exemplo.
Jason Hall
O Google também não é uma opção de segurança
Fillipo Sniper
121

Ofuscação nunca pode realmente funcionar. Para quem realmente deseja obter o seu código, é apenas um lance de velocidade. Pior ainda, impede os usuários de corrigir bugs (e enviar as correções de volta para você) e dificulta o diagnóstico de problemas em campo. É um desperdício de seu tempo e dinheiro.

Converse com um advogado sobre leis de propriedade intelectual e quais são suas opções legais. "Código aberto" não significa "as pessoas podem ler o código". Em vez disso, o Open Source é um modelo de licenciamento específico que concede permissão para usar e modificar livremente seu código. Se você não conceder essa licença, as pessoas que copiam seu código violam e (na maior parte do mundo) você tem opções legais para detê-los.

A única maneira de realmente proteger seu código é não enviá-lo. Mova o código importante do lado do servidor e faça com que seu código Javascript público faça o Ajax chamar.

Veja minha resposta completa sobre ofuscadores aqui.

Schwern
fonte
14
+1 no advogado, mas isso pode não funcionar em outros países / jurisdições.
jmort253
16
Os advogados provavelmente criam mais custos / problemas do que o código perdido, pensam com muito cuidado e arranjam muito dinheiro para contratar advogados !!
andora
11
-1: Acredito que seria difícil encontrar um advogado que entenda JavaScript ... Sem mencionar as taxas e o tempo necessário para encontrar "violadores". Alguém pode realmente estar violando uma licença que está oculta nos arquivos HTML / JavaScript se ele nunca assinou nada? +1 para as chamadas AJAX.
Alerty
12
@Alerty 1) As licenças são basicamente sobre a concessão de uso de material protegido por direitos autorais. Você tem pouco direito de usá-lo sem a licença. Você não precisa assiná-lo para obter os direitos. Uma licença é diferente de um contrato. 2a) Como a pergunta é sobre as pessoas copiando e usando o HTML / Javascript sem permissão, a licença não está "oculta", ela está lá na coisa que está sendo tirada. 2b) Você tem pouco direito de usar o material protegido por direitos autorais de outra pessoa sem uma licença. 3) O advogado não precisa entender o Javascript, apenas a lei de propriedade intelectual.
Schwern 31/10/11
4
@ Alerty Não seja obtuso. Trata-se de punir aqueles que copiam o arquivo para uso em seu próprio site sem permissão. O que você está falando é de um contrato, não de uma licença. Os contratos requerem consentimento mútuo e são um dar e receber. As licenças concedem o direito de usar propriedade intelectual. As licenças são de uma maneira (o proprietário está concedendo coisas a você), você não é obrigado a assinar porque não está entregando nada. Muitos "Contratos de Licença de Software" são na verdade contratos porque vão além do licenciamento da propriedade e, por vezes, são ridículos como o direito de processar.
Schwern 2/11/11
49

Você pode ofuscar a fonte de javascript tudo o que quiser, mas ela sempre terá engenharia reversa apenas por exigir que todo o código-fonte seja realmente executado na máquina cliente ... a melhor opção que posso pensar é fazer todo o processamento com código do lado do servidor, e todo o código do cliente que o javascript faz é enviar solicitações de processamento para o próprio servidor. Caso contrário, qualquer pessoa sempre poderá acompanhar todas as operações que o código está executando.

Alguém mencionou base64 para manter as cordas seguras. Esta é uma péssima ideia. O Base64 é imediatamente reconhecível pelo tipo de pessoa que deseja fazer engenharia reversa do seu código. A primeira coisa que eles farão é descriptografar e ver o que é.

Claudiu
fonte
45
Onde quer que eu vá, a resposta mais comum para "como posso ofuscar meu Javascript?" é "você não deve se preocupar com isso porque alguém pode ocultá-lo". Esta não é realmente uma resposta.
31430 Travis Wilson
2
@Vivek: Um pouco tarde, mas o que eu realmente quis dizer é "código do lado do servidor". É possível executar o javascript não em um navegador, apenas em um servidor, mas não sei como isso é comum.
Claudiu
8
@ Travis: Eu não disse "você não deve se preocupar com isso". Acabei de dizer que, se você deseja um programa de código fechado, não vai querer escrevê-lo em javascript do lado do cliente, porque qualquer ofuscamento que você fizer não impedirá que seja (com bastante facilidade) engenharia reversa.
Claudiu
8
Direita. O que de forma alguma responde "como posso ofuscar meu JavaScript". Ofuscação não é um conceito abstrato, é técnico. O op simplesmente perguntou "como?"
Madbreaks
2
@ Madbreaks: A questão estava no contexto de não tornar seu código de código aberto. A resposta técnica imediata é a aceita, mas a melhor resposta contextual (como, o que você realmente está tentando fazer?) É IMO, que você não pode ter javascript do lado do cliente que não seja de código aberto, porque todo mundo tem a fonte, independentemente de como você a ofusca. De qualquer maneira, ambas as respostas estão aqui e as pessoas podem ler e se beneficiar de ambas.
Claudiu
45

Existem várias ferramentas de ofuscação de JavaScript disponíveis gratuitamente; no entanto, acho importante observar que é difícil ofuscar o JavaScript ao ponto em que não pode ser feito com engenharia reversa.

Para esse fim, existem várias opções que usei em algum grau de horas extras:

  • Compressor YUI . O compressor JavaScript do Yahoo! Faz um bom trabalho ao condensar o código que melhorará seu tempo de carregamento. Há um pequeno nível de ofuscação que funciona relativamente bem. Essencialmente, o Compressor altera os nomes das funções, remove os espaços em branco e modifica as variáveis ​​locais. É isso que eu uso com mais frequência. Esta é uma ferramenta baseada em Java de código aberto.

  • JSMin é uma ferramenta escrita por Douglas Crockford que busca minificar sua fonte de JavaScript. Nas próprias palavras de Crockford, "o JSMin não ofusca, mas se agrava". Seu principal objetivo é reduzir o tamanho da sua fonte para carregamento mais rápido nos navegadores.

  • Obfuscator JavaScript grátis . Essa é uma ferramenta baseada na Web que tenta ofuscar seu código, na verdade, codificando-o. Eu acho que as compensações de sua forma de codificação (ou ofuscação) podem custar o tamanho do arquivo; no entanto, isso é uma questão de preferência pessoal.

Tom
fonte
19
Como o código Javascript deve ser executado na máquina do cliente, não é apenas difícil ofuscar até o ponto em que o código não pode ter engenharia reversa, mas é impossível .
Schwern 25/10/08
20
é sobre estatísticas. qual é o limite em que alguém terá acesso ao seu código com ofuscação e sem? eles ainda podem obter acesso, mas quanto maior o limite, menor o número de pessoas. quanto menos pessoas souberem de alguma coisa, mais seguro ela será. prática padrão de classificação de segurança.
22612 Cris Stringfellow
1
A pesquisa / substituição do @PeterR em um editor de texto tornará sua vida muito mais difícil ao tentar lê-lo ou fazer engenharia reversa. não é perfeito, mas adiciona uma camada extra de aborrecimento / dificuldade ao remover dicas de contexto. a maioria dos programadores não é tão inteligente quanto você, e é isso que faz com que isso seja um grande impedimento.
SED
1
@ SED Não conheço um único programador que não possa encontrar / substituir um monte de [ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY]vars em pelo menos [var1, var2,..]dentro de um minuto. Eu posso literalmente desglomerar, re-indentar e pesquisar / substituir nomes de var dentro de dois minutos. E não, sou mais esperto do que um Jr. Dev comum. O simples fato é que não há como ocultar o JS do lado do cliente. Você pode comprar 5 minutos, MAX, mas isso não serve para nada. Esse material é realmente apenas para vender alguém que não conhece o código na "Segurança" adicionada. Ninguém que já escreveu uma linha de JS compraria essa porcaria.
Peter R
3
@PeterR "Posso literalmente desglutificar, re-indentar e pesquisar / substituir nomes de var dentro de dois minutos" - com certeza, vá em frente e tente isso em um pacote de base de código minificado, ofuscado e ofuscado de 20 MB com uma estrutura que exige semanas para entender mesmo com o código-fonte original comentado. E para tornar ainda mais difícil, existem ferramentas de ofuscação que deliberadamente quebram o código se o recuo, as linhas etc. mudarem.
John Weisz
23

O que eu faria:

A. Troll o hacker!

Esta será a segunda parte do meu código javascript secreto falso / ofuscado LAUNCHER. O que você vê no código fonte.

O que esse código?

  1. carrega o código real
  2. define um cabeçalho personalizado
  3. publica uma variável personalizada

var ajax=function(a,b,d,c,e,f){
 e=new FormData();
 for(f in d){e.append(f,d[f]);};
 c=new XMLHttpRequest();
 c.open('POST',a);
 c.setRequestHeader("Troll1","lol");
 c.onload=b;
 c.send(e);
};
window.onload=function(){
 ajax('Troll.php',function(){
  (new Function(atob(this.response)))()
 },{'Troll2':'lol'});
}

B. Ofusque o código um pouco

O que é isso?

  1. é o mesmo código acima em base64
  2. este não é o código javascript SECRETO

(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()

C Crie um arquivo php difícil de exibir com o código real dentro

O que esse código php?

  1. Verifica o referenciador correto (domínio / diretório / código do seu iniciador)
  2. Verifica o HEADER personalizado
  3. Verifica a variável POST personalizada

Se tudo estiver ok, ele mostrará o código certo, ou um código falso ou ban ban, feche a página.

<?php
$t1=apache_request_headers();
if(base64_encode($_SERVER['HTTP_REFERER'])=='aHR0cDovL2hlcmUuaXMvbXkvbGF1bmNoZXIuaHRtbA=='&&$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){
 echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';//here is the SECRET javascript code
}else{
 echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';
};
?>

referenciador base64 = http://here.is/my/launcher.html

SECRET javascript = document.body.appendChild(document.createElement('div')).innerText='Awesome';

FAKE = window.open('', '_self', '');window.close();

Agora .. se você definir manipuladores de eventos no javascript SECRET, provavelmente estará acessível .. precisará defini-los fora com o código de inicialização e apontando para uma função SECRET aninhada.

SO ... existe uma maneira fácil de obter o código? document.body.appendChild(document.createElement('div')).innerText='Awesome';

Não tenho certeza se isso funciona, mas estou usando o chrome e verifiquei Elementos, Recursos, Rede, Fontes, Linha do tempo, Perfis, Auditorias, mas não encontrei a linha acima.

note1: se você abrir o URL Troll.php em Inspecionar elemento-> rede no chrome, você obterá o código falso.

note2: todo o código foi escrito para navegadores modernos. O polyfill precisa de muito mais código.

EDITAR

launcher.html

<!doctype html><html><head><meta charset="utf-8"><title></title><script src="data:application/javascript;base64,KG5ldyBGdW5jdGlvbihhdG9iKCdkbUZ5SUdGcVlYZzlablZ1WTNScGIyNG9ZU3hpTEdRc1l5eGxMR1lwZTJVOWJtVjNJRVp2Y20xRVlYUmhLQ2s3Wm05eUtHWWdhVzRnWkNsN1pTNWhjSEJsYm1Rb1ppeGtXMlpkS1R0OU8yTTlibVYzSUZoTlRFaDBkSEJTWlhGMVpYTjBLQ2s3WXk1dmNHVnVLQ2RRVDFOVUp5eGhLVHRqTG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSWxSeWIyeHNNU0lzSW14dmJDSXBPMk11YjI1c2IyRmtQV0k3WXk1elpXNWtLR1VwTzMwN2QybHVaRzkzTG05dWJHOWhaRDFtZFc1amRHbHZiaWdwZTJGcVlYZ29KMVJ5YjJ4c0xuQm9jQ2NzWm5WdVkzUnBiMjRvS1hzZ0tHNWxkeUJHZFc1amRHbHZiaWhoZEc5aUtIUm9hWE11Y21WemNHOXVjMlVwS1Nrb0tYMHNleWRVY205c2JESW5PaWRzYjJ3bmZTazdmUT09JykpKSgp"></script></head><body></body></html>

Troll.php

<?php $t1=apache_request_headers();if(/*base64_encode($_SERVER['HTTP_REFERER'])=='PUT THE LAUNCHER REFERER HERE'&&*/$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';}else{echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';}; ?>
cocco
fonte
1
ah e sim, eu também ofuscaria o código javascript.
Cocco
1
Isso é algo em que eu estava pensando, vasculhando o biscoito. Gostaria de ver algo como isto sem ter que usar PHP :)
pgarciacamou
6
Mesmo que isso seja engraçado, um desenvolvedor da Web capaz de inspecionar adequadamente o site pode, de alguma forma, obter o código fonte. Realmente acho que não há como ocultar nenhum tipo de dados no momento em que você os coloca online.
Cocco
Não é nenhum tipo de ofuscação, eu acho. No entanto, sabe como abrir o console, ele também pode saber sobre codificação / decodificação base64, muito simples.
T.Todua
19

Tente JScrambler . Eu dei uma volta recentemente e fiquei impressionado com isso. Ele fornece um conjunto de modelos para ofuscação com configurações predefinidas para aqueles que não se importam muito com os detalhes e só querem fazê-lo rapidamente. Você também pode criar ofuscação personalizada escolhendo as transformações / técnicas desejadas.

Anthony
fonte
7
A assinatura JScrambler é muito muito cara ... A assinatura mais barata requer um preço mínimo de 3 meses $ 145 - é uma loucura.
barbushin
1
Eles agora têm um plano gratuito. Os outros planos de assinatura ainda são muito caros.
User7610
2
O plano gratuito inclui apenas otimização e minificação.
Jean hominal
1
'O plano gratuito inclui otimização e minificação', sim não. Ocultação e otimização não andam juntas, desculpe.
NiCk Newman
2
Hoje, olhando o site da JScrambler e mais planos de preços, não vejo uma opção gratuita. Apenas um teste gratuito ..
KDT 30/01
18

O problema com as linguagens interpretadas é que você envia a fonte para fazê-las funcionar (a menos que você tenha um compilador para o bytecode, mas, novamente, é bastante trivial descompilar).

Portanto, se você não quer sacrificar o desempenho, você só pode atuar em nomes de variáveis ​​e funções, por exemplo. substituindo-os por a, b ... aa, ab ... ou a101, a102, etc. E, é claro, remova o máximo de espaço / novas linhas possível (é o que os chamados compressores JS fazem).
Seqüências ofuscantes terão um impacto no desempenho, se você precisar criptografá-las e descriptografá-las em tempo real. Além disso, um depurador JS pode mostrar os valores finais ...

PhiLho
fonte
17

Ao contrário da maioria das outras respostas que sugiro contra o YUI Compressor; você deve usar o Google Closure .

Não muito porque comprime mais, mas principalmente porque ele captura erros de javascript, como o a = [1,2,3,];que faz o IE dar errado.

Thomas Bonini
fonte
5
não deve verificar seu código contra erros e incompatibilidade de qualquer maneira antes de ofuscar? não tem nada a ver com ofuscar realmente
phil294
13

Um aplicativo baseado em Javascript não de código aberto é bastante tolo. Javascript é uma linguagem interpretada do lado do cliente. Ocultação não é muita proteção.

A ofuscação de JS geralmente é feita para reduzir o tamanho do script, em vez de "protegê-lo". Se você estiver em uma situação em que não deseja que seu código seja público, o Javascript não é o idioma certo.

Existem muitas ferramentas disponíveis, mas a maioria tem a palavra "compressor" (ou "minificador") em seu nome por um motivo.

dbr
fonte
11

Você não pode proteger o código do lado do cliente: basta pressionar F12 no Google Chrome, pausar a execução do javascript e você obterá todas as strings, mesmo as criptografadas. Embeleze -o e renomeie as variáveis e você obterá quase o código original.

Se você estiver escrevendo javascript no servidor (ou seja, NodeJS), tem medo de alguém invadir seu servidor e deseja dificultar o trabalho do hacker, oferecendo mais tempo para recuperar o acesso e use os compiladores javacript :

Você precisa usar o Closure Compiler na compilação avançada, pois é a única ferramenta que renomeia todas as suas variáveis, mesmo que sejam usadas em vários arquivos / módulos. Mas só tem um problema: só funciona se você escrever no seu estilo de codificação .

Gustavo Rodrigues
fonte
Encerramento compilng não está ofuscando código: P
NiCk Newman
1
Ele não foi feito para isso, mas funciona bem: ele não adiciona código extra como alguns compiladores (que geralmente podem ser revertidos para as ferramentas que eu citei), mas o altera de maneiras incomuns, algumas até difíceis de desfazer e remove não utilizadas código que, em comparação com a ofuscação real, é bom para o desempenho.
Gustavo Rodrigues
1
Não é uma boa ideia. Minifying / compilando server-side código pode pode introduzir problemas de segurança se o minifier tem um bug: zyan.scripts.mit.edu/blog/backdooring-js
mgol
O bug que você citou se aplica apenas ao UglifyJS: não se aplica ao Closure Compiler.
Gustavo Rodrigues
Para todos aqueles que se preocupam com a redução de arquivos javascript, também existe um desminificador de javascript. então eu não acho que seja uma camada de segurança
Fillipo Sniper
11

Eu posso recomendar o JavaScript Utility por Patrick J. O'Neil. Ele pode ofuscar / compactar e compactar e parece ser muito bom nisso. Dito isto, nunca tentei integrá-lo em um script de construção de qualquer tipo.

Quanto à ofuscação x minificação - eu não sou um grande fã da primeira. Isso torna a depuração impossível (erro na linha 1 ... "espere, existe apenas uma linha") e eles sempre levam tempo para descompactar. Mas se você precisar ... bem.

Tsvetomir Tsonev
fonte
1
Mas ofuscar não necessariamente o comprime em uma linha, pode ser tão simples quanto alterar os nomes de funções e variáveis ​​ou converter seqüências de caracteres em base64. Minimizar coloca todo o código em uma linha.
Rw-nandemo
Atualmente, o UglifyJS parece ser a melhor escolha. O autor também é um cara legal! :)
Tsvetomir Tsonev
Em relação à depuração, você pode gerar mapas de origem que podem ser incluídos ao testar para ver em qual linha ocorreu um erro, mesmo que minificado.
Luca Steeb
5

Gostaria de sugerir primeiro minify com algo como YUI Compressor e, em seguida, converter todas as seqüências e números em valores HEX usando algo como http://www.javascriptobfuscator.com/

Com isso, o código ficaria quase impossível de entender e acho que, nesta fase, levará mais tempo para um hacker reencenar seu código do que realmente se ele reescrevesse do zero. Reescrever e Clonar é o que você realmente não pode parar. Afinal, somos pessoas livres!

Dynamite Blitzer
fonte
5

O Dean Edward's Packer é um excelente ofuscador, embora ofusque principalmente o código, não quaisquer elementos de string que você possa ter dentro do seu código.

Consulte: Ferramenta de compactação Javascript on - line e selecione Packer (Dean Edwards) na lista suspensa.

smdrager
fonte
É inútil. Ele pode ser descompactado facilmente com o jsbeautifier.org
Maciej Krawczyk
4

Tenho a impressão de que algumas empresas (por exemplo: JackBe) colocam código JavaScript criptografado em arquivos * .gif, em vez de arquivos JS, como uma medida adicional de ofuscação.

xgMz
fonte
4

Experimente esta ferramenta Javascript Obfuscator

Eu o usei no meu jogo HTML5, não apenas reduziu o tamanho de 950 KB para 150, mas também tornei o código fonte ilegível. Compiladores e minificadores de fechamento são reversíveis. Pessoalmente, não sei como reverter essa ofuscação.

Jerczu
fonte
4

Eu uso Jasob há anos e é sem dúvida o melhor ofuscador por aí.
Ele possui uma interface avançada, mas ainda é intuitivo e fácil de usar.
Ele também manipula arquivos HTML e CSS.

A melhor maneira de usá-lo é prefixar todas as suas variáveis privadas com algo como um sublinhado; depois, use o sortrecurso para agrupá-las e marcá- las como alvos para ofuscação.

Os usuários ainda podem visualizar sua fonte, mas é muito mais difícil decifrar quando suas variáveis ​​privadas são convertidas de algo como _sUserPreferredNickNamepara a.

O mecanismo contabilizará automaticamente o número de variáveis ​​direcionadas e as priorizará para obter a compressão máxima.

Eu não trabalho para Jasob e não ganho nada em promovê-los, apenas oferecendo alguns conselhos amigáveis.
A desvantagem é que não é gratuito e é um pouco caro, mas ainda vale a pena quando comparado a alternativas - as opções 'gratuitas' nem chegam perto.

Matt
fonte
Jason parece ser mais um minifier do que um ofuscador. Estou esquecendo de algo?
Alan McBee - MSFT
4

Você já experimentou o Bananascript ? Produz código altamente compactado e completamente ilegível.

niutech
fonte
18
ele comprime o código muito bem, mas apenas mudar o eval()na última linha para console.log()e seu console vai cuspir fora a coisa toda
Lobsterman
4

Estou usando o utilitário Closure-Compiler para a ofuscação de java-script. Minifica o código e tem mais opções de ofuscação. Este utilitário está disponível no código do Google no URL abaixo:
Ferramentas de fechamento

Mas hoje em dia estou ouvindo muito do UglifyJS. Você pode encontrar várias comparações entre o Closure Compiler e o UglifyJS, nas quais o Uglify parece ser um vencedor.
UglifyJS: um novo e rápido compressor JavaScript para Node.js que está a par do fechamento

Em breve eu daria chance ao UglifyJS.

shaILU
fonte
3

Como ofuscador / compressor JavaScript / HTML / CSS, você também pode experimentar o Patu Digua .

Adrian
fonte
3

Este minimiza, mas não ofusca. Se você não quiser usar o Java da linha de comando, cole seu javascript em um formulário da web.

Chris S
fonte
1
Nota: O link está morto agora.
Scott C Wilson
1
@ScottWilson obrigado, atualizou
Chris S
2

Você definitivamente deve considerar dar uma olhada no Obfuscriptor .

Vou além dos truques típicos de redução de Javascript que vimos em outras ferramentas, como o YUI Compressor ou o Google Closure .

O código ofuscado parece mais com criptografado. Diferente de tudo que eu já vi antes.

Mike
fonte
Obrigado pelo link! Apenas tentei o obfuscriptor e o código criptografado (sem chave ???). E compactou meu script de 211 a 36 Kb!
Observe que o Obfuscriptor alerta você que ele não funciona com o IE. Isso é um rompimento de negócios para alguns.
Alan McBee - MSFT
1
O link na resposta não aponta mais para a ferramenta. Não encontrei outra referência ao vivo.
buzoherbert
o primeiro link está morto. "Obfuscriptor"
Alp Altunel 17/17/17
2

Se você usar uma biblioteca JavaScript, considere o Dojo Toolkit que é compatível (após pequenas modificações) com a compilação do modo Avançado do Closure Compiler.

Dojo - a única biblioteca JavaScript compatível com o compilador de fechamento

O código compilado com o modo Closure Advanced é quase impossível de realizar engenharia reversa, mesmo passando por um embelezador, pois toda a base de código (incluindo a biblioteca) é ofuscada. Também é 25% pequeno, em média.

O código JavaScript que é apenas minificado (YUI Compressor, Uglify etc.) é fácil de fazer engenharia reversa depois de passar por um embelezador.

Stephen Chung
fonte