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中的其他操作。