web-dev-qa-db-fra.com

Comment puis-je masquer (protéger) JavaScript?

Je veux faire une application JavaScript qui n'est pas open source, et donc je veux apprendre comment peut obscurcir mon code JS? Est-ce possible?

695
Teifion

obscurcissement:

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

Vous pouvez également utiliser:

Données de chaîne privées:

Garder les valeurs de chaîne privées est une préoccupation différente, et l'obfuscation ne sera pas vraiment bénéfique. Bien sûr, en empaquetant votre source dans un fouillis brouillé et minifié, vous avez une version allégée de la sécurité à obscurité . La plupart du temps, c'est votre utilisateur qui consulte la source et les valeurs de chaîne sur le client sont destinées à leur utilisation. Ce type de valeur de chaîne privée n'est donc pas souvent nécessaire.

Si vous aviez vraiment une valeur que vous ne souhaitiez jamais voir par un utilisateur, vous auriez plusieurs options. Premièrement, vous pouvez utiliser un type de chiffrement, qui est déchiffré 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 en base64 encoder certaines valeurs de chaîne, ce qui serait plus facile .. mais quelqu'un qui voulait vraiment ces valeurs de chaîne pourrait les décoder facilement . Le cryptage est le seul moyen d'empêcher quiconque d'accéder à vos données, ce que la plupart des gens considèrent comme une sécurité supérieure à leurs besoins.

Note:

Obfuscation en Javascript est connu pour causer des bugs. Les obscurcissements s'améliorent un peu, mais beaucoup de groupes décident qu'ils voient suffisamment d'avantages à réduire () et gzipping , et les économies supplémentaires d’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.

401
keparo

Je suis surpris que personne n'ait mentionné Google Closure Compiler . Il ne se contente pas de minifier/compresser, il analyse pour rechercher et supprimer le code inutilisé, et réécrit pour une minification maximale. Il peut également effectuer une vérification de type et avertit des erreurs de syntaxe.

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

134
Jason Hall

L'obfuscation ne peut jamais vraiment fonctionner. Pour 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.

Discutez avec un avocat du droit de la propriété intellectuelle et de vos options juridiques. "Open Source" ne veut pas dire "les gens peuvent lire la source". Open Source est plutôt un modèle de licence particulier accordant l’autorisation d’utiliser et de modifier librement votre code. Si vous n'accordez pas une telle licence, les personnes qui copient votre code sont en infraction et (dans la plupart des pays du monde), vous disposez d'options juridiques 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 l'appeler en Ajax.

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

113
Schwern

Vous pouvez masquer la source javascript à votre guise, mais il sera toujours possible de procéder à une ingénierie inverse du fait que tout le code source doit être exécuté sur la machine client ... la meilleure option à laquelle je puisse penser est que tous vos traitements soient terminés. avec le code côté serveur et tout le code client javascript, c’est envoyer des demandes de traitement au serveur lui-même. Sinon, tout le monde pourra toujours suivre toutes les opérations effectuées par le code.

Quelqu'un a mentionné base64 pour protéger les chaînes. C'est une idée terrible. Base64 est immédiatement reconnaissable aux types de personnes qui souhaiteraient procéder à l'ingénierie inverse de votre code. La première chose qu'ils vont faire est de le décoder et de voir ce que c'est.

49
Claudiu

Un certain nombre d’outils d’obscurcissement JavaScript sont disponibles gratuitement. Cependant, je pense qu'il est important de noter qu'il est difficile d'obscurcir JavaScript au point qu'il ne puisse pas être inversé.

À cette fin, il y a plusieurs options que j'ai utilisées dans une certaine mesure, les heures supplémentaires:

  • Compresseur YUI . Le compresseur JavaScript de Yahoo! résume bien le code qui améliorera son temps de chargement. Il existe un petit niveau d’obscurcissement qui fonctionne relativement bien. Essentiellement, Compressor modifiera les noms de fonction, supprimera les espaces et modifiera les variables locales. C'est ce que j'utilise le plus souvent. Ceci est un outil Java open source.

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

  • Obfuscateur JavaScript gratuit . Cet outil Web tente de brouiller votre code en l'encodant. Je pense que les inconvénients 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.

45
Tom

Ce que je ferais:

A. Troll le pirate informatique!

Ce sera dans la deuxième partie de mon code JavaScript fictif/obscurci LAUNCHER. 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. Brouiller 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éer un fichier php difficile à afficher avec le code réel à l'intérieur

Qu'est-ce que ce code php?

  1. Vérifie le bon référent (domaine/répertoire/code de votre lanceur)
  2. Vérifications pour le HEADER personnalisé
  3. Vérifie la variable personnalisée POST

Si tout est ok, il vous montrera le bon code, sinon un faux code ou une adresse IP ban, 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 code JavaScript SECRET, il est probablement accessible .. vous devez les définir à l'extérieur avec le code de lancement et pointant vers une fonction SECRET imbriquée.

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

Je ne suis pas sûr que cela fonctionne, mais j'utilise chrome et j'ai coché les éléments, les ressources, le réseau, les sources, la timeline, les profils, les audits, mais je n'ai pas trouvé la ligne ci-dessus.

