Comment masquer (protéger) JavaScript? [fermé]

714

Je veux créer une application JavaScript qui n'est pas open source, et donc je souhaite apprendre à masquer mon code JS? Est-ce possible?

Teifion
la source
15
Je serais intéressé d'entendre la raison pour laquelle vous essayez de brouiller le code, cela pourrait donner un contexte nécessaire pour donner une réponse utile.
JohnFx
45
La seule façon de vraiment garder quelque chose de secret est de ne pas l'envoyer au client . S'ils ne l'ont pas, ils ne peuvent pas le lire. L'envoyer crypté demande simplement des ennuis aux quelques personnes qui s'en soucient réellement, et tout le monde ne cherchera pas même si vous l'envoyez en clair (cf. DRM).
Donal Fellows
8
Brouiller votre code n'est pas une bonne idée. Cela ne gênera que les utilisateurs légitimes (par exemple, lorsqu'ils ont besoin de corriger un bogue) et ne fera rien pour le «protéger» des personnes qui ont une incitation (financière) à le rétroconcevoir. Il est fondamentalement impossible d'empêcher la rétro-ingénierie du code Javascript.
Sven Slootweg
14
L'argument de ne pas obscurcir me semble erroné. À moins que vous ne pensiez vraiment que vos utilisateurs pourraient corriger / signaler des bogues, vous devriez le faire. Il peut réduire les temps de chargement en minimisant. Cela n'arrêtera jamais un pirate vraiment dévoué, mais cela le ralentira et cela arrêtera les tentatives de piratage à moitié interrompues. C'est très facile à faire et il existe de nombreux outils (voir les autres réponses), je dirais certainement le faire car il n'y a que des avantages la plupart du temps, mais ne vous attendez pas à ce qu'il apporte une réelle sécurité ou empêche quelqu'un de copier votre code s'ils le veulent vraiment. La seule façon de le faire est de conserver le côté serveur de code et d'utiliser ajax.
Benjamin

Réponses:

405

Obfuscation:

Essayez YUI Compressor . C'est un outil très populaire, construit, amélioré et maintenu par l'équipe Yahoo UI.

Vous pouvez également utiliser:

MISE À JOUR: Cette question a été posée à l'origine il y a plus de 10 ans et YUI n'est plus maintenue. Google Closure Compiler est toujours en cours d'utilisation et UglifyJS peut être exécuté localement via le gestionnaire de packages de nœuds:npm install -g uglify-js

Données de chaîne privées:

Garder les valeurs de chaîne privées est une préoccupation différente, et l'obscurcissement ne sera pas vraiment très utile. Bien sûr, en regroupant votre source dans un désordre brouillé et minifié, vous avez une version légère de la sécurité à travers l' obscurité . La plupart du temps, c'est votre utilisateur qui visualise la source, et les valeurs de chaîne sur le client sont destinées à leur utilisation, de sorte que ce type de valeur de chaîne privée n'est pas souvent nécessaire.

Si vous aviez vraiment une valeur que vous ne vouliez jamais qu'un utilisateur voit, vous auriez deux options. Tout d'abord, vous pouvez effectuer une sorte de cryptage, qui est décrypté au chargement de la page. Ce serait probablement l'une des options les plus sûres, mais aussi beaucoup de travail qui peut être inutile. Vous pourriez probablement coder en base64 certaines valeurs de chaîne, et ce serait plus facile .. mais quelqu'un qui voulait vraiment ces valeurs de chaîne pourrait facilement les décoder . Le chiffrement est le seul moyen d'empêcher vraiment quiconque d'accéder à vos données, et la plupart des gens trouvent que c'est plus de sécurité qu'ils n'en ont besoin.

Sidenote:

L'obfuscation en Javascript est connue pour provoquer des bugs. Les obscurcisseurs s'améliorent un peu, mais de nombreuses tenues décident qu'elles voient suffisamment d'avantages de la minification et du gzipping , et les économies supplémentaires de l'obscurcissement ne valent pas toujours la peine . Si vous essayez de protéger votre source, vous déciderez peut-être que cela en vaut la peine, juste pour rendre votre code plus difficile à lire. JSMin est une bonne alternative.

