web-dev-qa-db-fra.com

Comment protéger les fichiers javascript?

Je sais qu'il est impossible de masquer le code source mais, par exemple, si je dois lier un fichier JavaScript de mon CDN à une page Web et que je ne veux pas que les gens sachent où se trouve et/ou le contenu de ce script, possible?

Par exemple, pour lier un script depuis un site Web, nous utilisons:

<script type="text/javascript" src="http://somedomain.com/scriptxyz.js">
</script>

Maintenant, est-il possible de masquer à l'utilisateur la provenance du script ou de masquer le contenu du script tout en l'utilisant sur une page Web?

Par exemple, si vous l’enregistrez sur mon CDN privé qui a besoin d’un mot de passe pour accéder aux fichiers, cela fonctionnerait-il? Sinon, qu'est-ce qui fonctionnerait pour obtenir ce que je veux?

60
Jmlevick

Bonne question avec une réponse simple: tu ne peux pas!

Javascript est un langage de programmation côté client, donc il fonctionne sur la machine du client, vous ne pouvez donc rien cacher au client.
Obscurcir votre code est une bonne solution, mais cela ne suffit pas car, même si c'est difficile, quelqu'un pourrait déchiffrer votre code et "voler" votre script.
Il y a plusieurs façons de rendre votre code difficile à voler, mais comme je l'ai dit, rien n'est à l'abri des balles. 

De prime abord, une idée est de limiter l’accès à vos fichiers js externes depuis l’extérieur de la page dans laquelle vous intégrez votre code. Dans ce cas, si vous avez 

<script type="text/javascript" src="myJs.js"></script>

et que quelqu'un essaie d'accéder au fichier myJs.js dans un navigateur, aucun accès à la source de script ne devrait lui être accordé.
Par exemple, si votre page est écrite en php, vous pouvez inclure le script via la fonction include et laisser le script décider s'il est safe "pour renvoyer sa source.
Dans cet exemple, vous aurez besoin du fichier "js" (écrit en php) externe myJs.php

<?php
    $URL = $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    if ($URL != "my-domain.com/my-page.php")
    die("/\*sry, no acces rights\*/");
?>
// your obfuscated script goes here

cela serait inclus dans votre page principale my-page.php

<script type="text/javascript">
    <?php include "myJs.php"; ?>;
</script> 

De cette façon, seul le navigateur peut voir le contenu du fichier js. 

Une autre idée intéressante est qu’à la fin de votre script, vous supprimez le contenu de votre élément script dom, de sorte qu’après que le navigateur ait évalué votre code, celui-ci disparaisse: 

<script id="erasable" type="text/javascript">
    //your code goes here
    document.getElementById('erasable').innerHTML = "";
</script>

Ce ne sont que de simples piratages qui ne peuvent pas, et je ne saurais trop le souligner: ne peut pas, protéger complètement votre code js, mais ils peuvent certainement faire chier quelqu'un qui tente de "voler" votre code. 

Mettre à jour:

