« 今日のお題:「祝日判定」 | トップページ | ereg使っちゃいけません(ダメダメ♪ダメーッ) »

見やすいPHPコードの書き方(但し我流)

あちらのほうで書いたとおり、昨日参加してきました、わんくま東京勉強会#38
そこでのライトニングトークの2本目で話した内容についてです。

ちなみに当日使ったスライド(PDF)
まぁ、ソースがわりとひどかったりします(苦笑)。
設定読むのにglobal使ってたりとか、SQLを複数行に分けてかくときの処理が割とひどいとか・・・ねー。
実は当日会場で作ったスライドで、5分という限られた時間のなかでおさえておきたいところだけを言ったんで、細かいところがいろいろとおかしかったりもしますが、そこんとこはご容赦をー。

最近はPHPでもいいフレームワーク(CakePHPとかsymfonyとか)があるのでそちらに頼ればいいんですが、頼らなくても十分なケースは多々あったりするもので、そのときに注意したいことをいろいろと話してみました。

要約するとこう。
(1)入力から処理されるまでのロジック(コード)と、表示ロジック(HTML)は分けよう
 コードは前半、表示は後半にはっきりわける。
(2)コード処理では以下の順番で書く
 ・共通で読み込む処理
 ・GET/POST/COOKIEからの取得、ならびに値のvalidation check。
  あらかじめ、ここで使用する全部の引数に対して、まとめて行っておく。
  そのときそのときでやると、ミスする可能性が大きいからです。
  ※validation checkしてから、実際に使用する変数に代入するとなおよし
  (私はこの方法でやってます。チェックずみかどうかを意識したいので)
   ↑これ、言い忘れてましたw
 ・入出力データの処理
  GET/POST/COOKIEのデータ、ファイル、データベース・・・
(3)表示部分は表示処理(とそれに必要かつ表示にしか使用されない処理)に徹する。
 ・HTMLタグに使われる文字のエスケープは必須(一部例外を除く)
  ・ちなみにエスケープ関数は自前で書いてます。
   以前htmlspecialcharsを使ったら動作がキモかったので・・・。
(4)データ入出力で特にデータベースを使う場合は、別に関数、出来ればクラスを定義してそこで集中して処理させる
 ・・・はい、メイン部分でSQLを意識しちゃダメです(笑)。
 個人的にはクラス作ってそこで処理させるのが非常に望ましいと思ってます。データの代入・取得とDBへの登録/DBからの取得を1つのインスタンスで出来ちゃうので。
 ただ、PHPのクラスは「あとづけ」的かんじがして結構醜い(笑)部分がありますが、そこさえ我慢すれば十分使えると思います。
 SQLの特別文字のエスケープはこのクラス/関数内で。SQLを生成する段階でエスケープさせます。
(5)変数名のつけかたに(極力)ルールを持たせる
 ・私自身の場合、実体データ、配列、表示用データ、クラスのインスタンス、クラス内変数、・・・・といろいろありますが、先頭1〜3文字でわかるようにしています。

話した内容+αは、ここまでー。


あと言いわすれていましたが、これは言っておきたいんで。
・入ってくるデータは信用してはいけない。
 特にid等に関しては「○○は弾く」ではなく「○○しか認めない」方式にする。
・「magic_quotes_gpc」はオフにすべき。
 正直、入力チェックを徹底している場合、「¥」を勝手に挿入される→取り除くための処理で、かえって邪魔で余計なバグを増やすだけなので(笑)。

今回の件で読んでおいてほしいページとか
@IT:クロスサイトスクリプティング対策の基本
今夜分かるSQLインジェクション対策 - @IT
クッキーに隠されたSQLインジェクション、対策は? - @IT
または、このへんに関連した各サイト。たまに読み返すといいと思います。


参考になりそうなサイト。というかクラスの話が出たので、
@IT:オブジェクト指向の世界(10)
 このへんは、技術というよりは哲学の話ですねー。

|

« 今日のお題:「祝日判定」 | トップページ | ereg使っちゃいけません(ダメダメ♪ダメーッ) »