keparo
la source
32
Je veux ajouter que faire un encodage base64 ne sera d'aucun avantage pour la sécurité, car c'est une procédure trivialement réversible. Même le chiffrement ne sera d'aucune utilité s'il est déchiffré côté client. La seule façon d'assurer la sécurité d'une chaîne est de faire en sorte que le client ne voie que la chaîne chiffrée, et elle est transmise à
Claudiu
16
le serveur pour un traitement ultérieur.
Claudiu
9
Pour info, le compresseur YUI en ligne peut être trouvé ici: refresh-sf.com/yui
mtness
7
Le cryptage des valeurs de chaîne ne sera que légèrement plus avantageux que le codage en base64, si elles doivent être décryptées par le navigateur pour les utiliser. La raison en est que vous devrez également fournir au navigateur la clé de cryptage, et tout ce que le navigateur peut faire, l'utilisateur peut le faire également.
Ben
9
Lorsque je fais ma minification avec YUI Compressor, je m'assure qu'il utilise des méthodes de minification "sûres", c'est-à-dire qu'il garde les points-virgules --preserve-semi. La réécriture des variables privées dans a, b, c, etc. est généralement sûre. Une autre chose que je fais, c'est que le minifieur mette un saut de ligne après chaque point-virgule dans le code --line-break 0. Ensuite, en production, s'il y a des erreurs, j'ai moins une ligne de référence valide pour travailler et je peux trouver ce code dans ma copie de développement. Sinon, vous vous retrouvez avec une erreur sur une énorme ligne de code et vous ne savez pas où est l'erreur.
zuallauz
136

Je suis surpris que personne n'ait mentionné le compilateur de fermeture de Google . Il ne se contente pas de réduire / compresser, il analyse pour trouver et supprimer le code inutilisé et réécrit pour une minimisation maximale. Il peut également effectuer une vérification de type et vous avertira des erreurs de syntaxe.

JQuery est récemment passé de YUI Compresser à Closure Compiler et a constaté une " solide amélioration "

Jason Hall
la source
60
oui, mais récemment, ils ont quitté le compilateur Closure et utilisent maintenant UglifyJS. Le code JQuery était buggé après la compression avec le compilateur de fermeture
Chielus
Je voudrais noter que, si vous travaillez avec angulaire. cet outil ne fonctionnera pas vraiment à cause de l'injection de dépendances et du changement de nom des arguments, sauf s'il y a une case à cocher que je ne vois pas.
iConnor
1
Outil utile, mais il ne fait pas d'obscurcissement, c'est probablement pourquoi personne d'autre ne l'a mentionné.
Madbreaks
1
@Madbreaks avec des optimisations avancées ( developers.google.com/closure/compiler/docs/api-tutorial3 ), il réduira le code au point d'obscurcissement. Les variables peuvent être renommées par souci de concision, par exemple.
Jason Hall
Google n'est pas non plus une option pour la sécurité
Fillipo Sniper
121

L'obfuscation ne peut jamais vraiment fonctionner. Pour tous ceux qui veulent vraiment obtenir votre code, c'est juste un ralentisseur. Pire encore, cela empêche vos utilisateurs de corriger les bogues (et de vous renvoyer les correctifs) et rend plus difficile le diagnostic des problèmes sur le terrain. C'est une perte de temps et d'argent.

Parlez à un avocat du droit de la propriété intellectuelle et de vos options juridiques. "Open Source" ne signifie pas "les gens peuvent lire la source". Au lieu de cela, l'Open Source est un modèle de licence particulier accordant la permission d'utiliser et de modifier librement votre code. Si vous n'accordez pas une telle licence, les personnes qui copient votre code sont en violation et (dans la plupart du monde) vous avez des options légales pour les arrêter.

La seule façon de vraiment protéger votre code est de ne pas l'expédier. Déplacez le code important côté serveur et demandez à votre code Javascript public de faire des appels Ajax.

Voir ma réponse complète sur les obfuscateurs ici.

