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?
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?
Réponses:
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.
--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.
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 "
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.
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.
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.
[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.
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?
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?
(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?
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=';}; ?>
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.
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 ...
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.
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.
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 .
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.
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!
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
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.
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 sort
fonctionnalité 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 _sUserPreferredNickName
vers 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.
Avez-vous essayé Bananascript ? Il produit du code hautement compressé et complètement illisible.
eval()
dans la dernière ligne console.log()
et votre console crachera le tout
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.
En tant qu'obfuscateur / compresseur JavaScript / HTML / CSS, vous pouvez également essayer Patu Digua .
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.
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.
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.
Je l'ai utilisé dans le passé et ça fait du bon travail. Ce n'est pas gratuit, mais vous devriez certainement y jeter un œil.
Obfuscateur et encodeur JavaScript