admin 管理员组

文章数量: 1184232


2023年12月21日发(作者:ps4接口类型)

目录

1. 1简介

2. 2一致性要求

1. 2.1依存关系

3. 3术语

4. 4,API

1. 4.1数据库

2. 4.2分析和处理SQL语句

3. 4.3异步数据库API

1. 4.3.1执行SQL语句

2. 4.3.2处理模型

4. 4.4同步数据库API

1. 4.4.1执行SQL语句

5. 4.5数据库查询结果

6. 4.6错误和异常

5. 5的Web SQL

6. 6磁盘空间

7. 7隐私

1. 7.1用户跟踪

2. 7.2灵敏度数据

8. 8安全

1. 8.1

DNS欺骗攻击

2. 8.2跨目录攻击

3. 8.3实施风险

4. 8.4

SQL和用户代理

5. 8.5

SQL注入

9.

参考文献

1简介

这部分是不规范的。

本规范引入了一组API来处理客户端的数据库采用SQL。

API是异步的,所以作者有可能找到非常有用的,在使用此API匿名函数(lambda表达式)。

下面是一个例子使用这个API的脚本。首先,的一个函数

prepareDatabase()被定义。此函数返回一个句柄到数据库中,第一次创建数据库,如果有必要。然后,该示例调用函数做实际的工作,在这种情况下showDocCount()

准备好了,:功能prepareDatabase(错误){

返回的OpenDatabase('文件','1 .0',“离线文档存储”,5 * 1024

* 1024,功能(DB){

Version('','1 .0',函数(T){

eSql(“的CREATE TABLE docids(ID,名称)”);

,错误);

});

}

功能showDocCount(分贝,跨度){

ansaction((T){

eSql(“SELECT COUNT(*)AS C的docids”,[],功能(T,R){

ntent = [0]。C;

,函数(T,E){

/ /无法读取数据库

ntent ='(未知的:'+ e +')';

});

});

}

prepareDatabase(功能(DB){

/ /得到数据库

跨度=的mentById('文件数');

showDocCount(分贝,跨度);

},功能(E)

/ /错误获取数据库

警报(e);

});

的ExecuteSQL()方法有一个参数,允许变量代入报表,而不用担心SQL注入漏洞:

ansaction((T){

eSql(“SELECT FROM文档标题,作者WHERE ID =?”,[ID],函数(T,数据){

报告( [0]。标题, [0]。作者);

});

});

有时,可能会对有任意数量的变量来代替英寸,即使在这些情况下,正确的解决方案是构造查询只使用“?” 字符,然后作为第二个参数传递的变量:

功能findDocs(DB,resultCallback)

Q =“”;

对于每个(VAR我的标签)

Q + =(Q ==“”?“:”,“)+”?“;

ansaction((T){

eSql(“SELECT ID FROM文档标签IN('+ Q +')'的标签,功能(T,数据){

resultCallback(数据);

});

});

}

2一致性要求

在本说明书中的所有图表,例子和注意事项,非规范性,是所有部分明确标明不规范。在本规范中的一切是标准化的。

中的关键字“MUST”,“MUST NOT”,“REQUIRED”, “ 应该”,“不应该”,“推荐”,“MAY”,和“OPTIONAL”在本文档的规范性的描述进行解释在RFC2119。为了提高可读性,这些话不会出现在本规范中的所有大写字母[RFC2119]

措辞必须的算法(如“带任何前导空格字符”或“返回false,中止了这些步骤”)的要求来解释的含义的关键词(“必须”,“应该”,“可能“等)中介绍的算法。

一些符合要求的措辞要求的属性,方法或对象。这样的要求是被解释为对用户代理的要求。

算法的具体步骤,这样表述的一致性要求可以实现以任何方式,只要最终的结果是相等的。(特别是,在本说明书中定义的算法的目的是容易遵循,和不打算成为高性能的。)

只有符合本规范所定义的类是用户代理。

用户代理可以对执行特定的限制否则不受约束的输入,例如防止拒绝服务攻击,防范运行内存不足,或解决特定于平台的限制。

支持的功能将被禁用(例如,作为应急措施,以减轻安全问题,或协助开发,或出于性能方面的考虑)时,用户代理必须采取行动,如果他们有任何不支持的功能,如果在本规范中没有提到的功能。例如,如果一个特定的功能是通过访问一个Web IDL接口中的属性,该属性本身将被省略从实现该接口的对象 - 离开的属性的对象,但它返回null或抛出一个异常,是不够的。

