Deși JSON este destinat exclusiv ca un format serializare a datelor, designul său ca un subset non-strict al limbajului de scripting JavaScript ridică mai multe probleme de securitate. Aceste probleme se centrează pe utilizarea unui interpretor JavaScript pentru a executa textul JSON dinamic ca JavaScript încorporat. Acest lucru expune un program la scripturi maliţioase. Aceasta este o problemă serioasă în cazul datelor preluate de pe Internet. Această tehnică simplă și populară, dar riscantă, exploatează compatibilitatea JSON cu funcția JavaScript eval (), descrisă mai jos.
JavaScript eval ()
Deoarece cea mai mare parte a textului formatat JSON este, de asemenea, cod sintactic legal JavaScript, un mod seducător ușor pentru un program de JavaScript pentru a analiza datele formatate JSON este de a utiliza funcția inclusă de activare a JavaScript eval (), care a fost concepută pentru a evalua expresii JavaScript. Mai degrabă decât folosind un parser JSON specific, interpretorul JavaScript în sine este utilizat pentru a executa datele JSON producătoare de obiecte native JavaScript. Această tehnică este foarte riscantă, cu toate acestea, în cazul în care nu există vreo posibilitate ca datele JSON să conțină cod JavaScript arbitrar, care ar fi apoi executat, de asemenea.
Dacă nu se iau măsuri de precauție pentru a valida datele în primul rând, tehnica eval este supusă vulnerabilității de securitate în cazul în care datele și întregul mediu de activare a JavaScript nu sunt sub controlul unei singure surse de încredere. De exemplu, în cazul în care datele în sine nu sunt de încredere, sunt posibile atacuri malware JavaScript cu injectare de cod. Astfel de pierderi ale încrederii, de asemenea, pot crea vulnerabilități pentru furtul de date, fals de autentificare, și alte abuzuri potențiale de date și resurse.
Ca o soluție, o expresie regulată poate fi folosită pentru a valida parțial datele înainte de invocarea eval ().RFC care definește JSON (RFC 4627) propune utilizarea codului de mai jos pentru a valida JSON înainte de a-l evalua (variabila „text” este intrarea JSON):
var my_JSON_object = !(/[^,:{}[]0-9.-+Eaeflnr-u nrt]/.test( text.replace(/”(\.|[^”\])*”/g, ”))) && eval(‘(‘ + text + ‘)’);O nouă funcție, JSON.parse (), a fost astfel dezvoltată ca o alternativă mai sigură pentru eval. Aceasta este destinată în mod special prelucrării datelor JSON și nu JavaScript. Aceasta a fost inițial planificată pentru a fi inclusă în a patra editie a standardului ECMAScript, dar acest lucru nu a avut loc. Aceasta a fost adăugată mai întâi la a cincea ediție, și este acum susținută de browsere importante. Pentru browserele mai vechi, o bibliotecă JavaScript compatibilă este disponibilă la JSON.org.
O problemă suplimentară atunci când se analizează JSON folosind funcţia eval (), este că există unele caractere Unicode care sunt valabile în șiruri JSON, dar invalide în JavaScript, deci pot fi necesare secvenţe escape suplimentare în unele cazuri.
Codarea și decodarea native în browsere
Browsere Web recente au acum, sau au în lucru, codarea/decodarea JSON nativă. Nu numai că acest lucru elimină problema de securitate de mai sus cu eval (), dar poate crește, de asemenea, performanța, în comparație cu bibliotecile JavaScript utilizate în mod obișnuit înainte. Din iunie 2009, următoarele browsere au sau vor avea suport nativ JSON, prin JSON.parse () și JSON.stringify ():
-
Mozilla Firefox 3.5+
-
Microsoft Internet Explorer 8 +
-
Opera 10.5+
-
Browsere bazate pe WebKit (Apple Safari)
-
Browsere bazate pe Blink (de exemplu, Google Chrome, Opera)
Cel puțin cinci biblioteci populare JavaScript s-au angajat să utilizeze JSON nativ, dacă sunt disponibile:
-
YUI Library
-
Prototype
-
jQuery
-
Dojo Toolkit
-
MooTools
Codarea implicită a caracterelor pentru JSON este UTF-8; ea suportă de asemenea UTF-16 şi UTF-32.
Referințe de obiecte
Standardul JSON nu suportă referinţe de obiecte, dar Dojo Toolkit ilustrează modul în care convențiile pot fi adoptate pentru a suporta astfel de referințe, folosind standardul JSON. Mai exact, modulul dojox.json.ref oferă suport pentru mai multe forme de referinţă, inclusiv circular, multiplu, inter-mesaj, și referențiere lentă. De asemenea, există soluții non-standard, cum ar fi utilizarea Mozilla JavaScript Sharp Variables, deși această funcționalitate a fost eliminată in versiunea Firefox 12.
Lasă un răspuns