Schwern
la source
14
+1 sur l'avocat, mais cela pourrait ne pas fonctionner dans d'autres pays / juridictions.
jmort253
16
Les avocats créent probablement plus de coûts / problèmes que le code perdu, réfléchissent très attentivement et organisent beaucoup d'argent pour engager des avocats !!
andora
11
-1: Je pense que trouver un avocat qui comprend JavaScript serait difficile ... Sans parler des honoraires et du temps nécessaire pour trouver des "contrevenants". Quelqu'un peut-il vraiment violer une licence enfouie dans les fichiers HTML / JavaScript s'il n'a jamais rien signé? +1 pour les appels AJAX.
Alerty
12
@Alerty 1) Les licences sont fondamentalement d' accorder l' utilisation de matériel protégé. Vous avez peu le droit de l'utiliser sans la licence. Vous n'avez pas besoin de le signer pour obtenir les droits. Une licence est différente d'un contrat. 2a) Puisque la question concerne les personnes qui copient et utilisent le HTML / Javascript sans permission, la licence n'est pas "enterrée", elle est juste là sur la chose prise. 2b) Vous avez peu de droit d'utiliser le matériel protégé par les droits d'auteur de quelqu'un d'autre sans licence. 3) L'avocat n'a pas besoin de comprendre Javascript, juste le droit de la propriété intellectuelle.
Schwern
4
@Alerty Ne soyez pas obtus. Il s'agit de punir ceux qui copient le fichier pour une utilisation sur leur propre site sans autorisation. Vous parlez d'un contrat et non d'une licence. Les contrats nécessitent un consentement mutuel et sont un compromis. Les licences vous accordent le droit d'utiliser la propriété intellectuelle. Les licences sont à sens unique (le propriétaire vous accorde des choses), vous n'êtes pas obligé de signer parce que vous ne donnez rien. De nombreux "accords de licence de logiciel" sont en fait des contrats, car ils vont au-delà de l'octroi de licences sur la propriété et se transforment en des choses parfois ridicules comme le droit de poursuivre.
Schwern
49

Vous pouvez obscurcir la source javascript tout ce que vous voulez, mais elle sera toujours rétroconcevable simplement en exigeant que tout le code source s'exécute réellement sur la machine cliente ... la meilleure option à laquelle je peux penser est d'avoir tout votre traitement fait avec du code côté serveur, et tout le code client javascript fait est d'envoyer des demandes de traitement au serveur lui-même. Sinon, n'importe qui pourra toujours garder une trace de toutes les opérations effectuées par le code.

Quelqu'un a mentionné base64 pour protéger les chaînes. C'est une terrible idée. Base64 est immédiatement reconnaissable par les types de personnes qui voudraient effectuer une rétro-ingénierie de votre code. La première chose qu'ils feront, c'est de le décoder et de voir ce que c'est.

Claudiu
la source
45
Où que j'aille, la réponse la plus courante à "comment masquer mon Javascript?" est "vous ne devriez pas vous en soucier parce que quelqu'un pourrait le désobscurcir." Ce n'est pas vraiment une réponse.
Travis Wilson
2
@Vivek: Un peu en retard, mais ce que je voulais vraiment dire c'est "code côté serveur". Il est possible d'exécuter javascript non pas dans un navigateur, uniquement sur un serveur, mais je ne sais pas à quel point c'est courant.
Claudiu
8
@Travis: Je n'ai pas dit "vous ne devriez pas vous en soucier". Je viens de dire que si vous voulez un programme de source fermée, vous ne voudrez pas l'écrire en javascript côté client, car tout brouillage que vous faites ne l'empêchera pas d'être (assez facilement) rétro-conçu.
Claudiu
8
Droite. Ce qui ne répond en rien "comment masquer mon JavaScript". L'obfuscation n'est pas un concept abstrait, c'est un concept technique. L'op a simplement demandé "comment?"
Madbreaks
2
@Madbreaks: La question était dans le contexte de ne pas rendre son code open source. La réponse technique immédiate est la réponse acceptée, mais la meilleure réponse en contexte (comme dans ce que vous essayez vraiment de faire?) Est, IMO, que vous ne pouvez pas avoir de javascript côté client qui n'est pas open-source, car tout le monde a la source, quelle que soit la façon dont vous l'obscurcissez. Quoi qu'il en soit, les deux réponses sont ici et les gens peuvent lire et bénéficier des deux.
Claudiu
45

Il existe un certain nombre d'outils d'obfuscation JavaScript qui sont disponibles gratuitement; Cependant, je pense qu'il est important de noter qu'il est difficile d'obscurcir JavaScript au point qu'il ne peut pas être rétroconçu.

