2009-10-30 24 views
7

我正在計劃將我的學生的快速網頁放在一起,教他們關於JavaScript編程。在這個頁面上,我想給他們一個文本框,讓他們運行JavaScript,以便他們可以看到工作中語言的動態性質。但是,我很清楚在用戶輸入中使用eval()通常是一個非常糟糕的主意。發佈這樣的頁面會帶來什麼樣的安全風險?我應該採取哪些措施來緩解這些風險?使用eval()在JavaScript中執行用戶輸入的安全風險

+4

只需在本地運行頁面。沒有理由把它放到網上。 – 2009-10-30 17:08:37

回答

5

它將在自己的機器上運行。只是不要讓他們保存字符串併發送給其他人 - 也不要通過GET將值存入URL(以便通過電子郵件發送)。

0

那麼這意味着用戶想要在您的表單上執行的任何代碼都可以在您的網站運行的域的權限下執行。因此,如果有人想在鎖定的機器上執行代碼,但相信您的網站(例如,允許您運行活動的x控件等),則該人員將有能力通過以下方式執行此操作:輸入正確的代碼並使用您的站點將腳本評估到可信空間。本質上,通過這樣做,您證明在該頁面上運行的任何內容對於信任您的域名的人員來說都是安全的。 (想想在IE等信任的網站)

2

如果它在本地「扔掉」的機器,那麼幾乎沒有風險。由於一切都在客戶端運行,他們只能用JavaScript來傷害自己。最壞的情況下,他們可能會開放Ajax連接,但這並不比給他們帶有Tamper Data加載項的Firefox有害。

簡而言之,除了使用機器外,使用JavaScript自由統治的風險非常小(性能方面除外),但如果足夠狡猾,它們仍然無法完成。我建議要麼讓它們在自己的機器上運行,要麼在一個演示盒上運行,您可以隨時重新映像,當它變得過於臃腫並繼續運行時。

現在,給他們eval訪問PHP/etc另一方面將是一個可怕的,可怕的想法。

8

您正在採取的安全風險是您正在從用戶那裏接受輸入並在您網站的腳本上下文中運行它。想象一下,如果你是一個惡意的黑客,無論出於何種原因都有權修改在網站上運行的JavaScript。您可以執行任何在您的域中運行的JavaScript都能夠執行的操作(包括Cookie竊取,XSS,驅車即逝的惡意軟件等)。

您可以切實做的減輕風險的唯一方法是不要eval()用戶提供的內容。企圖對輸入進行消毒只允許「安全」輸入註定要失敗;要確定什麼是安全的,幾乎是不可能的,甚至更難以實際限制腳本(假設潛在攻擊者具有用於掩飾其意圖的解釋性語言)。

請注意,如果這是出於教育目的,那麼一種方法就是確保所有安全漏洞無關緊要。糟糕的JavaScript無法破壞您的服務器或從您的銀行賬戶竊取資金(當然,除非它在您銀行的網頁上)。如果託管該網頁的網站沒有任何cookie或會話值得竊取,並且學生知道這只是一種教育資源,我不認爲會有什麼擔心的。大多數攻擊依靠訪問存儲在您的域中的機密信息,或者欺騙域名訪問者以某種方式放棄機密信息(phishing攻擊或類似情況)。出於你的目的,我認爲你會沒事的 - 只是不要在「真實」的網站上做。

+0

真棒解釋。 – 2009-10-30 17:24:23

+4

考慮到用戶可以使用開發人員工具執行任何他們希望的任意代碼,是不是可以執行用戶提供的任意代碼和模擬點? – 2015-10-30 15:36:15

2

我會建議你對所有用戶輸入評估的沙箱,以防止評估的代碼訪問所有的全局(窗口)對象屬性和方法。

給看看以下資源:

+2

這些不是沙箱,只是新的環境。父窗口可以通過'parent'或'top'輕鬆訪問,您可以使用對象的eval方法。 JSand中真正的JavaScript沙箱庫是JSandbox。 – 2009-10-31 01:15:32

1

實在是這裏沒有嚴重的風險。例如,打開此頁面的螢火蟲並輸入控制檯:eval("alert('hello');");,問題?不是真的。

爲了演示的目的,這沒什麼大不了的。

2

您可以嘗試使用JavaScript沙箱庫。 Dean Edward的解決方案Caja不會限制代碼訪問當前窗口或文檔。 JSandbox庫完全沙盒代碼執行使用Web Worker Threads(因此你將無法使用DOM),但它只能在支持它們的瀏覽器中使用。

JSandbox是異步的,所以如果您選擇使用它,您將需要更改代碼以使用回調。