2.1依存关系

本规范依赖于其他几个基本规格。

HTML

[HTML] HTML使用本规范的许多基本概念。

WebIDL

在本说明书中使用的IDL块的语义的WebIDL说明书[WEBIDL]。

3术语

建设“一富的对象“,其中

富实际上是一个接口,有时用来代替更准确的“对象实现该接口的富 “。

DOM是用来指的API集提供Web应用程序中的脚本,并不一定意味着存在一个实际的文件对象或任何其他的

节点对象,在DOM核心规范定义的。[DOMCORE]

被说成是一个IDL属性时,其值被检索(如笔者脚本),被说成是

设置新值时,分配给它。

使用的术语“JavaScript”的参阅ECMA262,而不是正式的术语的ECMAScript,因为术语的JavaScript是更广为人知。[ECMA262]

4,API

4.1数据库

起源都有一组相关的数据库。每个数据库都有一个名称和当前的版本。有没有办法来枚举或删除的数据库可以从这个API的起源。

每个数据库都有一个版本的时间,不能存在于多个版本在一个数据库中。版本的目的是让作者增量式管理架构的变化和非破坏性的,并没有试图写一个数据库,不正确的假设的旧代码(例如,在另一个浏览器窗口)中运行的风险。

[补充,NoInterfaceObject]

接口WindowDatabase 数据库 的OpenDatabase(名称为DOMString,为DOMString版本,在DOMString的displayName,无符号长estimatedSize,可选DatabaseCallback creationCallback 中);

};

窗口实现WindowDatabase ;

[补充,NoInterfaceObject]

接口WorkerUtilsDatabase {

数据库 的OpenDatabase(名称为DOMString,为DOMString版本,在DOMString的displayName,无符号长estimatedSize,可选DatabaseCallback creationCallback 中);

DatabaseSync openDatabaseSync(为DOMString名,为DOMString版本,DOMString显示名称,无符号长estimatedSize的的,的可选DatabaseCallback creationCallback);

};

WorkerUtils的实现WorkerUtilsDatabase ;

[回调= FunctionOnly,NoInterfaceObject]

接口DatabaseCallback {

无效的handleEvent(数据库数据库);

};

openDatabase()方法上的的窗口和WorkerUtils接口和的openDatabaseSync() 方法的WorkerUtils接口采用下列参数:一个数据库名,数据库版本,显示名称,估计的大小- (以字节为单位) -的数据,将被存储在数据库中,和任选的一个回调函数被调用,如果尚未创建数据库。的回调,如果提供的,目的是用来调用changeVersion() ;空字符串作为其版本无论给定的数据库版本的数据库调用的回调函数。如果没有提供回调,在数据库中创建一个给定的数据库版本版本。

这些方法被调用时,必须执行以下步骤,所有原子运行的最后两个步骤:

1. 如果请求违反政策的决定(例如,如果用户代理被配置为允许网页打开数据库),用户代理可能会引发SECURITY_ERR异常,而不是返回一个数据库对象。

2. 在窗口对象的方法:让起源是原产地的 活动文档的浏览上下文 的窗口对象的方法被调用。

的WorkerUtils对象上的方法:让

起源的起源工人中的脚本。

3. 如果原产地是不是计划/主机/端口的元组,然后抛出一个SECURITY_ERR异常,并中止这些步骤。

4. 如果所提供的数据库版本是不是空字符串,并且已经有一个数据库,从源头起源与给定的名称 ,但数据库提供的版本相比,有不同的版本,然后抛出一个

INVALID_STATE_ERR异常并中止这些步骤。

5. 如果没有数据库具有给定名称的由来起源存在,则创建数据库和

创建是真实的。如果一个回调,然后传递给方法的新数据库的版本设置为空字符串。否则,设置新的数据库的版本给定的数据库版本。

否则,如果给定的名称的数据库已经存在,我们创建的是假的。

6.

openDatabase() 方法:让结果是一个新建成的

数据库对象,表示给定的数据库名称的由来起源的数据库。

对于openDatabaseSync()方法:让结果是一个新建成的

DatabaseSync对象,表示给定的数据库名称的由来起源的数据库。

7. 如果创建的是假的,或者如果没有回调传递给方法的,请跳过此步骤。否则:

openDatabase() 方法:队列的任务的结果作为其唯一的参数调用的回调 。

openDatabaseSync()方法调用回调函数作为其唯一的参数结果。如果回调抛出一个异常,重新抛出该异常并中止这些步骤。

