2016-05-30 5 views
4

のJavaScriptのlocation.replace()を経由してナビゲートする前に相対的である。
(すなわちhttps://example.com/destination確認URLは、私は<code>destination</code>は、ユーザーが、彼らは、ログインする必要がありました際に移動しようとしていたターゲットURLでログインページ<code>https://example.com/login#destination</code>を持って

私が使用して考えていたJavaScriptはこのリンクを提供することにより、攻撃者は、XSSの脆弱性につながる

function onSuccessfulLogin() { 
    location.replace(location.hash.substring(1) || 'default') 
} 
  • ました https://example.com/login#javascript:..

  • また、ログイン後に見た目のサイトに移動するのを防ぐ必要があります。
    https://example.com/login#https://looks-like-example.com
    またはhttps://example.com/login#//looks-like-example.com

どのように私はハッシュで提供されたURLを確認するためにonSuccessfulLoginを調整することができます#部分が相対URLで、javascript:https://または任意の他の絶対的なナビゲーションスキームで始まりませんか?

URLを評価し、ナビゲートする前にlocation.originが変更されていないかどうかを確認することをお勧めします。  あなたはこれを行う方法、またはより良いアプローチを提案できますか?

+0

私に起こった最初の考えは、ajax HEADリクエストを作成することです...成功すると、リダイレクトされます – charlietfl

+0

完全な解決策を試すには十分なデータがありませんが、少しシンプルで、次の方法で使用できるJavaScript Locationコンストラクタを貸してください。 'var loc = new Loc(sURL); loc = loc.hash.split( "#")[1]; if(/javascript|http/i.test(loc.protocol)){loc.hash = default; location = loc.href}; 'しかし、私はまだ状況をより明確にする必要があります。 –

+0

@GeorgeBaileyもちろん、そうではありませんが、あなたがそれをよく読んでいないのなら、私は自分の提案が好きな場合に備えて、 "私はあなたのものを貸すことができます"と言っています。 –

答えて

1

:任意、宛先入力を値にマッピングすることが、それが推奨され

はなく実際のURLまたはURLの部分、およびそのサーバ側のコードよりも、この翻訳値をターゲットURLに追加します。だから、安全なアプローチは、実際のURLにいくつかのキーをマッピングすることになる

// https://example.com/login#destination 

var keyToUrl = { 
    destination: 'https://example.com/destination', 
    defaults: 'https://example.com/default' 
}; 

function onSuccessfulLogin() { 
    var hash = location.hash.substring(1); 
    var url = keyToUrl[hash] || keyToUrl.defaults; 

    location.replace(url); 
} 

また、URLのパスのみの一部を提供し、コード内のホスト名とそれを追加検討することもでき

// https://example.com/login#destination 

function onSuccessfulLogin() { 
    var path = location.hash.substring(1); 
    var url = 'https://example.com/' + path; 

    location.replace(url); 
} 

私はマッピングに固執します。

+0

ああ、あらかじめ保留中の 'location.origin + '/' '(' https:// example.com')は良い解決策のようです。申し訳ありませんが、この特定のプロジェクトでは、余計な価値があるにもかかわらず、マッピングを使用しません。 –

0

これはXSSの脆弱性に関する良い点です。非常にです。

私はすべてのプロトコルが英語のアルファベット文字しか使わないと信じているので、/^[a-z]+:/iのような正規表現はそれらをチェックします。代わりに、より包括的であると感じている場合、/^[^:\/?]+:/は、/または?以外のものを許可し、それに続いて:を許可します。

// Either 
var rexIsProtocol = /(?:^[a-z]+:)|(?:^\/\/)/i; 
// Or 
var rexIsProtocol = /(?:^[^:\/?]+:)|(?:^\/\/)/i; 

はその後、テストはこのようなものです::言っ

var url = location.hash.substring(1).trim(); // trim to deal with whitespace 
if (rexIsProtocol.test(url)) { 
    // It starts with a protocol 
} else { 
    // It doesn't 
} 

、一つだけ私はあなたを考えるその後、我々は、私たちに与えプロトコルフリーのURL、をテストするために/^\/\/とそれを組み合わせることができます特に悩まされる必要があるのは疑似プロトコールであるjavascript:です。そのためにテストしてください。 Preventing Unvalidated Redirects and ForwardsにOWASPお薦めから

関連する問題

 関連する問題