第四章 安全 Security
4.1 资源限制 Resource Restrictions
WebGL的资源如纹理(textures)和VBO(vertex buffer objects)对象必须总是包括了初始值,即使用户没有创建它们没有指定任何值.创建一个没有初始数据的资源通常用来给纹理和VBO对象保留一块空间,这块内存空间随后可以通过调用texSubImage或bufferSubData方法进行修改.如果调用这些方法时没有指定初始值,则WebGL实现时应该当将它们设置为0.深度缓冲(depth renderbuffer)必须清空成默认值1.0,例如,这可能要求创建一块值为0,大小与请求的VBO对象相等的内存区域,这样它就可以正常初始化了.基于同样的道理,所有其它类型的数据,不论是arrayBuffers还是DOM对象如images,要加载到纹理或VBO对象里,都要求初始化(All other forms of loading data into a texture or VBO involve either ArrayBuffers or DOM objects such as images, and are therefore already required to be initialized).
当通过调用shaders的drawElement或drawArrays方法得到WebGL资源时,WebGL实现需保证shaders没有越界或未初始化,点击这里Enabled Vertex Attributes and Range Checking查看那些限制必须被webGL实现.
4.2 来源限制 Origin Restrictions
为了阻止(隐私)信息泄漏,HTML5包含了一个origin-clean标志(See HTML5, section 4.8.11.3, "Security with canvas elements".)
针对webGL设备对象,这个标志在以下几种情况下必须设置为false:
1,当HTMLImageElement或HTMLVideoElement对象的来源与包含html canvas对象的页面的来源不同时,在这两个对象上调用txtImage2D方法时
2,当HTMLCanvasElement的origin-clean标志为false,在其对象上调用texImage2D方法时
当canvas中2D context对象的origin-clean标志设置为false时,无论任何时候调用readPixels方法,哪怕使用正确的其它参数,都应该抛出一个
SECURITY_ERR
异常
4.3 支持GLSL构造 Supported GLSL Constructs
webGL的shader实现必须遵守OpenGL ES Shading Language规范,并且不允许扩展在第四节,第五节附录A中要求的minimum functionality.特别强调,一个引用了(OpenGL)状态变量的shader或者那些在其它版本的GLSL中已经在用的函数(比如在桌面OpenGL中发现的那些函数)必须被禁止加载
除了之前规范中保留的那些标识符外,新增以"webgl_"和"_webgl_"开关的关键字保留供webGL用.以这两个为前缀的命名的函数,变量,结构名字,或者结构字段名字的shader必须被禁止加载
4.4 Defense Against Denial of Services 拒绝服务防护
4.5 Out-of-Range Array Accesses 数组越界访问
Shaders必须禁止对在数组界外的对象的读写操作,