2016-07-25 11 views
5

Zum Beispiel habe ich ein Skript auf einer Website geladen, und ich würde gerne wissen, ob JSON.parse/stringify nicht Affe gepatcht wurde.Gibt es eine Möglichkeit zu überprüfen, ob eine native Javascript-Funktion ein Affe-Patch ist?

Ich habe bemerkt, dass, wenn ich toString auf die Funktion in Chrome/FF, JSON.stringify.toString, dann komme ich zurück:

function stringify() { 
    [native code] 
} 

Meine Frage zu tun ist, Sie denken, dies ist ein guter Weg, um zu überprüfen, ob eine Funktion war Affe gepatcht? Würde auch gerne von anderen Ansätzen zu diesem Problem hören.

+2

Vielleicht können Sie Ihr eigenes Skript in einem WebWorker ausführen und die Funktion innerhalb des Arbeiters mit der Funktion von der Hauptseite aus vergleichen. – Buzzy

Antwort

4

Ja, dies ist der einzige praktische Weg, um zu überprüfen, ob eine native Funktion überschrieben wurde oder nicht.

const isNative = fn => !!fn.toString().match(/\[native code\]/) 

console.log(isNative(JSON.stringify)); 

Eine robustere Lösung Function.prototype.toString() statt direkten Aufruf von fn.toString(), aber beide sind auch monkeypatchable nutzen könnten. Die Freuden der JavaScript :)

4

Eine leicht fälschen könnte JSON.stringify.toString

JSON.stringify = function() {} 
JSON.stringify.toString = function() {return 'ha-ha'} 

console.log(JSON.stringify); //ha-ha 

etwas robuster Weise zu nutzen wäre könnte Function.prototype.toString

Function.prototype.toString.call(JSON.stringify) 

Aber wirklich schlecht monkeypatcher Function.prototype.toString als auch Patch :)

3

Die Spezifikation (http://www.ecma-international.org/ecma-262/7.0/index.html#sec-function.prototype.tostring) gibt nicht die genaue Zeichenfolge an, die für eine eingebaute Funktion zurückgegeben wird auf:

19.2.3.5 Function.prototype.toString

Wenn die toString Methode für ein Objekt func die folgenden Schritte unternommen werden, aufgerufen wird:

Wenn func Bound Funktion ein Objekt ist exotisch , dann geben Sie eine Implementierung-abhängig String Quellcode-Darstellung von func. Die Darstellung muss den folgenden Regeln entsprechen. Es ist Implementierung abhängig, ob die Darstellung gebundene Funktionsinformationen oder Informationen über die Zielfunktion enthält. Wenn Typ (func) Objekt ist und entweder ein integriertes Funktionsobjekt ist oder einen internen [[ECMAScriptCode]] - Steckplatz hat, dann Rückgabe einer implementierungsabhängigen String-Quellcodedarstellung von func. Die Darstellung muss den folgenden Regeln entsprechen. Wirf eine TypeError Ausnahme. toString Representation Anforderungen:

Die Stringdarstellung muss die Syntax eines haben FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, ClassDeclaration, ClassExpression, ArrowFunction, MethodDefinition oder GeneratorMethod in Abhängigkeit von den tatsächlichen Eigenschaften des Objekts. Die Verwendung und Platzierung von Leerzeichen, Zeilenabschlüssen und Semikola in der Repräsentationsstring ist implementierungsabhängig.Wenn das Objekt mit dem Code ECMAScript definiert wurde und die zurückgegebene Zeichenfolgendarstellung nicht die Form MethodDefinition oder GeneratorMethod hat, muss die Repräsentation sein, so dass bei der Auswertung der Zeichenfolge eval in einem lexikalischen Kontext verwendet wird Der lexikalische Kontext, der zum Erstellen des ursprünglichen Objekts verwendet wurde, führt zu einem neuen funktional äquivalenten Objekt. In diesem Fall darf der zurückgegebene Quellcode nicht frei Variablen erwähnen, die nicht frei von der ursprünglichen Funktion Quellcode erwähnt wurden, auch wenn diese "extra" Namen ursprünglich im Geltungsbereich waren. Wenn die Implementierung keine Quellcodezeichenfolge erzeugen kann, die diese Kriterien erfüllt, muss es eine Zeichenfolge zurückgeben, für die eval eine SyntaxError-Ausnahme auslöst.

Die Überprüfung auf [Native Code] kann oder kann nicht abhängig vom Interpreter funktionieren. Darüber hinaus könnte eine Implementierung eingebaute Funktionen als normalen JavaScript-Code implementieren.

Also in Antwort auf Ihre Frage, können Sie nicht feststellen, ist ein Javascript angegeben, ob eine eingebaute Funktion Affe-Patched wurde.

Das besagt, dass es scheint, dass Chrome und Firefox beide die [Native Code] Zeichenfolge zurückgeben, die Überprüfung auf anderen Implementierungen, die eine pragmatische Lösung sein können.

+0

* "Darüber hinaus könnte eine Implementierung eingebaute Funktionen als normalen JavaScript-Code implementieren." * Dies ist wahrscheinlich kein Problem. V8's 'Promise' [ist in JavaScript implementiert] (https://github.com/v8/v8/blob/986814218b907cbac244a3624362ee9351f6badb/src/js/promise.js) und' Promise.toString() 'hat immer noch '[native code] ' drin. – noppa

+0

Interessant .... – HBP

Verwandte Themen