À cette fin, il y a plusieurs options que j'ai utilisées dans une certaine mesure au fil du temps:

  • Compresseur YUI . Le compresseur JavaScript de Yahoo! Fait un bon travail de condensation du code qui améliorera son temps de chargement. Il y a un petit niveau d'obscurcissement qui fonctionne relativement bien. Essentiellement, Compressor changera les noms des fonctions, supprimera les espaces blancs et modifiera les variables locales. C'est ce que j'utilise le plus souvent. Il s'agit d'un outil open source basé sur Java.

  • JSMin est un outil écrit par Douglas Crockford qui cherche à minimiser votre source JavaScript. Selon les propres mots de Crockford, "JSMin n'obscurcit pas, mais il uglifie." Son objectif principal est de réduire la taille de votre source pour un chargement plus rapide dans les navigateurs.

  • Obfuscateur JavaScript gratuit . Il s'agit d'un outil Web qui tente de brouiller votre code en le codant. Je pense que les compromis de sa forme d'encodage (ou d'obscurcissement) pourraient se faire au détriment de la taille du fichier; cependant, c'est une question de préférence personnelle.

À M
la source
19
Étant donné que le code Javascript doit s'exécuter sur la machine du client, il n'est pas seulement difficile à brouiller au point que le code ne peut pas être inversé, mais impossible .
Schwern
20
c'est une question de statistiques. quel est le seuil auquel quelqu'un va avoir accès à votre code avec ou sans obscurcissement? ils peuvent toujours y avoir accès, mais plus le seuil est élevé, moins il y a de monde. moins les gens connaissent quelque chose, plus ce quelque chose est sûr. pratique standard de classification de sécurité.
Cris Stringfellow
1
La recherche / remplacement @PeterR dans un éditeur de texte va vous rendre la vie encore plus difficile en essayant de le lire ou de le désosser. ce n'est pas parfait, mais ajoute une couche supplémentaire de gêne / difficulté en supprimant les indices de contexte. la plupart des programmeurs ne sont pas aussi intelligents que vous, ce qui en fait un élément si dissuasif.
SED
1
@SED Je ne connais pas un seul programmeur qui n'a pas pu trouver / remplacer un tas de [ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY]vars au moins [var1, var2,..]en une seule minute. Je peux littéralement désuglifier, ré-indenter et rechercher / remplacer les noms var en deux minutes. Et non, je suis plus intelligent qu'un développeur Jr. moyen. Le fait est qu'il n'y a AUCUN moyen d'obscurcir JS côté client. Vous pouvez vous acheter 5 minutes, MAX, mais cela ne sert à rien. Ce truc est vraiment juste pour vendre quelqu'un qui ne connaît pas le code sur la "sécurité" ajoutée. Personne qui n'a jamais écrit une ligne de JS n'achèterait cette merde.
Peter R
3
@PeterR "Je peux littéralement désuglifier, ré-indenter et rechercher / remplacer les noms de var en deux minutes" - bien sûr, allez-y et essayez cela sur un paquet de base de code de 20 Mo minimisé, obscurci et multi-passes avec une structure qui prend semaines pour comprendre même avec le code source original et commenté. Et pour le rendre encore plus difficile, il existe des outils d'obscurcissement qui cassent délibérément votre code si l'indentation, les lignes, etc.
John Weisz
23

Ce que je ferais:

A. Troll le pirate!

Ce sera dans la deuxième partie mon LAUNCHER de code javascript secret faux / obscurci. Celui que vous voyez dans le code source.

Qu'est-ce que ce code?

  1. charge le vrai code
  2. définit un en-tête personnalisé
  3. publie une variable personnalisée

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. Occultation un peu le code

Qu'est-ce que c'est?

  1. c'est le même code que ci-dessus en base64
  2. ce n'est pas le code javascript SECRET

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

C Créez un fichier php difficile à afficher avec le vrai code à l'intérieur

Qu'est-ce que ce code php?

  1. Vérifie le bon référent (domaine / dir / code de votre lanceur)
  2. Vérifie l'en-tête personnalisé
  3. Vérifie la variable POST personnalisée

Si tout va bien, il vous montrera le bon code, sinon un faux code ou interdisez l'ip, fermez la page .. peu importe.

<?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=';
};
?>

référent base64 = http://here.is/my/launcher.html

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

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

Maintenant .. si vous définissez des gestionnaires d'événements dans le javascript SECRET, il est probablement accessible .. vous devez les définir à l'extérieur avec le code de lancement et en pointant sur une fonction SECRET imbriquée.

SO ... existe-t-il un moyen facile d'obtenir le code? document.body.appendChild(document.createElement('div')).innerText='Awesome';

