Question:
Obfusquer JavaScript avec des caractères de largeur nulle - avantages et inconvénients?
James Donnelly
2013-03-20 17:06:39 UTC
view on stackexchange narkive permalink

Cela vient des commentaires sur une question sur StackOverflow concernant les variables JavaScript: Pourquoi ◎ ܫ ◎ et ☺ les noms de variables JavaScript ne sont-ils pas valides?

JavaScript accepte les caractères de largeur nulle comme noms de variables valides, par exemple, ces trois variables ont des noms différents mais sont visuellement identiques:

  var ab, / * ab * / a‍b, / * a‍ b * / a‌b; / * a‌ b * /  

Voici un exemple JSFiddle des trois variables ci-dessus utilisées.

Quels sont les avantages et les inconvénients de faire cela comme technique d'obfuscation pour JavaScript (et d'autres langages de support)?

Quatre réponses:
#1
+13
WPrecht
2013-03-20 17:19:59 UTC
view on stackexchange narkive permalink

Eh bien, dans vos propres programmes, c'est probablement bien. Mais dans un contexte d'entreprise, c'est un cauchemar de maintenance sans une très bonne documentation et / ou une continuité d'équipe. Aucun de ces éléments ne semble si commun dans mon expérience.

Je pense qu'une question plus générale pourrait être: "Les techniques d'obfuscation sont-elles vraiment si utiles?" Je peux comprendre minify pour le chargement de la page. Mais cacher la source ne semble pas logique. Vous pensez soit que vous avez un algorithme intelligent, jamais fait auparavant. Si tel est le cas, peut-être que JS n'est pas la langue pour cela puisqu'il n'y a vraiment aucun moyen de le cacher complètement. Ou vous essayez d'être trixsy et de tenter une certaine sécurité par l'obscurité, généralement une mauvaise idée.

#2
+8
Michael Anderson
2013-03-20 19:25:04 UTC
view on stackexchange narkive permalink

Un gros inconvénient est posé dans les questions suivantes:

  • Quels interprètes JavaScript cassent lorsqu'ils sont confrontés à un tel code?
  • Est-ce acceptable?

Un simple Obfuscator normal devrait produire un code obtus acceptable sans casser certains interpréteurs JavaScript.

Si l'on veut vraiment travailler avec des caractères de largeur nulle dans les noms de variables, il serait inclus dans le Processus d'obfuscation du code (Le fichier js résultant ne doit être chargé qu'après une vérification de la version du navigateur.). De cette façon, le développeur n'a pas à gérer les caractères de largeur nulle dans le code source d'origine.

#3
+6
Gilles 'SO- stop being evil'
2013-03-21 00:10:37 UTC
view on stackexchange narkive permalink

Désobfusquer les noms de variables avec des caractères de largeur nulle est aussi simple que de renommer des variables. C'est quelque chose que vous feriez de toute façon dans le cadre du processus de désobfuscation, en déduisant l'intention derrière les variables et en leur donnant des noms significatifs. Cette technique pourrait donc tout au plus inciter le lecteur à effectuer une première passe de changement de nom. Le coût supplémentaire de désobfuscation est négligeable. Cela ne vaut pas la peine, il n'y a aucun avantage à a , b , c ,…

#4
+5
George V. Williams
2013-03-21 02:36:51 UTC
view on stackexchange narkive permalink

Cela brise également certaines beautés (mais pas toutes). Par exemple, exécuter votre code via JS Beautifier:

  var ab = "Hello, world!", A‍ b = "Chaîne complètement différente!", A‌ b = "Encore une autre chaîne complètement différente! "; document.getElementById ('result1'). innerHTML = ab; document.getElementById ('result2'). innerHTML = a‍ b; document.getElementById ('result3'). innerHTML = a‌ b;  

(Notez les espaces entre "a" et "b".)

Vous pourriez dire que c'est un pour et un contre. En fonction de la confusion avec laquelle vous créez le code, il peut être encore plus déroutant de voir des espaces aléatoires injectés. D'autre part, il avertit également le lecteur que quelque chose ne va pas.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...