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