note1: si vous ouvrez l'URL Troll.php depuis Inspecter élément-> réseau dans chrome, vous obtenez le faux code.

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

MODIFIER

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

Essayez JScrambler . Je l'ai récemment essayé et j'ai été impressionné. Il fournit un ensemble de modèles pour l'obscurcissement avec des paramètres prédéfinis pour ceux qui ne se soucient pas beaucoup des détails et qui veulent juste que tout soit fait rapidement. Vous pouvez également créer un obscurcissement personnalisé en choisissant les transformations/techniques souhaitées.

18
Anthony

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

Pas grand chose parce qu'il compresse davantage, mais surtout parce qu'il va attraper les erreurs javascript telles que a = [1,2,3,]; qui font IE aller de travers.

17
Thomas Bonini

Le problème avec les langages interprétés est que vous envoyez le source pour les faire fonctionner (sauf si vous avez un compilateur à bytecode, mais encore une fois, il est assez simple 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. en les remplaçant 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'obstruction des chaînes aura un impact négatif sur les performances si vous devez les chiffrer et les déchiffrer en temps réel. De plus, un débogueur JS peut afficher les valeurs finales ...

17
PhiLho

Une application basée sur Javascript non-open-source est assez stupide. Javascript est un langage interprété côté client. L'obfuscation n'est pas une grande protection ..

JS obfuscation est généralement fait pour réduire la taille du script, plutôt que de le "protéger". Si vous ne voulez pas que votre code soit public, javascript n'est pas la bonne langue.

Il existe de nombreux outils, mais la plupart ont le mot "compresseur" (ou "minifier") dans son nom pour une raison ..

13
dbr

Je peux recommander JavaScript Utility par Patrick J. O'Neil. Il peut obscurcir/compacter et comprimer et il semble être très bon à ceux-ci. Cela dit, je n’ai jamais essayé de l’intégrer dans un script de compilation de quelque type que ce soit.

En ce qui concerne l'obscurcissement 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 il faut toujours du temps pour décompresser. Mais si vous avez besoin de… bien.

11
Tsvetomir Tsonev

Vous ne pouvez pas sécuriser le code côté client: appuyez simplement sur F12 sur Google Chrome, suspendez l'exécution de javascript et vous obtiendrez toutes les chaînes, même celles cryptées. Beautify il et renommer les variables et vous obtiendrez presque le code original.

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

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

11
Gustavo Rodrigues

Dean Edward's Packer est un excellent obfuscateur, même s'il obscurcit 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 le menu déroulant.

5
smdrager

Je suggèrerais d’abord d’agrandir avec quelque chose comme YUI Compressor, puis de convertir toutes les chaînes et tous 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 restituer votre code qu’en réalité, s’il le réécrive à 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 hommes libres!

5
Dynamite Blitzer

J'utilise l'utilitaire Closure-Compiler pour l'obscurcissement des scripts Java. Cela minimise le code et offre plus d'options pour l'obscurcissement. Cet utilitaire est disponible sur Google code à l'adresse ci-dessous:
Outils de fermeture

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

Bientôt, je donnerais une chance à UglifyJS.

4
shaILU

J'utilise Jasob depuis des années et c'est sans conteste le meilleur obfuscateur qui existe.
Il possède 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 par un trait de soulignement, puis d’utiliser la fonction sort pour les regrouper. tous ensemble et cochez comme cibles d'obfuscation.

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

Le moteur additionnera automatiquement le nombre de variables ciblées et les hiérarchisera pour obtenir le maximum de compression.

Je ne travaille pas pour Jasob et je n’obtiens rien en en faisant la promotion, mais en offrant quelques conseils amicaux.
L’inconvénient, c’est que ce n’est pas gratuit et qu’il coûte un peu cher, mais qu’il en vaut la peine quand on l’empile avec des alternatives - les options "gratuites" ne se ressemblent même pas.

4
Matt

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

4
niutech

Essayez cet outil Javascript Obfuscator

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

3
Jerczu

Celui-ci réduit mais ne dissimule pas. Si vous ne souhaitez pas utiliser la ligne de commande Java, vous pouvez coller votre javascript dans un formulaire Web.

3
Chris S

Vous devriez certainement envisager de jeter un oeil à Obfuscriptor .

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

Le code masqué ressemble davantage à un code crypté. Contrairement à tout ce que j'ai vu auparavant.

3
Mike

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

3
xgMz

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

3
Adrian

J'ai déjà utilisé cela par le passé et cela fait du bon travail. Ce n'est pas gratuit, mais vous devriez certainement y jeter un coup d'œil.
JavaScript Obfuscator & Encoder

2
Henry

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

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

Le code compilé avec Closure Advanced est presque impossible à désosser, même en passant par un embellisseur, car la base de code entière (y compris la bibliothèque) est obscurcie. . C'est aussi 25% petit en moyenne.

Le code JavaScript qui est simplement minifié (YUI Compressor, Uglify, etc.) est facile à effectuer par l’ingénierie inverse après le passage par un embellisseur.

2
Stephen Chung