Je ne sais pas si cela fonctionne, mais j'utilise Chrome et j'ai vérifié Elements, Resources, Network, Sources, Timeline, Profiles, Audits mais je n'ai pas trouvé la ligne ci-dessus.

note1: si vous ouvrez l'url Troll.php de l'élément Inspect-> réseau en chrome, vous obtenez le faux code.

note2: tout le code est écrit pour les navigateurs modernes. polyfill a besoin de beaucoup plus de code.

ÉDITER

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
la source
1
oh et oui je brouillerais aussi le code javascript.
cocco
1
C'est quelque chose à quoi je pensais juste, à la traîne du cracker. J'aimerais voir quelque chose comme ça sans avoir à utiliser PHP :)
pgarciacamou
6
Même si c'est drôle, un développeur web qui est capable d'inspecter correctement le site, peut en quelque sorte obtenir le code source. Je pense vraiment qu'il n'y a aucun moyen de cacher tout type de données au moment où vous les mettez en ligne.
cocco
Ce n'est pas une sorte d'obscurcissement, je pense. sait cependant ouvrir la console, il pourrait aussi connaître l'encodage / décodage base64, très simple.
T.Todua
19

Essayez JScrambler . Je lui ai donné un tour récemment et en ai été impressionné. Il fournit un ensemble de modèles d'obscurcissement avec des paramètres prédéfinis pour ceux qui ne se soucient pas beaucoup des détails et veulent simplement le faire rapidement. Vous pouvez également créer un obscurcissement personnalisé en choisissant les transformations / techniques que vous souhaitez.

Anthony
la source
7
L'abonnement JScrambler est très très cher ... L'abonnement le moins cher nécessite un prix minimum de 3 mois 145 $ - c'est fou.
barbushin
1
Ils ont maintenant un plan gratuit. Les autres plans d'abonnement sont toujours aussi chers.
user7610
2
Le plan gratuit comprend uniquement l'optimisation et la minification.
Jean Hominal
1
«Le plan gratuit comprend l'optimisation et la minification», oui non. L'obscurcissement et l'optimisation ne vont pas de pair, désolé.
NiCk Newman
2
En regardant le site Web de JScrambler aujourd'hui et plus encore les plans de tarification, je ne vois pas d'option gratuite. Seul un essai gratuit ..
KDT
18

Le problème avec les langages interprétés, c'est que vous envoyez la source pour les faire fonctionner (sauf si vous avez un compilateur pour bytecode, mais là encore, il est assez trivial de décompiler).

Donc, si vous ne voulez pas sacrifier les performances, vous ne pouvez agir que sur les noms de variables et de fonctions, par exemple. les remplacer par a, b ... aa, ab ... ou a101, a102, etc. Et, bien sûr, supprimez autant d'espace / de nouvelles lignes que possible (c'est ce que font les soi-disant compresseurs JS).
L'obscurcissement des chaînes aura un impact sur les performances, si vous devez les crypter et les décrypter en temps réel. De plus, un débogueur JS peut afficher les valeurs finales ...

PhiLho
la source
17

Contrairement à la plupart des autres réponses que je suggère contre YUI Compressor; vous devez utiliser Google Closure .

Pas grand-chose car il compresse plus, mais surtout parce qu'il interceptera les erreurs javascript telles que a = [1,2,3,];IE se détraquer.

Thomas Bonini
la source
5
la vérification de votre code contre les erreurs et l'incompatibilité ne doit-elle pas être effectuée de toute façon avant de brouiller ?? n'a rien à voir avec le
brouillage en
13

Une application non open-source basée sur Javascript est assez idiote. Javascript est un langage interprété côté client. L'obscurcissement n'est pas beaucoup de protection ..

L'obfuscation JS est généralement effectuée pour réduire la taille du script, plutôt que de le "protéger". Si vous êtes dans une situation où vous ne voulez pas que votre code soit public, Javascript n'est pas la bonne langue.

Il y a beaucoup d'outils autour, mais la plupart ont le mot "compresseur" (ou "minificateur") dans son nom pour une raison.

dbr
la source
11

Vous ne pouvez pas sécuriser le code côté client: appuyez simplement sur F12 sur Google Chrome, mettez en pause l'exécution de javascript et vous obtiendrez toutes les chaînes, même celles cryptées. Embellissez- le et renommez les variables et vous obtiendrez presque le code d'origine.

