2009-06-29 6 views
1

Webアプリケーションをクエリ文字列操作から保護するため、クエリ文字列パラメータをすべての他のクエリ文字列パラメータ&のSHA1ハッシュを格納するすべてのURLに追加し、すべての要求に対してハッシュに対して検証することを検討していました。ハッシュを追加してクエリ文字列操作を防止しますか?

このメソッドは、クエリ文字列値のユーザー操作に対する強力な保護を提供しますか?これを行うにあたっての他の弱点や副作用はありますか?

私はこのプライベートウェブアプリケーションの「醜い」URLについて特に心配していません。同じクエリー文字列引数に対して常に同じハッシュ値が使用されるため、URLは「ブックマーク可能」になります。

これはASP.NETアプリケーションです。

+1

理由だけではなく、本物のセキュリティ/認証を使用していませんか? – tster

答えて

7

これはどのような種類のセキュリティも提供していません。 man-in-the-middle攻撃者がパラメータを変更したい場合は、クエリ文字列を変更してSHA-1ハッシュを再計算し、その要求をサーバーに送信するだけです。

たとえば、ブラウザによって送信されたURLは次のようになります。

http://www.example.com/addUser.html?parameterA=foo&hash=SHA1( "parameterAは= foo" という)

アタッカーを傍受する場合は、この、彼はこの方法でそれを編集することができます:

http://www.example.com/adduser.html?parameterA=bar&hash=SHA1( "parameterA = bar")

これは実際には、ハッシュをパラメータ自体と同じくらい信頼できるという事実によるものです。

これを解決できる方法の1つは、ユーザーが彼とサーバーだけが知っているパスワードを持っている場合、攻撃者がパラメータを変更すると攻撃者がハッシュを再計算することができないことです。たとえば:

http://www.example.com/addUser.html?parameterA=foo&hash=SHA1( "parameterA = fooの" + "theuserpassword")

しかし、URL内のパラメータの一つとして、パスワードを入れないでください:)

それを注意することが重要ですこれは、2者間で渡されるメッセージの完全性を検証するための最先端技術ではありません。今日使用されているものは、ハッシュベースのメッセージ認証コード(HMAC)アルゴリズムの一形態であり、これはHMACにかなりよく記述されており、確定的にはRFC2104FIPS Pub 198-1である。

+6

ハッシュの塩は、操作/中間者などを防ぐために単純に置くことができます。 –

+2

/etc/passwd塩のような塩を意味する場合、これらはmitm攻撃に対して安全性を提供しません。塩は一般に一般に知られており、ブルートフォース攻撃を使用してハッシュを逆転させることをより困難にする役割を果たすだけです。攻撃者がダイジェストを変更して再計算できないようにするには、 'salt'(実際にキー付きハッシュのキー)を秘密にする必要があります。これは基本的に認証方式であり、一般的には事前に共有秘密の知識を必要とします。 –

+0

塩が非常にランダムで秘密に保たれている限り、これは容認できる解決策になると思います。 – saille

0

他のすべてのパラメータのハッシュでパラメータを追加することをお勧めします。クエリーストリングの操作を根本的に防ぎますが、アプリケーションの他のページでこれらのURLを使用し、それらのURLを一般に公開したり、印刷した形で使用したりするという問題を考える必要があります。これらのページが動的に作成されていない場合や、手動でURLを追加する必要がある場合は、注文しておくことができます。

他の問題はありません。ハッシュを計算できると言う人もいますが、異なるハッシュを取得して推測するのが難しいパラメータの順序で遊ぶことができます。

1

あなたはこの小さなオープンソースのライブラリを使用して検討するかもしれない:

http://www.codeproject.com/KB/aspnet/Univar.aspx

これは、各クライアントコンピュータに一意のキーを使用し、多くの他のグッズが付属しています。

0

JavaScriptの問題点の1つは、JSAの使用量に依存しますが、javascriptはクライアント側のSHA計算をページにリンクするだけで済みますが、get引数pageNo = 1を含めることができ、「ページにジャンプ」入力ボックスを持つためには、ハッシュを追加すると難しくなります。あなたは本当に操作したくないものをセッション(サーバ側)に格納することができます。

2

なしハッシュとクエリ文字列操作を防ぐために、私の解決策:Global.asaxファイルで

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
{ 
    // I take the url referer host. (manipulating the query string this value is null or your local address) 
    string strRefererHost = Request.UrlReferrer == null ? string.Empty : Request.UrlReferrer.Host; 

    // This is the host name of your application 
    string strUrlHost = Request.Url.Host; 

    // I read the query string parameters 
    string strQSPars = Request.Url.Query ?? string.Empty; 

    // If the referer is not the application host (... someone manipulated the qs)... 
    // and there is a query string parameter (be sure of this otherwise nobody can access the default page of your site 
    // because this page has always a local referer...) 
    if (strRefererHost != strUrlHost && strQSPars != string.Empty) 
     Response.Redirect("~/WrongReferer.aspx"); // your error page 

} 
+0

しかし、httpヘッダがネットワークを介してプレーンテキストで送られてきたので、非常に簡単です。 – Ravia

関連する問題