Cookieを使う:その2

昨日の続き.今回は,予定通り「Cookieの内容を取得する」です.正直な事言いますと,課題の内容を先生に確認しますれば,ログインだとかそーゆー処理は「まったく」必要がない(けどまぁ折角だし残しておいて,レポートで送ってくれても良いよ)と言われました.でももうやってしまった後なので,書きますよ,ボクは.
それでは,昨日と同じように,JSPプログラムでクッキーを扱う:Tomcatを使う「JSPプログラミング」(8) - @ITを参考に実践していきます.

Cookieの内容を取得する

少し,参考とは違います.

// Cookieを読み込む
Cookie cookies[] = request.getCookies();
// クライアントからサーバにCookieを全て渡す

Cookie cookie = null; // 取得したいCookie
if(cookies != null){
  for(int i = 0; i < cookies.length ; i++){
    // Cookieの一覧を全て見ていって
    if(cookies[i].getName().equals("bookdbuser")){
      // 求める名前のCookieがあれば
      cookie = cookies[i];
      // 取得したいCookieに格納し,ループを抜ける
      break;
    }
  }
}
if(cookie == null){
  // Cookieが取得できなければ
  %><p><a href = "login.jsp">ログイン</a>してください</p><%
}else{
  // Cookieが取得できれば
  String user_id = URLDecoder.decode(cookie.getValue());
  // URLDecoderを使って,Cookieの情報をデコードする.

まぁそんな難しい事はしてませんので,コメントとか読めば仕組みはわかるはずです.ただ,コメントの書き方が下手ですけど.


最後の処理,

String user_id = URLDecoder.decode(cookie.getValue());

ですが,本来ならCookieの情報をdecodeして,んでその文字列なんてのは定められたフォーマットなんだろうから,一旦適当な文字列に落とし込み,パースしてごにょごにょ,ってするのが正しいんでしょうね.今回の場合,CookieにはユーザIDしか書き込んでいないので,簡単です.

Cookieの危険だと思う所

ここ.

// Cookieを読み込む
Cookie cookies[] = request.getCookies();

これは結局,クライアントのブラウザにある全てのCookieを,このcookiesっていう配列にゴソッと読み込んでる訳ですよね.てことは,そのcookiesの中に,例えばですけど,とあるウェブサービスのユーザIDやパスワードやらといった情報が「hoge」という名前で記録されているとすれば,悪意のあるサイトでCookieを読み込まれ,その中から「hoge」というCookieを読み込まれたりすれば,「駄目じゃん」で済まない自体に陥りますよね.
ですから,Cookieを発行するときは,せめて暗号化(もちろんMD5のように暗号化オンリーではなく,読み込んで複合化出来るように)しないといけませんね.


ちなみに,ボクのブラウザのCookieの中には,古いFC2の掲示板のなんですけど,書き込んだ名前とパスワードがしっかりと読める状態でありました.こえー.