読者です 読者をやめる 読者になる 読者になる

テクデップ(Techdep)

コンピュータ、プログラミング、DTP(InDesign)に関する備忘録

Webアプリケーションのアンチパターン

 業務で、Webアプリケーション(.NET化以前のaspとそれに連携するVB6.0という化石)を弄る日々だが、不幸なことにそれらはアンチパターンの集積である。今日は筆者が今まで見てきたWebアプリケーションのアンチパターンについて列挙したい。

モノシリックなファイル、関数

 引数取得、制御、DBクエリの発行と取得、データ加工、HTML出力まで全部が一つのファイル(もしくは関数)に詰め込まれたもの。所謂MVCパターンで言うところのコントローラ、モデル、ビューが渾然一体となったものか。見栄え、制御、処理が一箇所に記述されているわけだから、改修をするときにどこを改修すべきなのかが判別できない。
 もちろん、極めて小さなWebアプリケーションであれば、分割せず一つにしたほうがいいかもしれない。
 

不明瞭なレイヤー分割

 長くなったコードを適当に分割するとこれに陥りやすい。上記と同様に改修時に地獄を見る。
 

データベースクエリの乱発

 データベース廻りは注意深く設計しても、改修を重ねるうちに混沌としやすい。フレームワークなるハイカラなものを利用すれば結構抽象化できるが、そうでない環境で何も考えずにデータベースクエリを乱発すると、当然見通しが悪くなる。データベースから取るべきデータ項目や取得条件が変ったら、該当する箇所を全て洗い出して修正する必要が出てくる。
 筆者がいじっている化石は、機能モジュールごとにそれが使用するDBアクセス関数(実体はクエリのベタ書き)を集めたファイルが十数個もあるので、状況は上記と似た様なもの。むしろ、もっとひどい。当然、誰もDB周りを把握できていない。

参考:DAOの悪夢

引数が多すぎる関数

 引数がたくさんある関数は使用する側にとっては相当面倒な代物。その様な関数がたくさんあると……。十個以上の引数の並び順や型なんぞ誰も覚えられない。さらに関数ごとに引数の並び順に規則がない場合、ますます大変なことになる。

長すぎるGetパラメータ

 RFC*1、Getパラメータに限度はないそうだが、ブラウザで制限を設けていることもある。現にInternet Explorerは約2000字が限度だ*2。何でもかんでもGetパラメータに渡してしまって制限長を超えると、データ送信は不完全になる。
 

ファイル名をパラメータとして渡す

 パラメータ名をそのままファイル名として開く処理があると特に危険である。情報漏洩の原因になりやすい。全く対策をしていなければ、ディレクトリトラバーサル攻撃も可能。

グローバル変数の多用

 説明不要だろう。オブジェクト指向でいうところのstaticおじさん。そもそも、グローバル変数を多用するおじさんがstaticおじさんに変貌したわけだが。

ファイルのロック処理がない

 Webアプリケーションというのは複数人で利用されるものである。複数人が共有するファイルを読み書きするときにロックは必ず掛けること。

URLエンコード(あるいはデコード)をしない

 日本語が入力されないから不要? 空白や特殊記号類もURLエンコードの対象である。特殊文字が入ったデータをエンコードせずにURLクエリとして渡すと、データの取得が思った様にできなくなる。
 

特殊文字処理をしない

 論外。外部公開されるシステムであると、コマンドインジェクション、SQLインジェクションの練習場になってしまう。フレームワーク特殊文字処理が組み込まれているのであれば、それに任せる方向が無難。いちいち自前で書いていたら漏れが起きる。
 
 大体、このようなものだろうか。実装上のアンチパターンの一部は放置するとセキュリティ上の重大な危機を招きうる。設計上のものは後々の改修時で大変なことになる。Webアプリケーションを作った結果、上記の様な状態になってしまったら、設計なり実装なりを見直そう。