title: 什么是 WebAssembly table imports
date: 2018-3-22 23:58:00
categories: 翻译
tags: WebAssembly
source: 原文地址
auther: Lin Clark
什么是 WebAssembly table imports
这是此系列的第三篇文章:
- Creating a WebAssembly module instance with JavaScript
- Memory in WebAssembly (and why it’s safer than you think)
- WebAssembly table imports… what are they?
在第一篇文章中,我介绍了WebAssembly模块实例可以具有的四种不同类型的导入:
- values - 值
- function imports - 函数及其闭包
- memory - 内存对象
- table - 表
最后一个可能有点不熟悉。什么是table imports,它能干什么?
有时在一个程序中,你希望能够有一个指向函数的变量,比如回调函数。然后你可以用它做一些事情,比如将它传递给另一个函数。
在C中,这些被称为函数指针。该函数驻留在内存中。指向函数的变量,即函数指针只是指向那个内存地址。
如果需要,稍后可以将变量指向另一个函数。这应该是一个熟悉的概念。
在网页中,所有函数都只是JavaScript对象。而且因为它们是JavaScript对象,所以它们驻留在WebAssembly内存地址之外的内存中。
如果我们想要一个指向这些函数之一的变量,我们需要把它的地址写入我们的记忆中。
但作为网页安全的一部分,保持这些内存地址隐藏是必要的。你不会希望页面上的代码能够查看或操纵该内存地址。如果页面上存在恶意代码,它可以利用内存中的布局位置信息创建漏洞。
例如,它可以改变你已使用的一个内存地址,指向一个不同的内存位置。
然后,当您尝试调用该函数时,实际加载的就是攻击者给予您的内存地址中的任何内容。
恶意代码可能以某种方式插入到内存中,比如嵌入在字符串中。
tables使使用函数指针成为可能,但是以一种不易受到这类攻击的方式。
table是一个数组,它位于WebAssembly的内存之外。这些值具有对函数的引用。
在内部,这些引用包含内存地址,但由于它不在WebAssembly的内存中,因此WebAssembly无法看到这些地址。
不过,它可以访问数组索引。
如果WebAssembly模块想要调用其中一个函数,它会将索引传递给名为call_indirect的操作,它会帮忙调用目标函数。
现在table的用例非常有限。它们被添加到规范中以支持这些函数指针,因为 C/C++ 非常依赖这些函数指针。
正因为如此,目前你可以放入table中的唯一引用是对函数的引用。但是,随着WebAssembly功能的扩展(例如,添加直接访问DOM的功能),除了call_indirect之外,你还可能会在table中存储其他类型的引用以及能够使用table中的其他操作。