Si vous écrivez du côté serveur, javascript (c'est-à-dire NodeJS) a peur que quelqu'un pirate votre serveur et veuille rendre le pirate plus difficile, vous donnant plus de temps pour récupérer votre accès, alors utilisez les compilateurs javacript :

Vous devez utiliser Closure Compiler sur Advanced Compilation, car c'est le seul outil qui renomme toutes vos variables, même si elles sont utilisées dans plusieurs fichiers / modules. Mais cela a juste un problème: cela ne fonctionne que si vous écrivez dans son style de codage .

Gustavo Rodrigues
la source
La compilation de fermeture n'est pas un code obscurcissant: P
NiCk Newman
1
Il n'est pas fait pour cela, mais fonctionne bien: il n'ajoute pas de code supplémentaire comme certains compilateurs (qui peuvent généralement être inversés que les outils que j'ai cités) mais le modifie de manière inhabituelle, certains même difficiles à annuler et à supprimer les éléments inutilisés code, qui, par rapport à une obfuscation réelle, est bon pour les performances.
Gustavo Rodrigues
1
Pas une bonne idée. La réduction / compilation du code côté serveur peut introduire des problèmes de sécurité si le minifieur a un bogue: zyan.scripts.mit.edu/blog/backdooring-js
mgol
Le bogue que vous avez cité ne s'applique qu'à UglifyJS: il ne s'applique pas à Closure Compiler.
Gustavo Rodrigues
Pour tous ceux qui se soucient de la minification des fichiers javascript, il existe également un décompacteur javascript. donc je ne pense pas que ce soit une couche de sécurité
Fillipo Sniper
11

Je peux recommander JavaScript Utility par Patrick J. O'Neil. Il peut obscurcir / compacter et compresser et il semble être assez bon dans ces domaines. Cela dit, je n'ai jamais essayé de l'intégrer dans un script de construction d'aucune sorte.

Quant à obscurcir vs minifier - je ne suis pas un grand fan de l'ancien. Cela rend le débogage impossible (erreur à la ligne 1 ... "attendez, il n'y a qu'une seule ligne") et ils prennent toujours du temps à déballer. Mais si vous en avez besoin ... eh bien.

Tsvetomir Tsonev
la source
1
Mais l'obscurcissement ne le comprime pas nécessairement en une seule ligne, cela peut être aussi simple que de changer les noms de fonction et de variable ou de convertir des chaînes en base64. La réduction met tout le code sur une seule ligne.
rw-nandemo
De nos jours, UglifyJS semble être le meilleur choix. L'auteur est un gars cool aussi! :)
Tsvetomir Tsonev
En ce qui concerne le débogage, vous pouvez principalement générer des sourcemaps que vous pouvez inclure lors des tests afin de voir sur quelle ligne une erreur s'est produite, même si elle est minifiée.
Luca Steeb
5

Je suggérerais d'abord de minifier avec quelque chose comme YUI Compressor, puis de convertir toutes les chaînes et les nombres en valeurs HEX en utilisant quelque chose comme http://www.javascriptobfuscator.com/

Avec cela, le code serait rendu presque impossible à comprendre et je pense qu'à ce stade, il faudra plus de temps à un pirate pour reconstituer votre code qu'en réalité s'il a réécrit à partir de zéro. La réécriture et le clonage sont ce que vous ne pouvez pas réellement arrêter. Après tout, nous sommes des gens libres!

Dynamite Blitzer
la source
5

Packer de Dean Edward est un excellent obfuscateur, bien qu'il obscurcisse principalement le code, pas les éléments de chaîne que vous pourriez avoir dans votre code.

Voir: Outil de compression Javascript en ligne et sélectionnez Packer (Dean Edwards) dans la liste déroulante

smdrager
la source
C'est inutile. Il peut être décompressé facilement avec jsbeautifier.org
Maciej Krawczyk
4

J'ai l'impression que certaines entreprises (par exemple: JackBe) mettent du code JavaScript crypté dans des fichiers * .gif, plutôt que des fichiers JS, comme mesure supplémentaire d'obscurcissement.

xgMz
la source
4

Essayez cet outil Javascript Obfuscator

Je l'ai utilisé sur mon jeu HTML5 non seulement il a réduit sa taille de 950 Ko à 150, mais il a également rendu le code source illisible, les compilateurs de fermeture et les minificateurs sont réversibles. Personnellement, je ne sais pas comment inverser cette occultation.

Jerczu
la source
4

J'utilise Jasob depuis des années et c'est de loin le meilleur obfuscateur du marché.
Il a une interface utilisateur avancée mais reste intuitif et facile à utiliser.
Il gérera également les fichiers HTML et CSS.

La meilleure façon de l'utiliser est de préfixer toutes vos variables privées avec quelque chose comme un trait de soulignement, puis d'utiliser la sortfonctionnalité pour les regrouper toutes et les cocher en tant que cibles d'obscurcissement.

Les utilisateurs peuvent toujours afficher votre source, mais il est beaucoup plus difficile de déchiffrer lorsque vos variables privées sont converties de quelque chose comme _sUserPreferredNickNamevers a.

Le moteur comptabilisera automatiquement le nombre de variables ciblées et les hiérarchisera pour obtenir la compression maximale.

Je ne travaille pas pour Jasob et je ne tire aucun avantage de leur promotion, juste pour offrir quelques conseils amicaux.
L'inconvénient est qu'il n'est pas gratuit et qu'il est un peu cher, mais qu'il vaut quand même la peine d'être comparé à des alternatives - les options «gratuites» ne se rapprochent même pas.

Mat
la source
Jason semble être plus un minificateur qu'un obfuscateur. Suis-je en train de manquer quelque chose?
Alan McBee - MSFT
4

Avez-vous essayé Bananascript ? Il produit du code hautement compressé et complètement illisible.

niutech
la source
18
il compresse bien le code, mais changez simplement le eval()dans la dernière ligne console.log()et votre console crachera le tout
LobsterMan
4

J'utilise l'utilitaire Closure-Compiler pour l'obscurcissement du script java. Il minimise le code et offre plus d'options pour l'obscurcissement. Cet utilitaire est disponible sur le code Google à l'URL ci-dessous:
Outils de fermeture

Mais depuis quelques jours, j'entends beaucoup parler d'UglifyJS. Vous pouvez trouver diverses comparaisons entre Closure Compiler et UglifyJS dans lesquelles Uglify semble être un gagnant.
UglifyJS: un nouveau compresseur JavaScript rapide pour Node.js qui est à égalité avec la fermeture

Je donnerais bientôt la chance à UglifyJS.

shaILU
la source
3

En tant qu'obfuscateur / compresseur JavaScript / HTML / CSS, vous pouvez également essayer Patu Digua .

Adrian
la source
3

Celui-ci minimise mais n'obscurcit pas. Si vous ne souhaitez pas utiliser Java en ligne de commande, vous pouvez coller votre javascript dans un formulaire Web.

Chris S
la source
1
Remarque: le lien est maintenant mort.
Scott C Wilson
1
@ScottWilson merci, mis à jour
Chris S
2

Vous devriez certainement envisager de jeter un œil à Obfuscriptor .

Je vais au-delà des astuces de minification Javascript typiques que nous avons vues avec d'autres outils tels que YUI Compressor ou Google Closure .

Le code obscurci ressemble plus à crypté. Contrairement à tout ce que j'ai vu auparavant.

Mike
la source
Merci pour le lien! Je viens d'essayer l'obfuscriptor et le code crypté en effet (sans clé ???). Et compressé mon script de 211 à 36 Ko!
Notez qu'Obfuscriptor vous avertit qu'il ne fonctionne pas avec IE. C'est une rupture pour certains.
Alan McBee - MSFT
1
Le lien sur la réponse ne pointe plus vers l'outil. Je n'ai pas pu trouver d'autre référence en direct.
buzoherbert
le premier lien est mort. "Obfuscriptor"
Alp Altunel
2

Si vous utilisez une bibliothèque JavaScript, pensez à Dojo Toolkit qui est compatible (après des modifications mineures) avec la compilation en mode avancé du Closure Compiler.

Dojo - La seule bibliothèque JavaScript compatible avec le compilateur de fermeture

Le code compilé avec le mode Closure Advanced est presque impossible à rétroconcevoir, même en passant par un embellisseur, car la base de code entière (y compris la bibliothèque) est obscurcie. Il est également 25% petit en moyenne.

Le code JavaScript qui est simplement minifié (YUI Compressor, Uglify, etc.) est facile à rétroconcevoir après avoir traversé un embellisseur.

Stephen Chung
la source