8. 返回的结果。

所有字符串,包括空串是有效的数据库名称。数据库名称必须在区分大小写的方式进行比较 。

实现可以支持的环境中只支持一个子集的所有字符串作为数据库名映射的数据库名称(例如,使用散列算法),支持的组名称。

,打开数据库的版本是预期的版本,这数据库或DatabaseSync的对象。它可以是空字符串,在这种情况下,没有预期的版本-任何版本是正常的。

用户代理使用的显示名称和估计的数据库大小,以优化用户体验。例如,一个用户代理可以使用的估计大小向用户建议的初始配额。这可以知道,它会尝试使用数以兆字节为单位申报前期,而不是提示用户的许可,以增加配额每5兆字节的用户代理的网站。

4.2分析和处理SQL语句

当用户代理是一个SQL语句

的SQLStatement提供了一系列的参数参数进行预处理,它必须执行以下步骤:

1. 解析为一个SQL语句的SQLStatement,除U +003 F问号字符(?)可以用在地方的SQL文本在声明中[SQL]

2. 绑定与相同位置的参数数组中的参数值的占位符。(所以第一个吗?占位符被绑定的参数 数组中的第一个值,和一般的Ñ个占位符被绑定的参数 数组中的Ñ个值)。

绑定?占位符的文字,而不是字符串连接,所以这提供了一种动态一份声明中没有插入参数的SQL注入攻击的风险。

其结果是语句。

3. 如果的SqlTransaction或SQLTransactionSync 对象的创建的数据库对象, 有一个的预期版本 ,既不是空字符串,也不是实际的数据库版本,然后将其标记的声明是假的。(错误代码2)。

4. 否则,如果语法的SQLStatement是无效的(除了使用 字符文字的地方),或语句使用不支持的功能(例如,由于安全方面的原因),或在参数中的项目数数组是不相等的数量在声明中的占位符,或其他一些原因不能被解析的语句,然后将其标记的声明是假的。(错误代码5)。

支持(用户代理必须考虑语句使用BEGIN,COMMIT,ROLLBACK SQL功能,因此将它们标记为假),所以不能让这些语句影响的显式事务管理的数据库API本身。

5. 否则,如果模式被用来创建

的SqlTransaction或SQLTransactionSync 对象的语句的主要动词是只读的,但可以修改数据库,马克的声明是伪造的。(错误代码5)。

只有语句的主要动词(例如UPDATE,SELECT,DROP)被认为是在这里。因此,这样的语句“

UPDATE测试集ID = 0 WHERE 0 = 1 “将被视为有可能修改数据库这一步的目的,即使它实际上不可能有任何副作用。

6. 返回的语句。

用户代理必须采取行动,如果数据库被托管在一个没有资源的完全是空的环境。例如,试图读取或写入的文件系统会失败。

本规范的未来版本可能会需要更详细精确定义的SQL子集。

4.3异步数据库API

接口数据库 {

的无效交易(在SQLTransactionCallback回调,在的可选SQLTransactionErrorCallback errorCallback,在可选SQLVoidCallback successCallback的);

的无效readTransaction(在SQLTransactionCallback回调,在可选SQLTransactionErrorCallback errorCallback,可选SQLVoidCallback successCallback);

只读属性为DOMString 版本 ;

的的无效changeVersion(DOMString oldVersion,为DOMString动态网页,在可选的的SQLTransactionCallback回调,在可选SQLTransactionErrorCallback errorCallback,在可选SQLVoidCallback successCallback的);

};

[回调= FunctionOnly,NoInterfaceObject]

接口SQLVoidCallback {

无效的handleEvent();

};

[回调= FunctionOnly,NoInterfaceObject]

接口SQLTransactionCallback {

无效的handleEvent(中的SqlTransaction交易);

};

[回调= FunctionOnly,NoInterfaceObject]

接口SQLTransactionErrorCallback {

无效的handleEvent(在SQLERROR错误);

};

交易() 和readTransaction() 方法需要一到三个参数。这些方法被调用时,必须立即返回,然后异步运行的的交易步骤与交易回调函数的第一个参数,第二个参数的错误回调,如果有的话,成功回调的第三个参数,如果有的话,并没有预检操作或飞行后操作。

交易()方法时, 必须进行读/写。的readTransaction() 方法,模式必须是只读的。

在得到的版本属性必须返回当前版本的数据库(而不是

预期的版本的数据库对象)。

changeVersion() 方法允许脚本以原子方式验证版本号,并改变它在相同的时间做更新模式。当方法被调用时,它必须立即返回,然后异步运行的交易步骤的交易回调的第三个参数,的错误回调 的第四个参数,成功回调第五个参数,预检操作以下内容:

1. 检查的changeVersion()方法的第一个参数的值完全匹配的数据库的实际版本。如果没有,那么预检操作失败。

...

飞行后的操作是以下内容:

1. 更改数据库的实际版本的changeVersion() 方法的第二个参数的值。

2. 更改数据库对象的预期的版本的changeVersion() 方法的第二个参数的值。

和读/写模式。

任何可选参数都省略了,那么他们必须被视为他们都为空。

4.3.1执行SQL语句

交易()中,

readTransaction()

,和changeVersion() 方法调用回调的SqlTransaction 对象。

的typedef的顺序为 ObjectArray ;

接口的SqlTransaction {

的无效EXECUTESQL(为DOMString的SQLStatement,在的可选ObjectArray参数,在可选的SQLStatementCallback回调,在可选SQLStatementErrorCallback errorCallback的);

};

[回调= FunctionOnly,NoInterfaceObject]

接口SQLStatementCallback {

无效的handleEvent(中的SqlTransaction交易,在SQLResultSet结果);

};

[回调= FunctionOnly,NoInterfaceObject]

接口SQLStatementErrorCallback {

布尔的handleEvent(的SqlTransaction成交,SQLError的错误);

};

时的SQLStatement,参数,回调,errorCallback的ExecuteSQL( )方法被调用时,用户代理必须运行下面的算法。(该算法是比较简单的,因为它不实际执行任何SQL -

交易步骤的一部分实际上是做大量的工作 。)

1. 如果该方法没有被引用在执行的

SQLTransactionCallback,

SQLStatementCallback,或

SQLStatementErrorCallback,提高一个

INVALID_STATE_ERR例外。(呼叫从一个SQLTransactionErrorCallback内部 从而引发异常。SQLTransactionErrorCallback处理程序只调用一次失败的交易,任何SQL语句可以被添加到一个失败的交易。)

2.

预处理的SQL语句的方法(的SQLStatement)作为第一个参数,第二个参数的参数数组的方法,获得的声明。

如果省略了第二个参数,则返回null,然后把参数数组为空。

3. 排队在交易中的语句,语句的结果集回调和错误回调的第四个参数(如果有的话)的第三个参数(如果有的话)。

4.3.2处理模型

的事务步骤如下。这些步骤必须以异步方式运行。这些步骤被调用事务回调,可选的错误回调,可选的

成功回调,任选一个预检操作操作可选的飞行后,一个模式 ,无论是读/写或只读。

1. 打开一个新的SQL事务数据库,并创建一个

使用SqlTransaction对象,表示该交易。如果模式是读/写,该交易必须在整个数据库中有一个排他写锁。如果

模式是只读的,该交易必须在整个数据库中有一个共享读锁。用户代理应该等待一个合适的锁是可用的。

2. 如果有错误发生在开幕式的交易(例如,如果用户代理未能获得相应的锁定适当的延迟后),跳转到的最后一步。

3. 如果这种情况下,交易步骤被定义为一个预检操作,运行。如果失败,则跳转到最后一步。(这基本上是一个钩的changeVersion() 方法)。

4. 如果交易回调不为null,与上述的SqlTransaction对象作为其唯一的参数调用事务回调,并等待该任务运行队列的任务。

5. 如果回调引发了一个异常,跳到最后一步。

6. 虽然有在交易中的任何陈述排队,请执行以下步骤,每个排队的声明,在交易中,最古老的第一。每一个的声明一份声明中,任选一个结果集回调,和一个可选的错误回调。

1. 如果该语句被标记为假,则跳转到“错误”以下步骤。

2. 执行该语句的背景下的交易

[SQL]。

3. 如果语句失败,跳转到“错误”以下步骤。

4. 创建一个SQLResultSet的对象表示结果的声明。

5. 如果语句有一个不为空,队列的任务的SqlTransaction对象作为其第一个参数的的新SQLResultSet的对象作为第二个参数调用它 ,并等待该任务运行的结果集的回调。

6. 如果回调函数被调用,并且提出了一个例外,跳转到的所有步骤中的最后一步。

7. 移动到下一个语句,如果有的话,,或整体步骤,否则到下一个。

的错误的情况下(或更具体地说,如果上述子步骤说跳转到“在发生错误的情况下”的步骤),执行以下子步骤:

8. 如果该语句都有一个相关的错误回调不为空,然后一个任务队列的SqlTransaction对象和新建造的SQLError的对

象,它代表的错误,导致这些子步运行的两个参数,分别调用错误回调,等待运行的任务。

9. 如果错误回调返回false,然后移动到下一个语句,如果有的话,到下一个整体的一步,否则。

10. 否则,错误回调没有返回false,或者有没有错误回调。跳转到的所有步骤中的最后一步。

7. 如果这种情况下,交易步骤操作被定义为一个飞行后,然后作为一个原子操作,提交事务,如果成功时,执行飞行后的操作。如果提交失败,而不是跳转到最后一步。(这基本上是一个钩的changeVersion() 方法)。

否则提交事务。如果有错误发生在提交的交易,跳转到的最后一步。

8. 一个任务队列调用成功回调,如果它不为空。

9. 到底这些步骤。下一步是只用了出问题的时候。

10. 一个任务队列调用事务的

错误回调,如果它不为null,与新建成的

SQLError的对象,它表示在这笔交易中已发生的最后一个错误。回滚事务。在交易中的任何仍然悬而未决陈述被丢弃。

这些任务的任务源是源数据库访问的任务。

4.4同步数据库API

接口DatabaseSync {

无效交易(在SQLTransactionSyncCallback回调);

的无效readTransaction(在SQLTransactionSyncCallback回调);

只读属性为DOMString 版本 ;

的的无效changeVersion(在DOMString oldVersion,为DOMString动态网页,在可选的SQLTransactionSyncCallback回调);

};

[回调= FunctionOnly,NoInterfaceObject]

接口SQLTransactionSyncCallback {

无效的handleEvent(在SQLTransactionSync交易);

};

交易() 和readTransaction() 方法必须执行以下步骤:

1. 如果交易()方法,该方法是,

创建一个SQLTransactionSync对象的读/写事务。一个只读事务否则,创建

SQLTransactionSync的对象。在这两种情况下,如果抛出一个异常,然后重新抛出它,中止这些步骤。否则,让,交易是新创建

SQLTransactionSync对象。

2. 如果第一个参数是null,回滚事务,抛出的SQLException异常,并中止这些步骤。(错误代码0)。

3. 调用回调函数的第一个参数,作为其唯一的参数传递给它的交易对象。

4. 标记陈旧的SQLTransactionSync对象。

5. 如果回调是一个异常终止,然后回滚事务,重新抛出异常,并中止这些步骤。

6. 提交事务。

7. 如果发生错误,在提交的事务,回滚事务,抛出的SQLException 异常,并中止这些步骤。

在得到的版本 属性必须返回当前版本的数据库(而不是预期的版本的DatabaseSync对象)。

changeVersion() 方法允许脚本以原子方式验证版本号,并改变它在相同的时间做更新模式。当方法被调用时,它必须执行以下步骤:

1.

创建一个SQLTransactionSync对象 的读/写事务。如果抛出一个异常,然后重新抛出它,中止这些步骤。否则,让,交易是新创建

SQLTransactionSync对象。

2. 检查的changeVersion() 方法的第一个参数的值完全匹配的数据库的实际版本。如果没有,那么抛出的SQLException异常,并中止这些步骤。(错误代码2)。

3. 如果第三个参数不为NULL,调用回调函数的第三个参数,作为其唯一的参数传递给它的交易对象。

4. 标记陈旧的SQLTransactionSync对象。

5. 如果回调是一个异常终止,则回滚该事务,重新抛出异常,并中止这些步骤。

6. 提交事务。

7. 如果发生错误,在提交的事务,回滚事务,抛出的SQLException 异常,并中止这些步骤。

8. 更改数据库的实际版本的changeVersion() 方法的第二个参数的值。

9. 更改数据库对象的预期的版本的changeVersion() 方法的第二个参数的值。

当用户代理,以创建一个

SQLTransactionSync的对象的交易,无论是读/写或只读的,它必须执行以下步骤:

1. 打开一个新的SQL事务数据库,并表示该交易创建一个

SQLTransactionSync的对象。如果模式是读/写,该交易必须在整个数据库中有一个排他写锁。如果

模式是只读的,该交易必须在整个数据库中有一个共享读锁。用户代理应该等待一个合适的锁是可用的。

2. 如果有错误发生在开幕式的交易(例如,如果用户代理未能获得相应的锁定适当的延迟后),抛出的SQLException异常,并中止这些步骤。

