簡體   English   中英

如何沙箱不受信任的用戶提交的JavaScript內容?

[英]How can I sandbox untrusted user-submitted JavaScript content?

我需要在我的網站上提供用戶提交的腳本(有點像jsfiddle )。 我希望腳本能夠以安全的方式在訪問者瀏覽器上運行,與它們所服務的頁面隔離。 由於代碼是由用戶提交的,因此無法保證它是值得信賴的。

現在我可以想到三個選擇:

  • 在來自不同域的iframe中提供用戶提交的內容 ,並依賴於同源策略。 這需要設置一個我想盡可能避免的額外域名。 我相信這就是jsfiddle的做法。 腳本仍然可以做一些損壞,例如更改top.location.href ,這不太理想。 http://jsfiddle.net/PzkUw/
  • 使用sandbox屬性 我懷疑這在瀏覽器中得不到很好的支持。
  • 在提供腳本之前清理腳本 我寧願不去那里。

上面有其他解決方案或建議嗎?

更新

如果,正如我懷疑的那樣,第一個選項是最佳解決方案, 除了更改頂部窗口位置之外,惡意腳本可以做什么,以及如何防止這種情況? 我可以操縱或拒絕基於靜態代碼分析某些腳本,但是這是很難給出對象可以被訪問的方式的數量和總的難度分析JavaScript的靜態。 至少,它需要一個完整的解析器和一些復雜的規則(一些,但我懷疑不是所有,其中存在於JSLint中)。

創建一個定義良好的消息接口,並使用JavaScript Web Worker獲取要沙箱的代碼。 HTML5 Web Workers

Web Workers無權訪問以下DOM對象。

  • 窗口對象

  • 文檔對象

  • 父對象

因此,他們無法重定向您的網頁或更改其上的數據。

您可以創建模板和定義良好的消息傳遞接口,以便用戶可以創建Web工作者腳本,但您的腳本將對操作的內容有最終決定權。

編輯評論由喬丹格雷插入一個似乎做我上面描述的JavaScript庫。 https://github.com/eligrey/jsandbox

一些可能對您的應用程序有所幫​​助的工具的想法 - 它們從兩個不同的方向攻擊問題:Caja將不受信任的JavaScript代碼編譯為安全的東西,而AdSafe定義了一個可安全使用的JavaScript子集。

卡哈

卡哈

Caja Compiler是一個可以安全地嵌入您網站的第三方HTML,CSS和JavaScript的工具。 它支持嵌入頁面和嵌入式應用程序之間的豐富交互。 Caja使用對象功能安全模型來實現各種靈活的安全策略,以便您的網站可以有效地控制嵌入式第三方代碼可以對用戶數據執行的操作。

為AdSafe

為AdSafe

ADsafe可以安全地將訪客代碼(例如第三方腳本廣告或小部件)放在網頁上。 ADsafe定義了一個強大的JavaScript子集,允許訪客代碼執行有價值的交互,同時防止惡意或意外損壞或入侵。 ADsafe子集可以通過JSLint等工具進行機械驗證,因此無需人工檢查即可查看訪客代碼的安全性。 ADsafe子集還實施了良好的編碼實踐,增加了訪客代碼正確運行的可能性。

如上所述,主要瀏覽器已經支持iframesandbox屬性,但我還建議使用混合解決方案:在沙盒iframe中啟動Web工作者。 這將提供一個單獨的線程,並從不受信任的代碼保護事件沙盒iframe的DOM。 這就是我的Jailed庫的工作原理。 此外,您可以通過將任何功能集導出到沙箱來解決任何限制。

如果你想要通過刪除它來訪問一些代碼來訪問它來表示窗口文檔元素,你可以通過將它包裝在一個閉包中來實現它,其中這些是本地空變量:

(function(window, document, parent /* Whatever you want to remove */){
  console.log(this);      // Empty object
  console.log(window);    // undefined
  console.log(document);  // undefined
  console.log(parent);    // undefined
}).call({});

使用空對象調用它很重要,否則將指向窗口對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM