So wandeln Sie alles sicher in JavaScript in einen String um

8

Wenn ich:

%Vor%

Wie kann ich test in eine Zeichenkette konvertieren? ohne Aufruf von test.toString() und ohne Verwendung von typeof x == "string" check, da ich nonstrings zulassen möchte.

Hinweis: Dies ist für eine FF-Erweiterung, die Objekte aus dem js-Bereich einer Inhaltsseite behandelt.

    
erikvold 30.11.2010, 04:28
quelle

5 Antworten

5

JavaScript ermöglicht es Ihnen, die Eigenschaften von so ziemlich jedem Objekt zu ändern, auf das Ihr Skript zugreifen kann, einschließlich Object.prototype selbst, was bedeutet, dass jedes Objekt in der Ihnen bekannten Weise für "bösen Code" anfällig ist erklärt.

Nur Primitive sind garantiert sicher, also ist die einzige Möglichkeit, um sicherzustellen, dass "böser Code" niemals ausgeführt wird, etwas zu tun:

%Vor%     
casablanca 30.11.2010, 04:45
quelle
5

Ihr (toString: function(){alert("evil code"); return "test";}) wird hier nicht einmal geparst, es löst einen Syntaxfehler aus. Ich glaube, du wolltest {} anstelle von () verwenden.

Normalerweise könnten Sie eine leere Zeichenfolge und den Plus-Operator verwenden, um eine Umwandlung durchzuführen:

%Vor%

Aber hier gibt es keine echte Möglichkeit, das Objekt sicher zu konvertieren.

Sie können delete test.toString verwenden, um die überschriebene Methode loszuwerden, danach wird auf die normale Methode toString zurückgegriffen, die '[object Object]' zurückgibt. Sie können die Methode toString auch selbst in eine Zeichenfolge über test.toString.toString() konvertieren.

%Vor%

Es liegt an Ihnen, was Sie genau hier machen wollen.

    
Ivo Wetzel 30.11.2010 04:31
quelle
4

Eine Option ist:

%Vor%

Dies ergibt:

%Vor%

im Testfall. Im Grunde gibt es nur Typinformationen. Ich frage mich jedoch, was das genaue Szenario hier ist. Wie wird das böse Objekt in die Seite geladen? Wenn sie auf der Seite beliebigen Code ausführen können, haben Sie grundsätzlich kein Glück. Unter anderem ist es dann möglich, Object.prototype.toString neu zu definieren.

    
Matthew Flaschen 30.11.2010 04:34
quelle
1

Leider funktioniert die Antwort von @Matthew Flaschen (derzeit akzeptiert) nicht mit der Klasse Symbol von ES6 / ES2015:

%Vor%

Ссылка

(Ich habe keine Ahnung warum, denn Symbol hat eine vollkommen gute toString() Methode :)

%Vor%

Ссылка

Es gibt jedoch eine Lösung: Die Funktion String() scheint in der Lage zu sein, jeden Wert (zumindest einen der Werte, die ich ausprobiert habe) in einen String umzuwandeln. Es wird sogar toString() aufrufen, wenn es existiert:

%Vor%

Ссылка

Übergeben Sie alles, was Ihnen gefällt, in String() und Sie erhalten ein ziemlich gutes Ergebnis.

    
Craig Walker 21.10.2016 21:26
quelle
0

Sie können die lodash toString-Methode verwenden.

%Vor%

Link zur Dokumentation

    
quelle