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


Answers

Je suis surpris que personne n'ait mentionné le compilateur de fermeture de Google. 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 une " amélioration solide "

Question

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?




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




Ce que je ferais:

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



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

Quant à obfuscating vs minifying - je ne suis pas un grand fan de l'ancien. Cela rend le débogage impossible (Erreur à la ligne 1 ... "Attendre, il n'y a qu'une seule ligne") et il faut toujours du temps pour décompresser. Mais si vous avez besoin de ... bien.




J'ai déjà utilisé cela dans le passé, et ça fait du bon travail. Ce n'est pas gratuit, mais vous devriez vraiment jeter un coup d'oeil.
JavaScript Obfuscator & Encoder




Celui-ci minimise mais ne cache pas. Si vous ne voulez pas utiliser la ligne de commande Java, vous pouvez coller votre javascript dans un formulaire Web.




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 ..




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.




Je suggère d'abord minify avec quelque chose comme YUI Compressor, puis convertir toute la chaîne et les chiffres 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 pour qu'un hacker reprenne votre code que s'il le réécrit de toutes pièces. Réécriture et clonage est ce que vous ne pouvez pas réellement arrêter. Après tout, nous sommes des gens libres!




Essayez cet outil Javascript Obfuscator

Je l'ai utilisé sur mon jeu HTML5 non seulement il réduit sa taille de 950KB à 150 mais aussi fait le code source illisible compilateurs de fermeture et minifiers sont réversibles Je ne sais personnellement pas comment inverser cette obfuscation.




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




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

Pas beaucoup car il compresse plus, mais surtout parce qu'il va attraper des erreurs javascript comme a = [1,2,3,]; qui font IE aller haywire.