[譯]WebAssembly的導入類型 table 究竟是什麼?

做者:Lin Clark
譯者:xlaoyu
英文原文:WebAssembly table imports… what are they?web

轉載請註明出處,保留原文連接以及做者信息數組


這是 WebAssembly 使用系列介紹的第二篇文章:安全

  1. 使用JavaScript建立WebAssembly模塊實例
  2. 安全的WebAssembly內存操做
  3. WebAssembly 的 table 對象是什麼

第一篇文章中已經介紹過能夠導入 WebAssembly 模塊實例中四種不一樣類型的值了:ide

  • values
  • function imports
  • memory
  • tables

前三種咱們都見過用過或者在以前的文章介紹了,可是對於最後一個可能你們都會疑惑:它究竟是什麼和有什麼做用?函數

在 JS 中,咱們都知道函數表達式能賦值給一個變量,換一種說法便是變量指向了函數。而後咱們可使用這個變量(函數表達式)作一些事情,好比將它傳遞給另一個函數做爲回調函數:fetch

callback

在 C 語言中這個變量被稱爲函數指針(function pointers)。函數保存在內存中,而這個變量(函數指針)僅僅保存的是指向該函數的內存地址(memory address)ui

memory address

這個指針變量能根據咱們的須要在不一樣時間指向不一樣的函數(也就是不一樣的內存地址),若是學過 C 或者 C++ 對這個概念應該不陌生。this

pointer other

在網頁中,咱們都知道全部函數實際也是一個 JavaScript 對象,而且因爲這個特性,因此它們所使用的內存地址在 WebAssembly 的內存區域外。spa

function in outside

若是咱們想在 WebAssembly 中擁有一個指向該函數的變量,那麼咱們須要獲取到該函數的地址而且放入 WebAssembly 內存中。prototype

webassembly point outside

可是保證網頁安全的其中一點就是須要保持內存地址的不可見性,咱們不但願頁面中的代碼可以查看而且修改那些內存地址。想象一下,若是頁面中存在惡意代碼而且能修改內存,那麼它們將能夠利用內存相關知識去製造漏斗。

舉個🌰,它能夠去把某個指向函數地址的變量改成指向另一個函數的地址(一個惡意函數),那麼當用戶嘗試去調用該變量(函數)時,就觸發了攻擊者的指定的任何內容了。

attack

惡意代碼可能會以任何方式插入到頁面中,也許就在某個字符串裏。這時候咱們須要一種機制來實現安全的函數指針 -- table

WebAssembly 的 table 類型能使咱們在避免遭受各類攻擊的方式下使用函數指針特性。

table 是一個位於 WebAssembly 內存以外的數組,它的值就是對函數的引用。

table

在底層,引用就是內存地址。但因爲它不在 WebAssembly 的內存中,所以 WebAssembly 沒法看到這些地址,可是它能夠訪問到數組索引。

table index

當 WebAssembly 模塊想要去調用這些函數的時候,可使用數組索引經過所謂的 間接調用(call_indirect)Table.prototype.get 去調用函數。

Ps:一下是譯者引用 MDN 上的一段代碼和註釋

var tbl = new WebAssembly.Table({initial:2, element:"anyfunc"});
console.log(tbl.length);  // "2"
console.log(tbl.get(0));  // "null"
console.log(tbl.get(1));  // "null"

var importObj = {
  js: {
    tbl:tbl
  }
};

// 假設 table2.wasm 包含兩個函數(一個返回42,另外一個返回43)而後把兩個函數存儲在 table 的 0 和 1 索引位置中
WebAssembly.instantiateStreaming(fetch('table2.wasm'), importObject)
.then(function(obj) {
  console.log(tbl.length);
  console.log(tbl.get(0)()); // 42
  console.log(tbl.get(1)()); // 43
});
複製代碼

element - A string representing the type of value to be stored in the table. At the moment this can only have a value of "anyfunc" (functions). initial - The initial number of elements of the WebAssembly Table.

如今,表格的用例很是有限。它們被添加到規範中以支持這些函數指針,由於 C 和 C++ 很是依賴這些函數指針。

正由於如此,目前咱們能夠放入表中的惟一引用是對函數的引用。可是隨着WebAssembly功能的擴展(例如,當添加對DOM的直接訪問時),咱們能看到 table 上保存更多類型的引用以及執行除了間接引用外其餘的操做。

相關文章
相關標籤/搜索