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中的其餘操做。