2011-09-30 53 views
6

Javascript的子集ADsafe禁止使用某些不安全的訪客代碼訪問的內容,如evalwindow,this,with等。日期和隨機數字如何在JavaScript中用於邪惡?

出於某種原因,它也禁止Date對象和Math.random

日期和的Math.random

訪問非確定性的這些來源,以限制,使其更容易確定小部件如何表現。

我仍不明白如何使用DateMath.random將容納惡意。

你能想出一個代碼示例,使用DateMath.random是否有必要做一些壞事?

+0

這些不是惡意本身,只是不可預知的。這幾乎是他們所說的。 – zneak

+4

只需使用'4'。它保證是隨機的。 –

+2

好吧,你可以在你的其他代碼中隱藏一些惡意代碼,並在特定的日期或隨機地執行它,這很難被發現。確定性代碼可以測試不良行爲,非確定性代碼不那麼容易。 –

回答

10

根據張貼由Douglas Crockford的一個slideshow

AdSafe中不允許訪問Daterandom

這是爲了讓廣告內容與信心 行爲不會改變人的評價未來。這是針對廣告質量的,而不是針對安全性的。

+0

現在我想知道如果沒有這兩件事情,真的沒有辦法包含非確定性... –

1

根據他們的網站,他們不包括DateMath.random,以便更容易確定第三方代碼的行爲。這裏的問題是Math.random(使用Date你也可以僞隨機數) - 他們想知道第三方代碼的行爲如何,並且不知道第三方代碼是否允許訪問隨機數。

本身,DateMath.random不應該構成安全威脅。

3

我不認爲有人會認爲他們是邪惡的本身。但是,這種報價的關鍵部分是:

更容易確定部件的行爲

顯然Math.random()引入非決定論,所以你永遠無法確定的代碼將如何表現在每次運行。

不明顯的是,Date帶來了類似的不確定性。如果你的代碼在某種程度上依賴於當前的日期,它將會(顯然)在某些條件下以不同的方式工作。

我想,這兩個方法/對象都是非功能性的也就不足爲奇了,換句話說,每次運行都會返回不同的結果,而不管參數如何。

總的來說,有一些方法可以與這種不確定性作鬥爭。存儲最初的隨機種子以再現完全相同的一系列隨機數(JavaScript中不可能)併爲客戶代碼提供抽象類型TimeProvider而不是讓它在任何地方創建Date

1

至少它們允許您編寫無法顯示爲非終止循環,但可能會運行很長時間的循環。

您展示的報價似乎表明正在進行一定量的靜態分析(或者至少是預期的),而這些特性使其變得更加困難。請注意,這些限制不足以阻止您編寫難以靜態分析的代碼。

1

我同意你的看法,這是一個奇怪的限制。

使用日期或隨機的理由很難預測控件的行爲,當然是無稽之談。例如,實現一個簡單的計數器,計算當前數字的sha-1,然後根據結果採取行動。我認爲,從長遠來看,與隨機或日期相比,預測小部件的功能會更容易... ...並不是永遠運行它。

數學的歷史表明,試圖在他們如何計算它們的價值進行分類的功能是走不通......根據實際結果(黑盒方法)是唯一明智的解決辦法是分類它們的路徑。