3. 返回新创建SQLTransactionSync的 对象。

4.4.1执行SQL语句

交易()中,readTransaction()

,和changeVersion() 方法调用回调,通过

SQLTransactionSync对象。

/ /的typedef序列为 ObjectArray的 ;

接口SQLTransactionSync {

SQLResultSet 的ExecuteSQL(为DOMString的SQLStatement,在可选的ObjectArray参数);

};

一个SQLTransactionSync对象最初是新鲜的,但它会被标记为过时的, 一旦它已被提交或回滚。

的SQLStatement,参数的ExecuteSQL( )方法被调用时,用户代理必须运行下面的算法:

1. 如果SQLTransactionSync对象是陈旧的,然后抛出一个INVALID_STATE_ERR 例外。

2.

预处理的SQL语句的方法(的SQLStatement)作为第一个参数,第二个参数的参数数组的方法,获得的声明。

如果省略了第二个参数,则返回null,然后把参数数组为空。

3. 如果该语句被标记为假,抛出

的SQLException异常。

4. 执行该语句的背景下的交易

[SQL]。

5. 如果语句失败,抛出的SQLException 异常。

6. 创建一个SQLResultSet的对象表示结果的声明。

7. 返回新创建SQLResultSet 对象。

4.5数据库查询结果

的ExecuteSQL() 方法调用的回调与一个SQLResultSet的对象作为参数传递。

接口SQLResultSet {

ReadOnly属性,长insertId ;

ReadOnly属性,长rowsAffected ;

只读属性SQLResultSetRowList的 行 ;

};

insertId 属性必须返回的行的SQLResultSet对象的SQL语句插入到数据库中,如果语句插入行的行ID 。如果该语句插入多行,最后一排的ID必须是一个返回。如果该语句没有插入行,那么该属性必须,而不是引发INVALID_ACCESS_ERR异常。

rowsAffected 属性必须返回的行数发生了变化的SQL语句。如果该语句没有影响任何行,则该属性必须返回零。“SELECT”语句,返回零(查询数据库,不影响任何行)。

的行 属性必须返回一个SQLResultSetRowList的 代表,在返回的顺序由数据库返回的行。必须每次返回相同的对象。如果没有返回行,则该对象将是空的(它的长度将是零)。

接口SQLResultSetRowList {

只读属性无符号长长度 ;

吸气任何 项目(无符号长指标);

};

对于异步API,实现,鼓励预取的数据

SQLResultSetRowList对象,构造对象时(结果集的前面回调被调用),而不是按需,为更好的响应。在同步API,鼓励而不是需求懒评价的实施策略,以获得更好的性能。

SQLResultSetRowList对象有一个长度 属性必须返回数行,它代表(由数据库返回的行数)。这是一个长度。

取回的长度可能是昂贵的,因此,作者的鼓励,以避免使用它(或枚举的对象,这隐含地使用它)在可能的情况下。

对象的支持的属性指标的数字是零长度 -1的范围内,除非长度是零,在这种情况下,有没有支持的属性索引。

项目(指数)属性必须返回给定的索引索引的行。如果没有这样的行,则该方法必须返回null。

每行必须由一个本地有序字典数据类型。在JavaScript绑定,这必须是对象。每一个行对象必须有一个属性(或字典条目),每列,在这些数据库返回的列的顺序列举的这些属性。每个属性的名称必须列和单元格的值,因为它们是由数据库返回的。

4.6错误和异常

报告说,使用异步的数据库API中的错误回调,有一个SQLError的对象,他们的论据之一。

接口SQLERROR {

常量无符号短UNKNOWN_ERR的 = 0;

常量无符号短DATABASE_ERR的 = 1;

常量无符号短VERSION_ERR的 = 2;

常量无符号短TOO_LARGE_ERR的 = 3;

常量无符号短QUOTA_ERR的 4;

const的无符号短SYNTAX_ERR = 5;

常量无符号短CONSTRAINT_ERR的 6;

常量无符号短TIMEOUT_ERR的 7;

只读属性无符号的短代码 ;

只读属性为DOMString 信息 ;

};

从下表中的代码的的 IDL属性必须返回最适当的代码。

消息 IDL属性必须返回一个错误消息,说明遇到的错误。该消息应该将其定位于用户的语言。

同步数据库API中的错误报告使用

的SQLException异常:

