json
Marc
- javascript
Hallo,
ich habe mir heute mal json angeschaut und bin - eigentlich - total begeistert. Ich habe einige Ajax-Anwendungen, die nur wenige Informationen hin- und herschicken.
Jetzt bin ich aber verunsichert bzgl. der Verwendung von eval().
Ist es irgendwie möglich, dass, wenn in dem json-String Javascript-Code enthalten ist (z.B. "name":"alert('sadsadasd');"), dieser ausgeführt wird?
Kennt vielleicht jemand Links zu Seiten, die sich mit Risiken von json auseinandersetzen? Alles, was ich bis jetzt gefunden habe, waren mehr oder weniger Einsteiger-Tutorial, die in dieser Richtung nicht viel zu bieten haben...
Jetzt bin ich aber verunsichert bzgl. der Verwendung von eval().
Auf json.org findest du den Hinweis auf eine JS-Bibliothek, die deine (berechtigten) Sicherheitsbedenken zerstreuen sollte.
Siechfred
Vielleicht habe ich da was falsch verstanden, aber da war nirgends die Rede von dem Problem, dass vielleicht JS-Funktionen mitgeparst werden können.
Ich habe hier diesen Code, wo ich das mal probiert habe:
<script type="text/javascript">
var str = '{';
str += '"namen":';
str += '[';
str += '"Mafred herbert",';
str += '"alert('asdsad');"';
str += ']';
str += '}';
jsObj = str.parseJSON();
</script>
Die Funktion alert('asdsad') wurde jedoch erst ausgeführt, als ich
eval(jsObj.namen[1]) ausgeführt habe.
Bedeutet das, dass es nicht möglich ist, JS-Funktionen in den json-String einzuschleusen, die bei dessen Parsen ausgeführt werden?
Bedeutet das, dass es nicht möglich ist, JS-Funktionen in den json-String einzuschleusen, die bei dessen Parsen ausgeführt werden?
Nein, ein String ist ein String, selbst wenn er für sich betrachtet eine Javascript-Anweisung ist. Mal angenommen, dein JSON-String sähe so aus:
var JSONString = '{"namen": [ "Manfred", "alert(\'Boo!\');" ] }';
würde beim Parsen via eval nichts passieren, da das alert als String interpretiert würde. Schreibst du statt dessen:
var JSONString = '{"namen": [ "Manfred", alert(\"Boo!\") ] }';
dann würde beim Parsen via eval die Alert-Anweisung ausgeführt werden und der Wert ignoriert. Was daneben möglich wäre:
function fref1() { alert('Funktion 1'); }
function fref2() { alert('Funktion 2'); }
var JSONString = '{"funktionen": [ fref1, fref2 ] }';
var JSONObject = eval( '(' + JSONString + ')' );
JSONObject.funktionen[0]() // Funktion fref1 wird ausgeführt
JSONObject.funktionen[1]() // Funktion fref2 wird ausgeführt
Das Ganze kannst du dann noch auf die Spitze treiben:
function fref(answer) { alert('Die Antwort ist ' + answer); }
var JSONString = '{"foobar": [ 42, function() { fref(this[0]) } ] }';
var JSONObject = eval( '(' + JSONString + ')' );
JSONObject.foobar[1]();
Du wirst erstaunt sein, was da raus kommt ;)
Siechfred
Ok, damit ist meine Frage wohl beantwortet. :)
Danke für die Mühe!