2016-05-20 8 views
2

私は簡単なウェブサイトを作るために春のブート、春のmvcと春のセキュリティを使用しています。ログインページで、私は覚えて私のチェックボックスがあります。チェックしてログインすると、ブラウザ用のRemember-Me Cookieが作成されます。私はchromeとfirefoxの両方を試しました。春のセキュリティ私のクッキーを覚えているユニコード文字が間違っている

クッキーは以下のとおりです。

Name: remember-me 
Content: Pz8/Pz8/OjE0NjQ5ODcxMjQxMDk6YTc1MDMzNTM0ZmNhNjc3YmUwOTljZGNjN2EyYTk1NjM 
Domain: localhost 
Path: /gy 
Send For: Any kind of connection 
Accessible to Script: No (HttpOnly) 
Created: Friday, 20 May 2016 at 21:52:04 
Expires: Friday, 3 June 2016 at 21:52:04 

上記の内容はbase64形式です。デコードされた文字列は以下の通りです。

??????:1464987124109:a75033534fca677be099cdcc7a2a9563

最初の部分は漢字ですが、として示されたユーザー名です??????。

私は、Unicode文字をクッキーに保存することを知っています。URLEncoderクラスを使用して最初にエンコードし、読み込んだ後にデコードする必要があります。私はJavaとSpringが初めてのので、Unicode文字を処理するためにcookie cookieをカスタマイズする方法は知られていません。

問題を解決する手掛かりはありがたいです。ありがとう!

答えて

2

これはSpring Securityのバグです。デフォルト・エンコーディングを使ってバイトにUnicode文字をエンコードしgetBytesの0引数バージョンを使用して

Hex.encode(digest.digest(data.getBytes())); 

:それはMD5 like thisを計算します。デフォルトのエンコーディングはさまざまですが、サーバー上では中国語の文字を含むことができないエンコーディングです。

デフォルトのエンコーディングは決して信頼されるべきではありません。非常に頻繁にUTFではないので、すべてのUnicode文字を含むことはできません。また、固定されていないので、あるサーバーから別のサーバーに移動するときにトークンが破損する可能性があります。 Springは明示的なUTFエンコーディングを設定する必要があります(例:getBytes("UTF-8"))。

これが唯一のプロパティではありません覚えて、私は私を心配している:それはMD5、長くそのプライム過ぎているハッシュアルゴリズムを使用して、攻撃にますます脆弱だ

  • 。それも、(HMACは、まさにこの目的のために設計されて)

  • すべてのサポートされていない文字は黙っユーザー你好のハッシュがなることを意味同じ文字、?、に押しつぶさ取得し、これを緩和することになるHMAC-MD5を使用していませんユーザー☃☃のハッシュと同じです。理論的には、サポートされていないキャラクタを持つ犠牲者のユーザとしてユーザ名(または疑問符そのもの!)にログインすること、他のユーザがサポートされていない別のキャラクタをユーザ名に作成してから、新しいユーザのハッシュに犠牲者のユーザ名を含めるためのクッキー。 (実際には、(a)ハッシュの 'password'フィールドの存在は、問題を複雑にしますが、Unicode文字の潰れに対して脆弱ですが、(b)幸いにも、デフォルトのエンコーディングを使用してクッキー自体も間違ってデコードされます。 1つは任意のUnicode文字をチェッカーに最初から取得することから)。

  • それはどんな区切り文字用のエスケープせずに一緒に文字列をスローし、そのコンポーネントはおそらく本当に直接それと攻撃の多くを行うことはできません。中にコロンを持っていたときにすごみが起こるが、それはshonkyだと attempt to work around itが見事半arsedある

ウェブアプリケーションを保護するためにこのコードを信頼しません。ハイプロファイルのセキュリティライブラリでこのようなことを見るのは残念です。

+0

あなたの偉大な答えに感謝します。セキュリティは、ユーザーの利便性と比較して、このWebアプリケーションにとって大きな懸念事項ではありません。あなたが提案したように、私は間違いなくエンタープライズウェブサイトでこの機能を使用しません。 Springチームがこのバグを修正する前に、この問題を回避する方法はありますか?すなわち、私がユニコードで働くことを覚えていますか? – weijun

+1

サーバー上のデフォルトのエンコーディングをUTF-8に設定して、すべての文字にアクセスできるようにすることができます。これは、 '-Dfile.encoding = UTF8'をオプションとしてJavaランタイムに渡すことによって行うことができます。どのコンテナ/ OSを使用しているかによって、どれくらい正確に設定できますか? – bobince

+0

私のdev PCでデフォルトのエンコーディングをUTF-8に変更しました。意外にも、私のLinuxサーバのデフォルトのエンコーディングはすでにUTF-8なので、すぐに動作します。ご協力いただきありがとうございます。 – weijun

関連する問題