Frage

Eine Ajax-Anforderung zurückgibt mir einen Standard-Array JSON gefüllt mit Eingängen meines Benutzers. Die Eingabe wird desinfiziert worden ist, und mit Hilfe der Funktion eval (), kann ich mein Javascript-Objekt und aktualisiere meine Seite einfach erstellen ...

So, hier ist das Problem. Egal, wie sehr ich versuche, die Eingänge zu sanieren, würde ich eher nicht verwenden, um die Funktion eval (). Ich habe Google nach Möglichkeiten geprüft „JSON in AJAX ohne eval“ zu verwenden und haben quer durch eine Reihe von verschiedenen Methoden lief ...

Welche soll ich verwenden? Gibt es einen Standard, bewährte sichere Art und Weise, dies zu tun?

War es hilfreich?

Lösung

json.org hat eine schöne JavaScript-Bibliothek

einfache Nutzung:

JSON.parse('[{"some":"json"}]');
JSON.stringify([{some:'json'}]);

Bearbeiten : Wie in den Kommentaren darauf hingewiesen, diese verwendet eval, wenn Sie seine Quelle Blick durch (obwohl es hygienisiert zu werden sucht zuerst)

es vollständig zu vermeiden, suchen Sie unter json_parse oder json-sans-eval

json2.js ist unsicher, json_parse.js langsam ist, json-sans-eval.js ist nicht-Validierung

Andere Tipps

  

Gibt es einen Standard, bewährten sichere Art und Weise, dies zu tun?

Es gibt eine vorgeschlagenen Standard Art und Weise, dies zu tun, in der bevorstehenden ECMAScript 3.1-Version von JavaScript: JSON.parse .

Es wird in IE8, Firefox 3.1 / 3.5 und wahrscheinlich den anderen gängigen Browser in Zukunft unterstützt werden. In der Zwischenzeit können Sie (nach oder ausschließlich verwenden, eval fallen). Das Böse kann es sein oder nicht; sicherlich wird es langsamer als JSON.parse sein. Aber das ist der üblicher Weg, JSON heute zu analysieren.

Wenn ein Angreifer in der Lage ist malcious JavaScript in Inhalt injizieren Sie über JSON sind auszuspucken, haben Sie größere Probleme kümmern als eval-is-Übel.

Ich würde sagen, wenn der Eingang hygienisiert wird, eval ist der beste Weg zu gehen. Wenn Ihr Server gefährdet wird, werden die Menschen der Lage sein, was Skripte sie sowieso an den Client möchten zu senden. So ein eval setzen ist kein großes Sicherheitsrisiko. Wenn Sie über die Menschen besorgt sind, die Manipulation der Pakete, bevor sie den Client dann erreichen, wieder können die Skripte selbst geändert werden.

Kümmere dich nicht um eval. Aber stellen Sie sicher, dass es in einem Versuch wickeln ... catch-Block, damit die Benutzer nicht bekommen, JS Fehler, wenn Ihr JSON verstümmelt wird.

:)

sicher zu JSON zu einem JS-Objekt konvertieren Sie eine solche JSON-Parser als JSON.parse () Funktion von diese Bibliothek .

Vergleichen

auf den Befehl Entwurfsmuster: http://en.wikipedia.org/wiki/Command_pattern . Vor diesem Hintergrund können Sie genau die Operationen definieren ein Client ausführen kann, und Ihre Anwendung wird als die zugrunde liegende Auslegung als sicher sein.

Abhängig von was Sie versuchen, mit der Sanierung zu erreichen. Ich habe großen Erfolg gehabt w / die Prototyp Rahmen Unterstützung für JSON und sichere Auswertung.

Wenn Sie sicher sind, gibt es keine Injektion Risiko, und Sie sind nicht in einer Schleife eval()ing, dann eval() verwenden. Es vergleicht positiv auf andere Optionen, die sicherlich langsamer sein werden, könnte brechen, und wird die Kunden erfordert zusätzlichen Code zum Download bereit.

"gestohlen" von jQuery

// Try to use the native JSON parser first
return window.JSON && window.JSON.parse ?
    window.JSON.parse( data ) :
    (new Function("return " + data))();

Problem: Das Problem eval stellt, ist, dass es im globalen Bereich führt

eval.call(document, "console.log(this)")
eval.call(navigator, "console.log(this)")
eval.call(window, "console.log(this)")
(function(){eval.call(document, "console.log(this)")})()
>Window

Szenario:

Angenommen, Sie einzelne Attribute in dem Markup-Code verschiedenen Dokument-Elemente verwenden, wie beispielsweise ein Attribut onvisible

<img src="" onvisible="src='http://www.example.com/myimg.png';">

Sie möchten alle Elemente mit diesem Attribute bekommen, drehen Sie das onvisible-content-String in einen Verschluss und steckt es in eine Eventhandler Warteschlange. Hier wird der JS-Funktion Konstruktor ins Spiel kommt.

Function === 0..constructor.constructor
>true

Function('return [this, arguments]').call(window, 1,2,3)
>Window, Arguments[3]]
Function('return [this, arguments]').call(document, 1,2,3)
>Document, Arguments[3]]
Function('return [this, arguments]').call(navigator, 1,2,3)
>Navigator, Arguments[3]]    

Dass sie alle zusammen:

var eventQueue = [];
var els = document.querySelectorAll('[onvisible]');

for (var el in els) {
    var jscode = els[el].getAttribute('onvisible');
    eventQueue.push( {el:els[el], cb:Function(jscode)} )
}

//eventQueue[0].cb.call(scope, args);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top