Marc: json

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...

  1. 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

    --
    Ich bin strenggenommen auch nur interessierter Laie. (molily)
    1. 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?

      1. 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

        --
        Ich bin strenggenommen auch nur interessierter Laie. (molily)
        1. Ok, damit ist meine Frage wohl beantwortet. :)

          Danke für die Mühe!