摘要
该规范定义了一个API,用于在Web客户端中持久存储键值对数据。
本文件的状态
本节描述了本文档发布时的状态。其他文件可能取代本文件。当前W3C出版物和最新出版物的列表本技术报告的修订版本见W3C技术报告索引在网址:http://www.w3.org/TR/。
W3CWeb平台工作组创建了测试套件对于本规范和实施报告显示了Web存储候选推荐退出标准已满足。
如果您希望以某种方式提交有关此文档的错误由W3C跟踪,请通过提出GitHub问题。您也可以通过电子邮件将反馈发送给public-webapps@w3.org(订阅,档案),或whatwg@whatwg.org(档案).欢迎所有反馈。
通过发布本建议,W3C期望本建议中指定的功能不会受到以下更改的影响Web IDL随着WebIDL规范进行到推荐。
在建议审查期间,注意到DNS欺骗攻击的缓解建议(第7.1节)应该更强。因此,对该句进行了非规范性修改,以鼓励使用TLS。
W3C成员、软件开发人员、,以及其他W3C团体和相关方,并得到W3C推荐总监。它是一个稳定的文档,可以使用作为参考材料或从其他文件中引用。W3C在制造中的作用建议是提请注意规范和促进其广泛部署。这增强了功能和Web的互操作性。
本文件由一个在2004年2月5日W3C公司专利政策.W3C公司保持一个任何专利披露的公开列表与集团的可交付成果相关;该页还包括披露专利的说明。对个人认为包含的专利具有实际知识的个人基本索赔必须按照第6节W3C公司专利政策.
本文件受2015年9月1日W3C公司工艺文件.
1介绍
本节不规范。
本规范引入了两种相关机制,类似于HTTP会话cookie,用于在客户端上存储名称值对侧面。[厨师]
第一种是针对用户携带执行单个事务,但可以执行多个不同窗口中的事务。
饼干并不能很好地解决这个问题。例如,用户可以在两个不同的窗口购买机票,使用同一站点。如果站点使用cookie来跟踪哪个票据用户正在购买,然后当用户从一个页面点击到另一个页面时两个窗口,当前正在购买的票将从一个窗口到另一个窗口,可能导致用户购买两个同一航班的机票都没有特别注意。
为了解决这一问题,本规范引入了session存储
IDL属性。站点可以将数据添加到会话存储中,并且可以对其进行访问到该窗口中打开的同一站点的任何页面。
例如,一个页面可能有一个复选框,用户可以勾选该复选框表明他想要保险:
<标签><input type=“checkbox”onchange=“sessionStorage.insurance=选中?'true':''”>我想要这次旅行的保险。</label>
随后的页面可以从脚本中检查用户是否是否选中复选框:
if(sessionStorage.insurance){…}
如果用户在站点上打开了多个窗口,则每个窗口将拥有会话存储对象的单独副本。
第二种存储机制设计用于跨越多个窗口,并持续到当前会话之后。在特别是,Web应用程序可能希望存储兆字节的用户上的数据,例如整个用户编写的文档或用户的邮箱客户端的性能原因。
同样,cookie不能很好地处理这种情况,因为它们随每个请求发送。
这个本地存储
国际存托凭证属性用于访问页面的本地存储区域。
example.com上的站点可以显示次数用户通过在底部放置以下内容来加载页面第页,共页:
<p>您已查看此页面<span id=“count”>未知数量的</span>时间。</p><脚本>if(!localStorage.pageLoadCount)localStorage.pageLoadCount=0;localStorage.pageLoadCount=解析Int(localStorance.pageLoad计数)+1;document.getElementById('count').textContent=localStorage.pageLoadCount;</脚本>
每个站点都有自己的独立存储区域。
本规范中的所有图表、示例和注释均为非规范性,所有明确标记为非规范性的章节也是如此。本规范中的其他内容都是规范性的。
关键字“MUST”、“MUST NOT”、“REQUIRED”、“SHOULD”、“HOULD NOT”(不应该)、“RECOMMENDED”(建议)、“MAY”(可能)和本文件规范部分中的“可选”应为解释如RFC2119所述。为了可读性,这些单词并非出现在本规范的所有大写字母中。[RFC2119]
作为算法的一部分在命令中表达的要求(例如“去掉任何前导空格字符”或“返回false和abort these steps”)将被解释为在介绍算法。
一些一致性要求被称为属性、方法或对象。此类要求应解释为对用户代理的要求。
以算法或特定步骤表述的一致性要求可以以任何方式实现,只要最终结果是等效。(特别是,本文中定义的算法规范旨在易于遵循,而不是表现出色。)
本规范定义的唯一一致性类是用户代理人。
用户代理可以对其他不受约束的输入,例如防止拒绝服务攻击,以防止内存耗尽,或四处工作平台特定的限制。
当功能支持被禁用时(例如作为紧急情况缓解安全问题或帮助发展的措施,或出于性能原因),用户代理必须像没有对该功能的支持,就好像该功能没有本规范中提到。例如,如果功能通过Web IDL接口中的属性访问属性本身将从实现的对象中省略该接口-将属性保留在对象上,但使其返回null或引发异常是不够的。
2.1依赖关系
本规范依赖于其他几个基本规范规格。
- HTML格式
-
HTML中的许多基本概念被用于规范。[超文本标记语言]
- 网络IDL
-
本规范中的IDL块将IDL片段视为由WebIDL规范定义。【WEBIDL】
三术语
结构“a富
对象”,其中富
实际上是一个接口,有时使用,而不是更准确的“实现接口富
".
术语DOM用于指提供给脚本,并不一定意味着实际存在文件
物体或任何其他物体节点
DOM中定义的对象规范。[文件管理]
IDL属性称为得到当其值为被检索(例如通过作者脚本),称为设置为其分配新值时。
术语“JavaScript”用于指代ECMA262,而不是官方术语ECMAScript,因为术语JavaScript广为人知。【ECMA262】
4API
4.1这个保管部
接口
接口保管部{只读属性unsigned long长度;DOMString?钥匙(无符号长索引);getter DOMString?获取项目(DOMString键);设置器空隙setItem(设置项)(DOMString键,DOMString-value);删除器无效删除项目(DOMString键);空隙清楚的();};
每个保管部
对象提供对列表的访问键/值对,有时称为项。钥匙是串。任何字符串(包括空字符串)都是有效的键。值也是类似的字符串。
每个保管部
对象与列表关联创建时的键/值对,如这个session存储
和本地存储
属性。多个实现保管部
接口can都与相同的键/值对列表相关联同时。
这个长度
属性必须返回当前键/值对的数量显示在与对象关联的列表中。
这个钥匙(n个)
方法必须返回n个列表中的第个键。键的顺序是定义了用户代理,但必须在对象内保持一致因为钥匙的数量不变。(因此,添加或移除键可以更改键的顺序,但仅更改现有键的值不得。)如果n个大于或等于键/值对的数量在对象中,则此方法必须返回null。
这个支持的属性名称在上保管部
对象是每个键/值对的键当前存在于与对象关联的列表中。
这个获取项目(钥匙)
方法必须返回与关联的当前值给定的钥匙.如果给定钥匙在与关联的列表中不存在对象,则此方法必须返回null。
这个setItem(设置项)(钥匙,价值)
方法必须首先检查键/值对与给定的钥匙列表中已存在与对象关联。
如果没有,则必须将新的键/值对添加到列表,带有给定的钥匙及其值集到价值.
如果给定钥匙 做存在于列表中,其值不是等于价值,则必须将其值更新为价值.如果它以前的值是等于价值,然后方法必须什么都不做
.
如果无法设置新值,该方法必须抛出配额超出错误
例外。(如果用户禁用了站点存储,或者如果已超过配额。)
这个删除项目(钥匙)
方法必须导致键/值与给定的配对钥匙从中删除与对象关联的列表(如果存在)。如果没有包含该内容的项目键存在,方法必须什么都不做
.
这个设置项()
和删除项目()
方法必须是原子关于失败。在失败的情况下,方法什么都不做。也就是说,对数据存储区域的更改必须成功,否则数据存储区域不得在全部。
这个清除()
方法必须原子化地使与对象关联的列表清空所有键/值对(如果有)。如果有无,则该方法必须什么都不做
.
当设置项()
,删除项目()
、和清除()
方法被调用,事件向窗口
其他对象文件
可以访问新存储或删除的数据,如session存储
和本地存储
属性。
本规范不要求方法等待数据被物理写入磁盘。只有访问相同内容的不同脚本的一致性键/值对的基本列表see是必需的。
[无接口对象]接口Windows会话存储{只读属性保管部 session存储;};窗口实施Windows会话存储;
这个session存储
属性表示特定于现在的顶级浏览上下文.
每个顶层浏览上下文有一套独特的会话存储区域,每个区域一个起源.
用户代理不应使来自浏览上下文的数据过期会话存储区域,但当用户请求删除此类数据,或当UA检测到其受到限制时存储空间,或出于安全原因。用户代理应始终避免在可以访问数据的脚本正在运行。当顶级浏览上下文被破坏时(和因此用户永远无法访问)存储在它的会话存储区域可以随它一起丢弃,因为API本规范中描述的数据无法用于随后检索。
浏览上下文的生存期可能不相关到实际用户代理进程本身的生命周期,作为用户代理可能支持在重启后恢复会话。
当一个新的文件
是在中创建的浏览上下文它有一个顶级浏览上下文,用户代理必须检查是否顶级浏览上下文有一个用于该文档的会话存储区域起源。如果是,那么这就是文件
的分配会话存储区域。如果是的话不是,该文档的新存储区域起源必须创建,然后那个是文件
的指定的会话存储区域。A类文件
的已分配存储区域在文件
.
如果是iframe公司
被转移到另一个文件
,嵌套的浏览上下文将被销毁,并创建一个新的。
这个session存储
属性必须返回保管部
与关联的对象这个文件
的分配会话存储区域(如果有),如果没有,则为null。每个文件
对象必须为其提供单独的对象窗口
的session存储
属性。
当一个新的顶级浏览上下文由创建克隆现有浏览上下文,新浏览上下文必须以与最初,但从那时起必须考虑这两套分开,互不影响。
当一个新的顶级浏览上下文由创建脚本在现有的浏览上下文,或由用户在现有浏览上下文中跟踪链接,或以其他方式与特定的文件
,而创建不是会话存储的新开端,然后的会话存储区域起源的文件
必须复制创建新的浏览上下文时。然而,从那时起,两会储存区必须被视为独立的,不得以任何方式相互影响。
当设置项()
,删除项目()
、和清除()
方法在保管部
对象x个如果方法没有抛出异常或“什么都不做
“如上文所定义,那么对于每个文件
对象,其窗口
对象的session存储
属性的保管部
对象与同一存储区域关联,而不是x个,发送存储通知.
[无接口对象]接口窗口本地存储{只读属性保管部 本地存储;};窗口实施窗口本地存储;
这个本地存储
对象提供保管部
对象的起源.
用户代理必须有一组本地存储区域,每个存储区域一个起源.
用户代理应仅终止来自本地存储区域的数据出于安全原因或用户要求时。用户代理应始终避免删除数据,而脚本访问正在运行的数据。
当本地存储
属性时,用户代理必须运行以下步骤,它们被称为保管部
对象初始化步骤:
用户代理可能会引发安全性错误
异常并中止这些步骤,而不是返回保管部
对象,如果请求违反了策略决策(例如,如果用户代理配置为不允许页面持久化数据)。
如果文件
的起源不是scheme/host/port元组,然后抛出安全性错误
异常并中止这些步骤。
检查用户代理是否已分配本地存储的区域起源的文件
属于这个窗口
访问属性的对象。如果没有,请为此创建一个新的存储区域起源.
返回保管部
与之关联的对象原点的本地存储区域。每个文件
对象必须为其提供单独的对象窗口
的本地存储
属性。
当设置项()
,删除项目()
、和清除()
方法在保管部
对象x个如果方法没有抛出异常或“什么都不做
“如上文所定义,那么对于每个文件
对象,其窗口
对象的本地存储
属性的保管部
对象与同一存储区域关联,而不是x个,发送存储通知.
每当本地存储
属性的保管部
对象将被检查、返回、设置或检查时删除,无论是作为直接属性访问的一部分对于属性的存在,在属性枚举期间,当确定现有属性的数量,或作为上定义的任何方法或属性的执行保管部
界面,用户代理必须首先获得存储互斥.
4.4这个存储
事件
这个存储
事件在文件
的窗口
如前两部分所述,当存储区域更改时(用于会话存储,对于本地存储).
当用户代理要发送存储通知对于文件
,的用户代理必须将任务排队到火一可信的名称为的事件存储
,其中不冒泡且不可取消,并且使用存储事件
接口,位于这个文件
对象的窗口
对象。
这样一个文件
对象不一定完全激活,但对此类对象触发的事件被事件循环直到文件
成为完全激活再一次。
这个任务源对于这些任务DOM操作任务来源.
如果事件是由于调用设置项()
或删除项目()
方法,事件必须具有钥匙
属性初始化为相关密钥的名称,它的旧值
属性初始化为旧属性有问题的键的值,如果是新添加的键,则为nullnewValue(新值)
属性初始化为键有问题,如果键被删除,则为null。
否则,如果事件是由于调用清除()
方法,事件必须具有钥匙
,旧值
,和newValue(新值)
属性初始化为null。
此外,活动必须具有网址
属性初始化为文件的地址谁的保管部
对象受到影响;及其存储区域
属性初始化为保管部
对象窗口
目标的对象文件
代表同一种保管部
受影响的区域(即会话或本地)。
4.4.1这个存储事件
接口
[Constructor(DOMString类型,可选存储事件初始化事件InitDict)]接口存储事件:事件{只读属性DOMString?钥匙;只读属性DOMString?旧值;只读属性DOMString?newValue(新值);只读属性DOMString网址;只读属性保管部?存储区域;};词典存储事件初始化:事件初始化{DOMString?密钥;DOM字符串?旧值;DOMString?新价值;DOMString url;保管部? 存储区域;};
这个钥匙
属性必须返回它的值已初始化为。创建对象时,此属性必须初始化为null。它表示正在更改的密钥。
这个旧值
属性必须返回初始化为的值。创建对象时,必须将此属性初始化为无效的。它表示要更改的密钥的旧值。
这个newValue(新值)
属性必须返回初始化为的值。创建对象时,必须将此属性初始化为无效的。它表示正在更改的密钥的新值。
这个网址
属性必须返回它的值已初始化为。创建对象时,此属性必须初始化为空字符串。它表示密钥已更改的文档的地址。
这个存储区域
属性必须返回其初始化为的值。创建对象时,此属性必须为初始化为null。它代表保管部
受影响的对象。
4.5线程
因为使用的存储互斥体,多个浏览上下文将能够以这种方式同时访问本地存储区域该脚本无法检测任何并发脚本执行。
因此长度
属性保管部
当脚本处于执行,而不是以脚本本身可预测的方式执行。
5磁盘空间
用户代理应限制存储区域允许的总空间量,因为存在敌意否则,作者可以使用此功能耗尽用户的可用磁盘空间。
用户代理应防止在其来源的其他附属机构下存储数据的站点站点,例如,在a1.example.com、a2.example.com、a3.example.com/等中存储到最大限度,绕过example.com的主要存储限制。
当达到配额时,用户代理可能会提示用户,从而允许用户授予站点更多权限空间。这使站点能够在用户的计算机上存储许多用户创建的文档实例。
用户代理应该允许用户查看每个域使用了多少空间。
基本上任意限制为每个5 MB起源建议。实施欢迎反馈,并将用于在未来更新此建议。
为了实现可预测性,配额应该基于存储的数据的未压缩大小。
6隐私
6.1用户跟踪
第三方广告商(或任何能够将内容分发给多个站点)可以使用存储在其本地存储区域中的唯一标识符来跟踪用户多个会话,建立用户兴趣的配置文件,以实现高目标广告。与知道用户真实身份的网站(例如需要经过身份验证的凭据的电子商务网站),这可能会允许压迫性团体与纯匿名网络使用相比,以更高的准确性瞄准个人。
有许多技术可用于降低用户跟踪风险:
- 阻止第三方存储
-
用户代理可能会限制对本地存储
对象到源于顶级文档域的脚本浏览上下文例如,拒绝访问中运行的其他域中的页面的APIiframe公司
第条。
- 使存储的数据过期
-
用户代理可能以用户配置的方式自动删除存储的一段时间后的数据。
例如,可以将用户代理配置为将第三方本地存储区域视为仅会话存储,在用户关闭所有浏览上下文可以访问它。
这可能会限制网站跟踪用户的能力,因为该网站只能在用户与网站本身进行身份验证时,跨多个会话跟踪用户(例如,通过购买或登录服务)。
然而,这也降低了API作为长期存储机制的有用性。它可以如果用户没有完全理解数据的含义,也会使用户的数据面临风险到期。
- 将持久存储视为cookie
-
如果用户试图通过清除Cookie而不同时清除数据来保护其隐私存储在本地存储区中,站点可以通过使用以下两个功能来击败这些尝试相互冗余备份。用户代理应提供用于清除这些内容的接口一种帮助用户了解这种可能性并允许他们删除所有数据的方法持久存储功能。[厨师]
- 进入本地存储区域的特定现场白名单
-
用户代理可以允许站点访问中的会话存储区域无限制方式,但要求用户授权访问到本地存储区域。
- 存储数据的原始跟踪
-
用户代理可以记录起源包含导致数据存储的第三方来源的内容。
如果此信息随后用于显示当前在持久存储中的数据视图,它将允许用户对持久存储的哪些部分做出明智的决定修剪。与黑名单(“删除此数据并阻止此域存储数据”),用户可以将持久存储的使用限制在他信任的站点。
- 共享黑名单
-
用户代理可能允许用户共享其持久存储域黑名单。
这将使社区能够共同行动,保护他们的隐私。
虽然这些建议阻止了将此API用于用户跟踪的琐碎使用,但它们并没有阻止它总的来说。在单个域中,站点可以在会话期间继续跟踪用户,并且然后可以将所有这些信息与任何识别信息一起传递给第三方(姓名、信用卡号码、地址)。如果第三方与要获得多个站点的此类信息,仍然可以创建一个配置文件。
然而,即使没有用户代理的合作,用户跟踪在某种程度上也是可能的无论如何,例如,通过在URL中使用会话标识符,这是一种已经普遍使用的技术用于无害的目的,但很容易重新用于用户跟踪(甚至追溯)。这个然后可以使用访问者的IP地址和其他将特定于用户的数据(例如,用户代理头和配置设置)组合在一起会话转换为一致的用户配置文件。
6.2数据的敏感性
用户代理应将持久存储的数据视为潜在的敏感数据;很有可能用于存储电子邮件、日历预约、健康记录或其他机密文档在这个机制中。
为此,用户代理应确保在删除数据时,立即从基础存储。
7安全
7.1DNS欺骗攻击
由于DNS欺骗攻击的可能性,无法保证主机声称在某个领域真的是来自那个领域。为了缓解这种情况,建议页面使用TLS。页使用TLS可以确保只有用户、代表用户工作的软件和其他页面使用具有证书的TLS将其标识为来自同一域,可以访问其存储区域。
7.2跨方向攻击
不同作者共享一个主机名,例如用户在上托管内容geocities.com网站
,都共享一个本地存储对象。没有要限制的功能按路径名访问。因此,敦促共享主机上的作者避免使用这些功能,因为其他作者读取数据并覆盖它是很容易的。
即使提供了路径限制功能,通常的DOM脚本安全模型将使绕过此保护并从任何路径。
7.3实施风险
实施这些持久存储功能时的两个主要风险是站点从其他域读取信息,并让敌对站点写入然后从其他域中读取。
让第三方网站读取不应该从其域中读取的数据导致信息泄露例如,可以使用用户在一个域上的购物愿望列表通过另一个领域进行定向广告;或用户的以工作为目的的机密文档由文字处理网站存储的信息可以由竞争公司的网站进行检查。
让第三方站点将数据写入其他域的持久存储可能会导致信息欺骗,这同样危险。例如,恶意网站可以添加用户愿望列表中的项目;或者恶意站点可以将用户的会话标识符设置为已知ID然后,恶意站点可以用来跟踪用户在受害站点上的操作。
因此,严格遵守起源本规范中描述的型号为对用户安全很重要。
工具书类
除非标记为“非标准”,否则所有参考文件均为规范性文件。
- [厨师]
- HTTP国家管理机制,A.Barth。IETF。
- [文件管理]
- 安妮·范·凯斯特伦;阿利耶·格雷戈(Aryeh Gregor);Ms2ger;亚历克斯·罗素(Alex Russell);罗宾·伯洪(Robin Berjon)。W3C域42015年11月19日。W3C建议。网址:http://www.w3.org/TR/dom/
- 【ECMA262】
- ECMA脚本语言规范ECMA公司。
- [超文本标记语言]
- 伊恩·希克森;罗宾·伯洪(Robin Berjon);史蒂夫·福克纳;特拉维斯·利希德(Travis Leithead);埃里卡·多伊尔·纳瓦拉;特蕾莎·奥康纳;西尔维娅·菲佛。HTML52014年10月28日。W3C建议。网址:http://www.w3.org/TR/html5/
- [RFC2119]
- 用于的关键字RFC以指示需求级别S.Bradner著。IETF。
- 【WEBIDL】
- 卡梅隆·麦科马克(Cameron McCormack);鲍里斯·兹巴斯基(Boris Zbarsky);伊夫·拉丰;特拉维斯·莱西亚德。WebIDL级别12016年3月8日W3C候选人推荐。网址:http://www.w3.org/TR/WebIDL-1/
致谢
有关确认的完整列表,请参阅HTML规范。[超文本标记语言]