例外的SQLException {

常量无符号短UNKNOWN_ERR的 = 0;

常量无符号短DATABASE_ERR的 = 1;

常量无符号短VERSION_ERR的 = 2;

常量无符号短TOO_LARGE_ERR的 = 3;

常量无符号短QUOTA_ERR的 4;

const的无符号短SYNTAX_ERR = 5;

常量无符号短CONSTRAINT_ERR的 6;

常量无符号短TIMEOUT_ERR的 7;

无符号的短代码 ;

DOMString 信息 ;

};

从下表中的代码的的 IDL属性必须返回最适当的代码。

消息 IDL属性必须返回一个错误消息,说明遇到的错误。该消息应该将其定位于用户的语言。

的错误代码如下:

不变

UNKNOWN_ERR

0

情况

数据库本身无关的原因而失败的交易,不包括任何其他的错误代码。

DATABASE_ERR

1

该语句失败,数据库不包括任何其他的错误代码的原因。

VERSION_ERR

2

操作失败,因为实际的数据库版本不应该是什么。例如,一份声明中发现,实际的数据库版本不再符合预期的版本 的数据库或DatabaseSync的对象,,或Version() 或的

不变 码 情况

Version() 方法通过一个版本,它不符合实际的数据库版本。

TOO_LARGE_ERR

3

该语句失败,因为从数据库中返回的数据是太大。SQL“LIMIT”改性剂,以减少结果集的大小,可能是有用的。

QUOTA_ERR

4

该语句失败,因为没有足够的剩余存储空间,或达到存储配额和用户拒绝透露更多的数据库空间。

SYNTAX_ERR

5

该语句失败,因为语法错误,或参数的数量不匹配的数量 在声明中的占位符,或试图用一份声明中这是不允许的,如BEGIN,COMMIT或ROLLBACK语句,或声明试图用一个动词,可以修改数据库,但该交易是只读的。

CONSTRAINT_ERR

6

INSERT,UPDATE,或REPLACE 语句失败,由于一个约束失败。例如,由于行被插入和重复的值的现有行的主键列的值。

TIMEOUT_ERR

7

的交易不能在一个合理的时间内获得一个锁。

5的Web SQL

用户端必须执行的SQL方言,被SQLite 3.6.19支持。

