一千萬個為什麽

搜索

如何讓外部代碼“安全”運行?只是禁止eval()?

我希望能夠讓社區成員提供他們自己的javascript代碼供其他人使用,因為用戶的想象力遠遠超過我想象的任何想象。

但是這引發了固有的安全問題,特別是當目的是為了允許外部代碼運行時。

那麽,我是否可以禁止提交 eval()並使用它來完成?或者還有其他方法來評估代碼或導致在JavaScript大規模恐慌?

還有其他的東西是不允許的,但我主要關心的是,除非我可以阻止字符串被執行,否則我為特定方法放置的其他任何過濾器都可以被繞過。是否可行,還是我不得不求助於作者提供Web服務界面?

最佳答案

由於 HTML5 現已可用,您可以使用 sandbox 以獲取不可信的JavaScript代碼。

OWASP HTML5安全備忘單沙箱框

  • Use the sandbox attribute of an iframe for untrusted content.
  • The sandbox attribute of an iframe enables restrictions on content within a iframe. The following restrictions are active when the sandbox attribute is set:

    1. All markup is treated as being from a unique origin.

    2. All forms and scripts are disabled.

    3. All links are prevented from targeting other browsing contexts.
    4. All features that triggers automatically are blocked.
    5. All plugins are disabled.

      It is possible to have a fine-grained control over iframe capabilities using the value of the sandbox attribute.

  • In old versions of user agents where this feature is not supported, this attribute will be ignored. Use this feature as an additional layer of protection or check if the browser supports sandboxed frames and only show the untrusted content if supported.

  • Apart from this attribute, to prevent Clickjacking attacks and unsolicited framing it is encouraged to use the header X-Frame-Options which supports the deny and same-origin values. Other solutions like framebusting if(window!== window.top) { window.top.location = location; } are not recommended.

您可以允許腳本在保持其他限制的情況下運行。但是,您應確保腳本從不同於主要內容的域中運行,以防止 XSS 攻擊,攻擊者重定向用戶直接加載頁面(即不通過IFrame)。

這將限制腳本使用 eval 來攻擊您的主域,但這可能會阻止腳本實際上足夠強大以滿足您的需求。與主域名的任何互動都必須通過 Window.postMessage </代碼> 。如果這太嚴格了,那麽 @ bobince的回答仍然有最佳的解決方法建議。

請參閱我的其他答案,了解如何安全實施沙箱的詳細信息。

轉載註明原文: 如何讓外部代碼“安全”運行?只是禁止eval()?