1月11日(木)1、2コマ目

今日、やったこと

  • 入力チェック
  • セッションオブジェクト、セッションID

今日のホワイトボード

入力チェックが必要なわけ

下図のように変な値が入力されるとプログラムが停まるから入力チェックをするわけではない。(当然このような場合の入力チェックも必要)

図 入力チェックが必要なケース

下図のように入力される内容によっては重大なインシデント発生につながることを防ぐために入力チェックを行う。

図 入力チェックが必要なケース(SQLインジェクションが発生する)


空白チェック用メソッド

JavaのStringクラスにはisEmpty()やisBlank()があるが、いずれもインスタンスメソッド。

変数がnullの場合はNullPointerExceptionをスローする。よって、まずnullチェックが必要。

StringUtilsクラスのisEmpty()やisBlank()はクラスメソッド。チェック対象がnullならfalseを返すだけ。

図 空白チェック用メソッド

入力チェックで正規表現を使う

StringUtilsクラスのisXXX()メソッドには以下のようなメソッドが用意されている。
メソッド 役割
isAlpha() アルファベット(大文字・小文字)以外を含むとfalse
isNumeric() 数字以外を含むとfalse
isAlphanumeric() アルファベット(大文字・小文字)、数字以外を含むとfalse

これらのメソッドでチェックできない場合は正規表現を使う。
図 正規表現のパターン

パスワード要件は半角数字、英字(大文字・小文字)、記号を4文字以上。
記号が厄介。
文字は結局ASCIIコードに従って数値化される。よって記号もASCIIコード表を見れば、数字やアルファベットと同じように範囲で指定できる。
ただし、正規表現の機能が割り当てられている[や{はそのまま書くとNG。
本来の[や{として評価するには正規表現の機能をエスケープさせる必要がある。
正規表現の機能をエスケープするには\を使う。ただ、\自体も昨日が割り当てられているので、\\と書く必要がある。
図 半角数字、英字(大文字・小文字)、記号を4文字以上を正規表現で表す

セッションオブジェクト、セッションID

サーバー側で各クライアント毎に用意されるセッションオブジェクトを正しいクライアントと紐づけるためにサーバー側、クライアント側でセッションIDを共有している。
クライアント側はサーバーから渡されたセッションIDをCookie(クッキーと呼ぶ)に保存する。
図 セッションID、セッションオブジェクト
クライアントはサーバーにリクエストする際、Cookieも一緒に送信する。サーバーは受け取ったCookieからセッションIDを取得し、紐づけるセッションオブジェクトを探す。

セッションハイジャック

クライアントとサーバーでやり取りされるセッションIDは盗聴可能。
悪意を持った人がセッションIDを盗聴し、自分のブラウザに組み込めば(これも簡単)、他人のセッションを横取りできる。これをセッションハイジャックと呼ぶ。
図 セッションハイジャック
セッションハイジャックで他人のAmazonにログイン中のセッションを横取りすれば、他人の支払いでほしいモノを買うことができる。

HttpServletRequestのgetSession()

セッションオブジェクトを取得するためのgetSession()は引数違いで3パターンの呼び出しがある。
図 getSession()メソッド
ポイントはセッションオブジェクトがないときの振る舞い。
getSession()、getSession(true)は新規セッションオブジェクトを生成して返す。
getSession(false)だけnullを返す。
必要に応じて使い分けること。

今日のソースコード

昨日からの差分をあげておきます。

[exceptionパッケージ]NotFilledExceptionクラス

おなじみの未入力時にスローする検査例外クラス。

[exceptionパッケージ]InvalidPasswordExceptionクラス

パスワード要件を満たしていない時にスローする検査例外クラス。

[daoパッケージ]UserDAOクラス

変更なし

[bllパッケージ]Serviceクラス

変更なし

[bllパッケージ]PasswordUtilクラス

変更なし

[presentationパッケージ]IndexSrvクラス

入力チェックを追加。
認証成功後、セッションIDを変更。

[JSPページ]index.jsp

ユーザー名、パスワード入力用<input>タグに"required"属性追加=>未入力時にエラー表示。

次回は

サニタイジングとフィルタを追加。





 

このブログの人気の投稿

1月12日(金)1、2コマ目

1月29日(月)3、4コマ目

1月9日(火)1、2コマ目