情況是這樣的:我有一些創建交互式對話的JavaScript(並通過動態元素創建以漫畫的形式顯示它......很有趣)。該頁面允許用戶調整設置,改變腳本產生的對話。作爲一個理論示例,其中一個複選框可以是「使用cussing」,如果此複選框被選中,腳本只會將cuss單詞添加到返回的字符串中。 oK,夠簡單。樂趣。Javascript:處理用戶生成腳本的最佳方式
它目前只使用一個模板(「漫畫」具有非常具體和尖銳的目的)來生成對話;這個模板被硬編碼到JavaScript中。我希望用戶能夠創建自己的模板,然後將其轉換爲與硬編碼版本一樣執行的腳本,並且可以通過複選框選項進行控制。 編輯:爲了澄清,用戶不直接編寫腳本。他們編寫一個表示(我現在正在考慮使用JSON),當其他人使用模板打開頁面時,頁面會將其轉換爲腳本並執行它。
這提出了一些問題。最明顯的是惡意用戶的攻擊。 編輯:雖然用戶不會自己編寫腳本,但由於所有的客戶端都可以輕鬆地看到我的解析腳本,並且可以找出如何插入某些東西。雖然並不太擔心這一點。 結束編輯。我確定有一些標準的方法來處理這個問題,並且因爲目前沒有交互服務器端 - 所有的客戶端 - 我主要關心的是這樣的用戶不能通過分享他的不好的版本來傷害另一個用戶的體驗。現在,我簡單地通過全局替換不在一組中的所有字符來剝離字符串:
str.replace(/[^a-zA-Z...]/g,'')
。
另一個問題是如何將他們的模板提供給他人欣賞的頁面。正如我所說的,沒有服務器端的交互,我想保持這種方式。我不想創建MySQL表格等來存儲他們的模板。不幸的是,這意味着我能想到的唯一可行的方法是將它們的模板放在URL的查詢字符串中。討厭的,那個。而且這確實會對字符長度施加限制 - 如果我的閱讀正確,只需要2000個字符就可以兼容較舊的IE。 (我也想過生成一個HTML文件的文本,他們可以複製n貼,保存爲這樣,主機的地方,併發送地址到我的網頁的URL,然後加載到一個iFrame ......哈是的,不是用戶友好型的 - 既包括文件類型的保存,它們可能從未保存過以前的文件類型,也考慮如何託管文件 - 並且會產生更大的安全問題。)
第三個問題是一旦頁面從他們那裏收到了模板,使其變得安全,並將其轉換爲腳本,我應該如何執行該腳本?自從我第一次開始使用Javascript以來,我聽說eval是邪惡的,所以我避免使用它。顯然做new Function(txt)
是一樣邪惡的(雖然我已經做了很多次)。我願意接受這些邪惡的主張......但是還有什麼替代方案?我搜索了谷歌,最接近我的情況,我能找到的是this StackOverflow question, involving remote code。接受的答案建議使用textContent設置爲腳本字符串動態創建腳本標記。這對我來說也是最好的解決方案嗎?
摘要
我需要訪問用戶生成的文本(優選不將其存儲服務器端),它解析成的Javascript同時避免攻擊,然後用一些替代eval()
執行它。
- 將它們的模板作爲查詢字符串存儲在URL中,然後可以共享該模板,這是將模板獲取到頁面的唯一方法?
- 我應該注意哪些安全漏洞,以及防範惡意用戶的標準方法是什麼?
- eval有什麼替代方法可以執行未硬編碼到腳本中的遠程檢索代碼?
即使IE9具有〜2047個字符的URI(例如GET)限制。 – 2012-06-01 20:59:04
而不是存儲「腳本」,存儲聲明的東西 - 例如JSON表示模板/操作 - 然後應用只執行「可信」代碼。然而,考慮到jsfiddle.net運行「不可信代碼」,所以......(正如前面提到的,這個問題出現在「模仿」風格的攻擊中,它比以前更有保護性) – 2012-06-01 21:00:31
將三個問題組合成一個並不是要如何使用SO。如果你分解它,這個問題對別人更有用。您可以縮短每個問題的時間,甚至參考以前的問題 –