2009-03-28 1 views
2

基本的に私の.NETアプリケーションでURLを開こうとしています。デフォルトのブラウザでURLを開くための安全な方法は何ですか?

などしたがって、私は彼らがメタ文字を注入することにより、システム内のコマンドを実行したくない、

Process.Start("http://www.google.com") 

をしかし、私の場合にはURLが外部ユーザーによって制御することができます。これは、実行することによって容易に達成することができます

だから、安全な方法は、次のようになります。

  • 読むレジストリとでNew Process()を作成し、デフォルトのブラウザ
  • 何を参照してください。デフォルトのブラウザの実行可能
  • サプライこれを実装する前に、プロセス

を起動

  • 引数
  • としてURLは、私はちょうど私が、これはovercomplicated作っていないよ確認したいです。どう思いますか?

    私は入力のフィルタリングを実装するに熱心でないんだけど、それは代わりに、それを解析することによって有効なHTTPのURLを確認していないのはなぜ

    答えて

    10

    だけ汚いソリューションですか?

    Uri target = null; 
    if (Uri.TryCreate(userSuppliedString, UriKind.Absolute, out target) && 
         (Uri.UriSchemeHttp == target.Scheme || Uri.UriSchemeHttps == target.Scheme)) 
    { 
        // It's an URI that I can use 
        Process.Start(target.ToString()); 
    } 
    

    この例では、プロセスの作成にuserSupplied文字列を使用していないことに注意してください。それは、UriクラスがStart呼び出しに渡された文字列をフォーマットすることを可能にします。

    有効であると思われるすべてのスキーム(たとえばFTP)を含むようにスキームチェックを拡張することができます。

    +0

    私はprocess.startが "http://www.google.com && calc.exe"や "http://xxx.com -Profile Manager"などの攻撃に対して脆弱だと思ったが、明らかにそうではない。 –

    +0

    @Slough、いいえ、私はそれがfile://c:/windows/system32/cmd.exeまたはそれらの行に沿った何かであると信じています – JaredPar

    +0

    これは古典的なShell()呼び出しよりも優れた実装方法です。 –

    1

    私はむしろ入力を検証したいと思います。 Uriクラスで簡単にできるはずです。

    関連する問題