Heim >Web-Frontend >js-Tutorial >Erkunden der sechs Zeichen in JavaScript
JavaScript ist eine seltsame und interessante Sprache, und wir können verrückten Code schreiben, der immer noch funktioniert. Es versucht uns dabei zu helfen, Dinge basierend auf unserer Behandlung in bestimmte Typen umzuwandeln.
Wenn wir eine Zeichenfolge hinzufügen, geht JavaScript davon aus, dass wir eine Textdarstellung wünschen, also wandeln wir sie in eine Zeichenfolge um. Wenn wir ein positives oder negatives Präfixsymbol hinzufügen, geht JavaScript davon aus, dass es in numerischer Form dargestellt werden soll, und wandelt die Zeichenfolge nach Möglichkeit für uns in eine Zahl um. Wenn wir ein Negationssymbol hinzufügen, wandelt JavaScript die Zeichenfolge in einen booleschen Wert um.
Wir können diese sechs Symbole [,],(,), und in Javascript verwenden, um magischen Code zu schreiben. Wenn Sie gerade nicht an Ihrem Telefon sind, können Sie die Konsole Ihres Browsers öffnen und ein beliebiges Codebeispiel mit dem Codewert „true“ in die Konsole einfügen.
Beginnen wir mit den Grundlagen, einigen goldenen Regeln, die Sie sich merken sollten:
Die folgenden Zeichen werden in einen booleschen Wert umgewandelt.
Die folgenden Zeichen werden in einen numerischen Wert umgewandelt Die Zeichen nach
[] werden in eine Zeichenfolge
Sehen Sie sich das folgende Beispiel an:
![] === false +[] === 0 []+[] === ""
Noch etwas, das Sie wissen sollten: Ja, es ist möglich, bestimmte Daten abzurufen Buchstaben aus einer Zeichenfolge mithilfe von eckigen Klammern, etwa so:
"hello"[0] === "h"
Denken Sie auch daran, dass Sie mehrstellige Zahlen darstellen können, indem Sie die Zeichenfolge addieren und dann den gesamten Ausdruck in eine A-Zahl umwandeln:
+("1" + "1") === 11
Wir kombinieren weiterhin einige Dinge miteinander, um den Buchstaben a zu erhalten
![] === false ![]+[] === "false" +!![] === 1 ------------------------ (![]+[])[+!![]] === "a" // same as "false"[1]
Schlussfolgerungen anwenden!
Wir können ähnliche Buchstaben a, e, f, l, r, s, t, u durch wahr und falsch erhalten. Können wir also Buchstaben von anderen Orten erhalten?
Wir können durch einige spezielle Formeln wie [][[]] undefiniert werden und die oben erwähnten goldenen Regeln verwenden, um die anderen Buchstaben d, i und n zu erhalten.
`[][[]] + [] === "undefined"`
Mit allen Buchstaben, die wir bisher erworben haben, können wir sie buchstabieren, ausfüllen, filtern und finden. Natürlich gibt es noch einige andere Wörter, die wir auch buchstabieren können, aber das Wichtigste an diesen Wörtern ist, dass sie alle Array-Methoden sind. Dies bedeutet, dass sie Teil des Array-Objekts sind und die Array-Instanz direkt aufrufen können, z. B.: [2,1].sort().
Eine weitere wichtige Sache, die Sie über JavaScript wissen sollten, ist, dass auf die Eigenschaften eines Objekts durch Punktnotation oder eckige Klammern [] zugegriffen werden kann. Die oben genannten Array-Methoden sind Eigenschaften des Array-Objekts selbst, und wir können diese Methoden mit eckigen Klammern anstelle der Punktnotation aufrufen.
[2,1]["sort"]() ist also äquivalent zu [2,1].sort().
Sehen wir uns weiterhin an, wann wir versuchen, ein Array von zu verwenden Mit der Methode können wir die Buchstaben verwenden, die wir bisher geschrieben, aber nicht aufgerufen haben.
[]["fill"]
Dies wird die Funktion fill() { [native code] } erhalten, wir können diesen Methodenheader wieder als String verwenden, indem wir unsere goldene Regel verwenden:
[]["fill"]+[] === "function fill() { [native code] }"
Also jetzt Holen Sie sich andere Zeichen: c,o,v,(,),{,[,],}.
Mit unserem neuen c und o können wir nun den Wortkonstruktor bilden. Ein Konstruktor ist eine Methode und alle JS-Objekte geben einfach ihren eigenen Konstruktor zurück.
Für die Objekte, mit denen wir uns bisher befasst haben, können wir ihre Konstruktorfunktion als Zeichenfolge darstellen:
true["constructor"] + [] === "function Boolean() { [native code] }" 0["constructor"] + [] === "function Number() { [native code] }" ""["constructor"] + [] === "function String() { [native code] }" []["constructor"] + [] === "function Array() { [native code] }" ({})["constructor"] + [] === "function Object() { [native code] }"
Mit diesen Formeln können wir in unserer Bibliothek die folgenden Zeichen hinzufügen :
Jetzt können wir eine Funktion „toString“ konstruieren, die wir in eckigen Klammern verwenden können. Wir können sie so nennen:
(10)["toString"]() === "10"
Using Unsere goldene Regel: Wir können bereits alles, was wir wollen, in einen String umwandeln, aber wie funktioniert das?
Nun, ich sage Ihnen, die toString-Methode vom Typ Number hat ein geheimes Argument namens radix („radix“). Es wandelt den Wert in eine Basis um, bevor es in eine Zeichenfolge umgewandelt wird, etwa so:
(12)["toString"](10) === "12" // 十进制 (12)["toString"](2) === "1100" // 二进制 (12)["toString"](8) === "14" // 八进制 (12)["toString"](16) === "c" // 十六进制
Aber warum wird die Basis nur auf 16 geschrieben? Der Maximalwert beträgt 36, einschließlich aller Zeichen 0-9 und a-z, sodass wir jetzt alle gewünschten alphanumerischen Zeichen erhalten können:
(10)["toString"](36) === "a" (35)["toString"](36) === "z"
Das ist großartig! Aber andere Symbole wie Satzzeichen und Großbuchstaben Wollstoff? Lassen Sie uns weiter erkunden.
Je nachdem, wann Ihr JS ausgeführt wird, kann es Zugriff auf bestimmte vordefinierte Objekte oder Daten haben oder nicht. Wenn Sie dies in einem Browser ausführen, haben Sie Zugriff auf einige vorhandene HTML-Wrapper-Methoden.
Fett ist beispielsweise eine Zeichenfolgenmethode, die in ein -Tag eingeschlossen ist.
"test"["bold"]() === "<b>test</b>"
Dadurch erhalten wir die beiden Zeichen und /.
Vielleicht haben Sie schon von der Escape-Methode gehört, die hauptsächlich einen String in ein URI-freundliches Format umwandelt, das von einfachen Browsern interpretiert werden kann. Wenn wir ein Leerzeichen übergeben, erhalten wir „“.
Hier ist ein Tool, das jedes Zeichen automatisch umwandelt. Tool-Adresse: http://www.jsfuck.com/ Quellcode-Adresse: https://raw.githubusercontent.com/aemkei/jsfuck/master/jsfuck.js
Warum sind diese Zeichen nützlich?
Es ist nicht so, dass eBay vor nicht allzu langer Zeit etwas Schlimmes getan hätte, das es Verkäufern ermöglicht hätte, ausführbare JS-Dateien nur mit diesen Zeichen in Seiten einzufügen, aber es handelt sich um einen ziemlich seltenen Angriffsvektor. Manche Leute sagen Verschleierung, aber tatsächlich gibt es bessere Möglichkeiten zur Verschleierung.
Abschließend hoffe ich, dass Ihnen diese Erkundungsreise Spaß macht.
Ressourcen:
https://en.wikipedia.org/wiki/JSFuck
https://esolangs.org/wiki/JSFuck
http://patriciopalladino.com/blog/2012/08/09/non-alphanumeric-javascript.html
https://raw.githubusercontent.com/aemkei/jsfuck/master/jsfuck.js