子域的HTML5 localStorage大小限制


77

HTML5的localStorage数据库通常受大小限制-每个域的标准大小为5或10 MB。子域可以绕过这些限制吗(例如example.com,hack1.example.com和hack2.example.com都有自己的5 MB数据库)?标准中是否有任何内容指定父域是否可以访问其子级数据库?我什么也找不到,而且可以看到以任何一种方式执行此操作的参数,但似乎必须要有一些标准模型。


1
我现在正在使用一个程序,我们试图将所有文本完全存储在localStorage中。如果您可以添加一些链接到您找到有关当前5MB限制的信息的位置,那就太好了。这将有助于我更好地了解替代方案。谢谢
JeroenEijkhof

6
基于Webkit的浏览器使用UTF-16进行存储,其最大存储空间为2.5MB。
瑞安

8
请注意,2011年6月的RFC指出:“用户代理应防止网站在其他关联网站的起源下存储数据,例如,在a1.example.com,a2.example.com,a3.example.com等网站中存储上限,从而避免了example.com的主要存储限制。” 因此,不要指望这种黑客技术将来会继续发挥作用。(dev.w3.org/html5/webstorage
约瑟夫色

2
通过使用压缩,可以人为地“扩展”了很多限制。可以安全使用快速算法,例如我的:pieroxy.net/blog/pages/lz-string/index.html
pieroxy 2013年

已经完成了一些研究:computerworld.com/s/article/9237259/…但是,问题是,诸如com.de或org.pl之类的第二级顶级域名会如何?
Danubian Sailor 2013年

Answers:


53

来自http://dev.w3.org/html5/webstorage/#disk-space

建议每个源的最大限制为5 MB。欢迎收到实施反馈,并将在以后用于更新此建议。

它还提到:

用户代理应防止站点在其他关联站点的起源下存储数据,例如,在a1.example.com,a2.example.com,a3.example.com等中存储最大限制,从而规避了example.com的主要存储限制。


5
这并不能真正回答有关子域的问题。
约恩·泽弗勒

15
@JörnZaefferer,该规范的目的是防止使用子域。
克莱·尼科尔斯

4
有趣的是,尽管规范中有警告,但显然只有FireFox实施了建议的预防措施。参见以下项目,以有趣的方式填充磁盘/崩溃浏览器:feross.org/fill-disk
Adam Tuttle



6

更好的解决方案是使用[HTML5 IndexedDB进行离线存储。] 1

看来旧Web SQL(似乎被误命名为b / c代表离线存储)的替代品是:索引数据库,它允许离线存储并且仍然受支持:

IndexedDB是HTML5中的新增功能。Web数据库在用户的浏览器中托管和持久保存。通过允许开发人员创建具有丰富查询功能的应用程序,可以预见将出现一种具有在线和离线工作能力的新型Web应用程序 。

有关更多信息和测试应用,请访问:http : //ido-green.appspot.com/WebSQL-IndexedDB-example/jqm_indexedDB.html


目前尚无移动设备上的IndexedDB支持(iOS 7中可能即将推出)。因此,最好创建一个包装WebSQL和IndexedDB的持久性api,直到在移动caniuse.com/#search=indexeddb
oligofren

这应该是一条评论,因为它不能回答问题。
Danubian Sailor 2013年

1
实际上,我认为这可能为提出初始问题的人提供最佳建议。另外,还有一个不错的polyfill库,该库在较旧的移动浏览器的WebSQL之上实现了indexedDB。
乔恩·瓦特

2

要获得50MB的存储空间,请使用以下代码

// 1. paste this line in your code
!function(){function e(t,o){return n?void(n.transaction("s").objectStore("s").get(t).onsuccess=function(e){var t=e.target.result&&e.target.result.v||null;o(t)}):void setTimeout(function(){e(t,o)},100)}var t=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;if(!t)return void console.error("indexDB not supported");var n,o={k:"",v:""},r=t.open("d2",1);r.onsuccess=function(e){n=this.result},r.onerror=function(e){console.error("indexedDB request error"),console.log(e)},r.onupgradeneeded=function(e){n=null;var t=e.target.result.createObjectStore("s",{keyPath:"k"});t.transaction.oncomplete=function(e){n=e.target.db}},window.ldb={get:e,set:function(e,t){o.k=e,o.v=t,n.transaction("s","readwrite").objectStore("s").put(o)}}}();

// 2. Setting values
ldb.set('nameGoesHere', 'value goes here');

// 3. Getting values - callback is required because the data is being retrieved asynchronously:
ldb.get('nameGoesHere', function (value) {
  console.log('And the value is', value);
});

来源https://github.com/DVLP/localStorageDB

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.