Question Comment puis-je obscurcir (protéger) JavaScript? [fermé]


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


662
2017-10-11 18:17


origine


Réponses:


Obfuscation:

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

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 utile. Bien sûr, en empaquetant votre source dans un désordre minifié brouillé, vous avez une version légère de Sécurité par 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, donc 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 voir, vous auriez quelques options. Tout d'abord, vous pouvez effectuer un 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 encoder en base64 certaines valeurs de chaînes, et cela serait plus facile .. mais quelqu'un qui voulait vraiment ces valeurs de chaîne pourrait facilement les décoder. Le cryptage est le seul moyen d'empêcher quiconque d'accéder à vos données, et la plupart des gens trouvent cela plus sûr que nécessaire.

Sidenote:

Obfuscation en Javascript a été connu pour causer des bugs. Les obfuscateurs obtiennent un peu mieux à ce sujet, mais beaucoup de tenues décident qu'ils voient assez de bénéfice de minifiant et gzipping, et les économies supplémentaires d'obfuscation ne vaut pas toujours la peine. Si vous essayez de protéger votre source, vous déciderez peut-être que cela vaut la peine, juste pour rendre votre code plus difficile à lire. JSMin est une bonne alternative.


387
2017-10-11 18:21



Je suis surpris que personne n'a mentionné Google Fermeture du compilateur. Il ne fait pas que réduire / compresser, il analyse pour trouver et supprimer le code inutilisé, et réécrit pour une minimisation maximale. Il peut également faire une vérification de type et avertira des erreurs de syntaxe.

JQuery a récemment changé de YUI Compresser à Closure Compiler, et a vu un "amélioration solide"


129
2018-04-17 15:14



L'obscurcissement ne peut jamais vraiment fonctionner. Pour tous ceux qui veulent vraiment obtenir votre code, c'est juste un ralentisseur. Pire, cela empêche vos utilisateurs de corriger les bogues (et de vous renvoyer les correctifs), et il vous est plus difficile de diagnostiquer les 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 veut pas dire "les gens peuvent lire la source". Au lieu de cela, Open Source est 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) 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 l'important code côté serveur et ayez votre code Javascript public pour faire des appels Ajax.

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


115
2017-10-25 23:24



Vous pouvez brouiller la source javascript tout ce que vous voulez, mais il sera toujours reverse-engineering juste en exigeant que tout le code source fonctionne réellement sur la machine client ... la meilleure option que je peux penser est d'avoir tout votre traitement fait avec le code côté serveur, et tout le code client javascript est d'envoyer des demandes de traitement au serveur lui-même. Sinon, tout le monde sera toujours capable de garder une trace de toutes les opérations que le code est en train de faire.

Quelqu'un a mentionné base64 pour garder les ficelles en sécurité. C'est une idée terrible. Base64 est immédiatement reconnaissable par les types de personnes qui voudraient désosser votre code. La première chose qu'ils vont faire est de le désencoder et de voir de quoi il s'agit.


50
2017-10-11 19:21



Il y a un certain nombre d'outils d'obfuscation de JavaScript qui sont librement disponibles; cependant, je pense qu'il est important de noter qu'il est difficile d'obscurcir le JavaScript au point où il ne peut pas être contrecollé.

À cette fin, il y a plusieurs options que j'ai utilisées jusqu'à un certain point:

  • 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'obfuscation qui fonctionne relativement bien. Essentiellement, Compressor va changer les noms des fonctions, supprimer les espaces et modifier les variables locales. C'est ce que j'utilise le plus souvent. C'est un outil Java open-source.

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

  • JavaScript gratuit Obfuscator. Ceci est un outil basé sur le Web qui tente d'obscurcir votre code en l'encodant réellement. Je pense que les compromis de sa forme d'encodage (ou d'obfuscation) pourraient se faire au détriment de la taille de fichier; Cependant, c'est une question de préférence personnelle.


44
2017-10-11 18:26



Ce que je ferais:

UNE. Troll le hacker!

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

Qu'est-ce que ce code?

  1. charge le code réel
  2. Définit un en-tête personnalisé
  3. poste 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. Obscurcir le code un peu

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é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 une interdiction ip, fermer 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=';
};
?>

base64 referrer = 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 vers une fonction SECRET imbriquée.

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

Je ne suis pas sûr si cela fonctionne mais j'utilise chrome et vérifié les éléments, ressources, réseau, sources, chronologie, profils, vérifications mais je n'ai pas trouvé la ligne ci-dessus.

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

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

MODIFIER

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

21
2017-07-04 11:12



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 encore une fois, il est assez trivial de décompiler).

Donc, si vous ne voulez pas sacrifier les performances, vous ne pouvez agir que sur des 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).
Si vous devez les crypter et les décrypter en temps réel, les chaînes qui se brouillent auront un impact sur les performances. De plus, un débogueur JS peut afficher les valeurs finales ...


17
2017-10-11 18:23



Contrairement à la plupart des autres réponses que je propose contre YUI Compressor; Tu devrais utiliser Google Closure.

Pas grand chose car il comprime plus, mais surtout parce qu'il va attraper des erreurs javascript telles que a = [1,2,3,]; qui font IE aller haywire.


17
2017-08-22 12:44



Essayer JScrambler. Je lui ai donné un spin récemment et a été impressionné par cela. 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 veulent juste le faire rapidement. Vous pouvez également créer une obfuscation personnalisée en choisissant les transformations / techniques que vous voulez.


17
2018-06-08 20:35



Une application Javascript non-open-source est assez bête. Javascript est un langage interprété côté client .. Obfuscation n'est pas beaucoup de protection ..

JS obfuscation est habituellement fait 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 "minifier") dans son nom pour une raison ..


13
2017-10-12 05:44