Die Sicherheit in internationalen Netzen fordern eine hohe Sicherheit bei Browsern.
Um das ansonsten Status-lose (stateless) HTTP-Verfahren zu erweitern
werden bei Webanwendungen häufig website-bezogene Userdaten verwendet (z.B. Session-IDs, $_COOKIE, ca. 4 kB je Seite).
Moderne RIA benötigen mehr "sichere-permanente-userdaten".
Hierzu gibt es bei modernen Browsern (ab HTML 5) das nativ localStorage
-Objekt, das ca. 5 MB je Seite ermöglicht.
localStorage ist auch bekannt als Offline Storage, Web Storage. Siehe z.B.
w3.org: Webstorage ( 2016 )
|
owasp.org
HTML5 Security Cheat Sheet
|
WebStorageTest csh.rit.edu
WebStorageTest
|
people.w3.org
localstorage
.
ECMAScript wird interpretiert. Deshalb kann (z.B. mit eval()
)
aus einem String eine aufrufbare Funktion erzeugt werden.
Um das verfügbare JSON-Objekt nutzen zu können,
wird nachfolgende new Function(...)
verwendet.
Hier ist ein Test für die dynamische Erzeugung von func(x,y,z) aus obj: teste
Moderne RIA benötigen sichere "permanente-userdaten".
Hierzu gibt es bei modernen Browsern (ab HTML 5) das nativ localStorage
-Objekt,
das ca. 5 MB je Seite ermöglicht.
Für
Web Storage
( localStorage ) wird das "same-origin restriction"-Prinzip verwendet
(nur die Seite, die speichert, darf diese eigenen Daten zugreifen).
"localStorage sets fields on the domain.
Even when you close the browser, reopen it,
and go back to the site, it remembers all fields in localStorage."
Das localStorage-Objekt wurde mit HTML5 eingeführt und ist bei den modernen Browsern (Firefox 3.5+, Safari 4+, Internet Explorer 8, Google Chrome 4+, Opera10+, en.wikipedia: HTML5 Comparison of layout engines ) verfügbar ( siehe z.B. en.wikipedia: Web_Storage | w3.org: html5 Overview | w3.org: Structured client-side storage | w3.org: Webstorage ( 2016 ) | whatwg: web-apps/current-work ).
Für eine browserübergreifende Anpassung (Cross-Browser Kompatibiltät) muß (2010) lediglich für den IE-Browser das localStorage-Objekt nachgebildet werden (siehe msdn VS.85%29.aspx ).
var len = localStorage.length; // Enthält die Anzahl der gespeicherten Elemente localStorage.key(n); // Gibt den Namen des n-ten Keys zurück. localStorage.getItem(key); // Liefert den Wert zum Schlüssel key localStorage.setItem(key,data);// Legt den Wert value unter dem Schlüssel key ab localStorage.removeItem(key); // Löscht den Wert zum Schlüssel key localStorage.clear(); // Löscht alle gespeicherten Daten
localStorage wird auch "DOM Storage" genannt und kann in Verbindung mit JSON (JavaScript Object Notation) verwendet werden. JSON ist ein schlankes Datenaustauschformat, das für Menschen einfach zu lesen und zu schreiben und für Maschinen einfach zu parsen und zu generieren ist (siehe JSON (de) )
localStorage und JSON
function supports_html5_storage() { return ('localStorage' in window) && window['localStorage'] !== null; } localStorage.setItem(key, JSON.stringify(value)); var value = JSON.parse(localStorage.getItem(key));
Hier ist ein Test für die dynamische Erzeugung von func(x,y,z)
aus einem clientseitig-permanent gespeicherten obj-String:
teste
Die Funktionen set_local_item(key, val); get_local_item(key); del_local_item(key); del_clear(); get_local_size() verwenden das Objekt window.localStorage. Ist kein window.localStorage vorhanden, so wird als fallback var loc_obj = {}; verwendet
var loc_obj = {}, // global, für fallback local_length = 0; function has_local_storage() { var r = 0; try { if ("localStorage" in window && typeof (window.localStorage) === 'object') { r = 1; } } catch (e) { r = 0; } return r; } function set_local_item(key, val) { if (has_local_storage()) { localStorage.setItem(key, JSON.stringify(val)); } else { loc_obj[key] = JSON.stringify(val); } } function get_local_item(key) { var o = null; if (has_local_storage()) { try { o = JSON.parse(localStorage.getItem(key)); } catch (ee) { show("ERR: get_local_item" + ee); set_local_item(key, {}); o = get_local_item(key); } } else { o = JSON.parse(loc_obj[key]); if (!o) { loc_obj[key] = {}; o = {}; } } return o; } function del_local_item(key) { if (has_local_storage()) { localStorage.removeItem(key); } else { loc_obj["key"] = null; } } function del_clear() { if (has_local_storage()) { localStorage.clear(); } else { loc_obj = { }; } } function get_local_length() { var r = 0; if (has_local_storage()) { r = localStorage.length; } return r; } function get_local_size() { var o, k, keys, len = 0; // genähert als anz stringify-Zeichen if (has_local_storage()) { o = localStorage; } else { o = loc_obj; } keys = Object.keys(o); for (k = 0; k < keys.length; k += 1) { len += o[keys[k]].length; } return len; }
Teste: set_local_item("item0", { s0: "hallo", n0: 4711 }); set_local_item("item1", { o1: { s1: "hallo", n1: 4711 } }); has_local_storage() get_local_item("item0").s0+" "+get_local_item("item0").n0 get_local_item("item1").o1.s1+" "+get_local_item("item1").o1.n1 get_local_size() grob etwa