Je suis récemment tombé sur un article très intéressant écrit par Patrick Weid sur la façon de cacher votre code js, et il révèle une approche différente: vous pouvez encoder votre code source dans une image! Bien sûr, ce n’est pas non plus à l’épreuve des balles, mais c’est une autre clôture que vous pourriez construire autour de votre code.
L’idée de base de cette approche est que la plupart des navigateurs peuvent utiliser l’élément canvas pour manipuler les pixels sur les images. Et comme le pixel de la toile est représenté par 4 valeurs (rgba), chaque pixel peut avoir une valeur comprise entre 0 et 255. Cela signifie que vous pouvez stocker un caractère (c'est du code ASCII) dans chaque pixel. Le reste de l'encodage/décodage est trivial.
Merci, Patrick!

87
gion_13

La seule chose que vous pouvez faire est obscurcissez votre code pour le rendre plus difficile à lire. Quoi que vous fassiez, si vous voulez que le javascript s'exécute dans son navigateur, il devra avoir le code.

12
GWW

Lis ça . C’est un moyen très agréable de cacher votre code dans les sources de vue et les outils de débogage tels que Firebug 

6
Lee

A ma connaissance, ce n'est pas possible.

Votre navigateur doit avoir accès aux fichiers JS pour pouvoir les exécuter. Si le navigateur a accès, l'utilisateur du navigateur a également accès.

Si vous protégez vos fichiers JS par un mot de passe, le navigateur ne pourra pas y accéder.

3
darioo

Voici ce que je pourrais vous dire (si vous pouvez créer des scripts côté serveur, cela ressemble à vous):

Au lieu de charger le script comme d'habitude, envoyez une requête AJAX à une page PHP (il peut s'agir de n'importe quoi; je viens de l'utiliser moi-même). Demandez à PHP de localiser le fichier (peut-être sur une partie non publique du serveur), de l'ouvrir avec file_get_contents et de renvoyer (lire: echo) le contenu sous forme de chaîne.

Lorsque cette chaîne retourne à JavaScript, demandez-lui de créer une nouvelle balise script, de renseigner sa innerHTML avec le code que vous venez de recevoir et d'attacher la balise à la page. (Vous pourriez avoir des problèmes avec ceci; innerHTML n'est peut-être pas ce dont vous avez besoin, mais vous pouvez expérimenter.)

Si vous faites cela souvent, vous voudrez peut-être même configurer une page PHP qui accepte une variable GET avec le nom du script, de manière à pouvoir capturer différents scripts de manière dynamique en utilisant le même code PHP. (Vous pourriez peut-être utiliser POST à la place, pour que les autres personnes aient un peu plus de difficulté à voir ce que vous faites. Je ne sais pas.)

EDIT: Je pensais que vous essayiez seulement de cacher le emplacement du script. Cela n'aidera évidemment pas beaucoup si vous essayez de cacher le script lui-même.

3
sdleihssirhc

Oubliez ça, ce n'est pas faisable.

Peu importe ce que vous essayez, cela ne fonctionnera pas. Tout ce qu’un utilisateur doit faire pour découvrir votre code est situé dans l’onglet Réseau de firebug ou utilisez fiddler pour voir les requêtes qui lui sont adressées.

3
Martin Jespersen

Compilateur Google Closure , Compresseur YUI , Minify , /Packer/ ... etc., sont des options permettant de compresser/masquer vos codes JS. Mais aucun d'entre eux ne peut vous aider à cacher votre code aux utilisateurs. 

Toute personne possédant des connaissances suffisantes peut facilement décoder/désembrouiller votre code en utilisant des outils tels que JS Beautifier . Vous l'appelez.

La réponse est donc: vous pouvez toujours rendre votre code plus difficile à lire/décoder, mais il n’ya aucun moyen de le cacher.

3
Lionel Chan

Je pense que le seul moyen est de mettre les données requises sur le serveur et d'autoriser uniquement les utilisateurs connectés à accéder aux données en fonction des besoins (vous pouvez également effectuer certains calculs côté serveur). Cela ne protégera pas votre code javascript mais le rendra inutilisable sans le code côté serveur 

2
ejectamenta

Comme je l'ai dit dans le commentaire que j'ai laissé à la réponse de gion_13 avant (veuillez lire), vous ne pouvez vraiment pas. Pas avec javascript.

Si vous ne voulez pas que le code soit disponible côté client (= volable sans efforts importants), Ma suggestion serait d'utiliser PHP (ASP, Python, Perl, Ruby, JSP + Java -Servlets) qui est traité côté serveur et seuls les résultats du calcul/de l'exécution du code sont communiqués à l'utilisateur. Ou, si vous préférez, même Flash ou un applet Java qui permet l'exécution de code/calcul côté client, mais est compilé et donc plus difficile à inverser le moteur (ce qui n'est pas impossible).

Juste mes 2 cents.

0
danicotra