绑定参数的SQL数据类型转换时,的JavaScript ToPrimitive的抽象操作必须获得的原始值进行处理。[ECMA262 [。

6磁盘空间

用户端应该限制允许数据库中的空间总量。

用户代理应警惕下存储数据的起源其他相关网站的网站,如存储到了极限,在,,等,规避主要存储限制。

用户代理可以达到配额时提示用户,使用户授予的网站更多的空间。这使网站许多用户创建的文件存储在用户的计算机上,例如。

用户代理应允许用户查看每个域使用的空间有多大。

五兆字节每起源的主要任意限制 的建议。实施反馈是受欢迎的,将用于在未来更新此建议。

7隐私

7.1用户跟踪

一个第三方广告商(或任何实体能够得到分布到多个站点的内容)可以使用一个独特的识别码存储在其客户端数据库,以跟踪用户在多个会话中,建立一个配置文件的用户的利益,以针对性很强的广告。结合一个网站,是了解用户的真实身份(例如一个电子商务网站,需要身份验证的凭据),这可能使压迫组针对个人,更准确地比在世界上有纯粹的匿名Web使用。

有很多的技术,可用于减轻用户跟踪的风险:

阻止第三方存储

用户代理可以限制访问的数据库对象的脚本在文件的浏览范围内的顶级域,例如拒绝访问的API从其他域的网页,运行于

iframe的小号。

到期存储的数据

用户代理可以,若有由用户配置,自动删除存储的数据后,在一段时间内。

这样可以限制能力的一个网站跟踪用户,该网站将只能够跟踪用户在多个会话中时,他与网站本身(例如,通过购买或登录到服务)进行身份验证。

然而,这也降低了有用的API作为一个长期的存储机制。它也可以把用户的数据处于危险之中,如果用户不完全理解其含义的数据过期。

持久性存储的cookie处理

如果用户试图保护自己的隐私清除Cookies也没有清除数据存储在相关的数据库,网站可以打败那些企图通过使用这两种功能相互冗余备份。用户代理应该呈现的方式,帮 助用户了解这种可能性,并让他们在所有的持久化存储功能,同时删除数据接口,为清除这些COOKIES]。

网站白名单,对数据库的访问

用户代理可能会要求用户对数据库的访问授权,才能让网站可以使用该功能。

地跟踪存储的数据

用户代理可以记录 的网站包含的内容来自第三方的起源,造成数据存储的起源。

如果这些信息被用于目前认为目前的数据持久性存储,它允许用户做出明智的决定的持久性存储的哪些部分进行修剪。结合黑名单(“删除这些数据,并防止这一领域不断将数据存储”),他所信任的网站,用户可以限制使用的持久性存储。

共享黑名单

用户代理可以让用户分享他们的持久性存储域的黑名单。

这将允许社区共同行动,以保护他们的隐私。

虽然这些建议,防止琐碎使用该API,用户跟踪,他们不会阻止它完全。在一个单独的域名,一个网站可以继续跟踪用户会话过程中,所有这些信息,可以通过第三方通过该网站获得的任何识别信息(姓名,信用卡号码,地址)。如果有第三方的合作与多个站点获得这些信息,配置文件可以被创建。

然而,用户跟踪是在一定程度上也可以没有任何用户代理的合作,例如在URL中使用会话标识符,技术已普遍使用为无害的用途,但很容易重新用于用户追踪(追溯)。这些信息可以与其他网站共享,使用访问者的IP地址和其他用户特定的数据(如用户代理头和配置设置)结合成连贯性的用户配置文件的单独的会话。

7.2灵敏度数据

用户代理应该把持久存储的数据作为潜在的敏感,它很可能为电子邮件,日历,约会,健康档案,或其他机密文件被存储在这个机制中。

为此,用户代理应确保,在删除数据时,它被迅速地从底层存储中删除。

8安全

8.1 DNS欺骗攻击

由于DNS欺骗攻击的潜力,不能保证确实是来自该域的主机,声称要在某个特定领域。为了减轻这个页面可以使用TLS。使用TLS的页面可以肯定,只有页面使用TLS,确定他们是来自同一个域的证书可以访问他们的数据库。

8.2跨目录攻击

不同的作者共享一个主机名,例如托管内容上,所有的数据库共享一组的用户。有没有功能限制的访问路径名。作者在共享的主机,因此建议避免使用这些功能,这将是微不足道的其他作者来读取数据,并覆盖。

即使路径限制功能,一般的DOM脚本安全模型将使得它可以轻松绕过这个保护和访问数据的任何路径。

8.3实施风险

两个主要的风险时实施这些持久性存储功能,让恶意站点读取来自其他域的信息,让恶意站点编写信息,然后读取从其他领域。

让第三方网站读取数据,是不应该到可以阅读从他们的域名会导致信息泄漏,例如,用户的购物愿望清单上的一个域可以使用另一个域有针对性的广告;或用户的工作-在-进步保密文字处理网站中存储的文件可以检查网站的竞争公司。

让第三方网站的数据写入到其他领域的持久性存储,可能会导致信息的欺骗,这同样是危险的。例如,一个敌对的网站可以添加到用户的愿望清单的项目,或充满敌意的网站可以设置一个用户的会话标识符到一个已知的ID,恶意网站可以用它来 跟踪用户的行为的受害者网站上。

因此,严格按照在本说明书中描述的模型的原点用户安全性是很重要的。

8.4 SQL和用户代理

用户代理的实现者强烈鼓励,审核所有支持的SQL语句对安全性的影响。例如,LOAD DATA INFILE是可能带来安全风险,有什么理由来支持它。

在一般情况下,它是推荐的,用户代理不支持的功能,控制数据库是如何存储在磁盘上。例如,有什么理由允许Web作者控制使用的字符编码在磁盘上的数据表示,在JavaScript中的所有数据是隐式UTF-16。

8.5 SQL注入

作者强烈建议?占位符功能的ExecuteSQL()方法的使用,从来没有在飞行中构造SQL语句。

参考文献

所有引用规范的,除非标记为“非规范”。

[COOKIES]

HTTP状态管理机制,A.巴特。IETF。

[DOMCORE]

文档对象模型(DOM)Level 3 Core规范,A.勒开胃,P.乐Hegaret,属木,G.尼科尔,J.罗宾,M.冠军,S.伯恩斯。W3C。

[ECMA262]

ECMAScript语言规范。ECMA。

[HTML]

HTML,一希克森。WHATWG。

[RFC2119]

主要的话为使用RFC中指示要求,S.布拉德纳。IETF。

[SQL]

尚未指定的精确方言。

[WEBIDL]

网络IDL,C.麦科马克。W3C


本文标签: 用户 数据库 代理 使用 参数