简而言之,我没有在最近几年中听到过这方面的讨论,WebGL仍然不安全吗,还是现在已经安全可用?当前的安全问题是什么?
快进到今天,我认为现代WebGL实现非常紧密。考虑到WebGL安全性的差距现在不仅会影响到启用WebGL的页面,而且会影响到任何网页,因为没有什么可以防止恶意站点或注入代码在其他非WebGL页面上创建WebGL上下文。浏览器厂商非常重视此事,如果他们认为存在未解决的安全问题,就不会默认启用WebGL。
许多现代实现也包含黑名单或白名单(链接),以确保只有当已知能够保持安全模型的驱动程序存在时才启用WebGL。
因此,对于任何默认启用WebGL的浏览器,可以安全地假定供应商对其WebGL实现的安全性充满信心。
WebGL采取了许多措施来防止任何问题的发生。
CORS
WebGL不允许使用来自其他域的任何图像,除非该域给予跨域资源共享权限。
请注意,这与Canvas 2D API不同,后者允许您使用任何图像,但如果您使用来自不同域的图像并且没有获得CORS权限,则画布将被标记为不可读;您无法再调用getImageData
或toDataURL
。
清除所有内存
WebGL清除所有缓冲区、纹理、渲染缓冲区等,因此没有来自其他程序的数据遗留。
检查所有边界
所有访问内存的函数都经过边界检查。您不能在纹理或缓冲区的边界之外上传数据等。
强制执行着色器限制
在将着色器发送到驱动程序之前,会对其进行预解析并检查它们是否超出了某些限制。函数只能嵌套8层。标识符长度不能超过256个字符。检查并强制执行Uniform和Attribute限制。
重新编写所有着色器
用户提供的着色器不会直接传递给驱动程序。相反,它们将使用生成的变量名进行重写,在适当的位置插入边界检查,以解决驱动程序错误。
WebGL实现通常具有黑名单
如果特定驱动程序出现问题,浏览器厂商将尝试添加解决方法或将其列入黑名单。
一些浏览器采取了更严格的措施
Chrome(可能很快也包括Firefox)不会授予运行网页的进程直接访问GPU的权限。因此,如果JavaScript中存在错误或HTML5中存在错误允许页面运行某些代码,则该代码无法访问GPU(或任何其他系统部分)。
此外,Chrome中实际访问GPU的进程没有访问除GPU以外的任何内容的权限。例如,该进程无法访问磁盘。
WebGL旨在安全,就像JavaScript、HTML5、图像解压缩或视频解码一样,如果存在漏洞,浏览器会立即修复它。