[PHP-users 31474] Re: value属性への変数展開

kanonbell kanonbell.sky @ gmail.com
2007年 2月 17日 (土) 14:45:59 JST


こんにちは。

須山さんのやり方は、考えてることは同じだけど微妙に違うかな?
私はGETやPOSTの入力時にはエスケープ処理などは行ってません。
あくまで出力時のみ。

GETやPOSTで渡されたデータはそもそもどんな用途に使用するかファイル
ごとに違うので。

・入力時
php.iniでエラー出力がALLのときにNOTICEが出ないようにするためと、
値が渡されていない場合はNULL値を入れておきたいので入力処理
用の関数をくぐらせる。エスケープなどの処理は行わない。

・出力時
HTMLであればhtmlspecialcharsする関数経由で出力
SQLはPrepared Statementするので特にいじらず。
シェルコマンドなどで使用する場合にもエスケープ処理などが必要に
なりそうですが、これはまだやったことないです。

入力時にNULL値入れてるのは、''(空白。値なし)とでSQL生成時に
違いが出てくるためです。ADOdbでPrepared Statementしてるんですが、
NULL値をパラメータとして渡すためにこうしてます。
SQL生成の出力時にやった方がいいかな?という気もしてるのでそのうち
変えるかもですけど。

システム固有の禁則処理とかが必要な場合は入力処理の後に別の
関数あたりで適宜処理してます。

出力がHTML以外全くないなら入力時にまとめてやってしまってもいいとは
思いますけれど、どの値を許容し、どの値をエスケープするかは作るもの
によって違ってきたりするので、それによって構造が変わったりしないように
このようなやり方をしています。
また、入力の後に値をチェックすることもよくあるので、入力と出力は
明確に処理部分を分けています。


こうした方がよりコーディングミスが減らせそうなのと、書き方が共通して
いれば可読性も多少なりあがるかなと思いまして。
まあ、しばらく間を置いて見ると、自分のかいたソースでも勘所すっかり
忘れてますので、機能追加や修正するときに問題が発生しにくいかな、
と考えています。


07/02/17 に Ryo Suyama<ryo @ spais.jp> さんは書きました:
> 須山です。
>
> 僕も htmlspecialchars 毎回書くのは面倒だと思うタイプなので、そもそも
>
> $valid_post = valid($_POST); //パラメータの検証を行い無害化したデータを返す
> echo '<input type="text" value="'.$valid_post['username'].'"name="username" />"';
> echo '<input type="text" value="'.$valid_post['job'].'"name="job" />"';
> echo '<input type="text" value="'.$valid_post['hobby'].'"name="hobby" />"';
>
> と、出力する HTML コードを作る前の段階で検証すべきパラメータはいっぺんに
> 検証してしまっています。
>
> こうすることで「ああ、このパラメータ変換するの忘れてた!」なんていうこと
> もなくなるかと思います。
>
> ┌─┬─┬─┬┬─┐
> │─┤─│─├┤─┤
> ├─│┌┤││├─│
> ├─┴┘└┴┴┴─┤
> │    須山  亮    │
>ryo @ spais.jp>http://spais.jp/│
> └────────┘
>
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://www.php.gr.jp/php/novice.php3
>


PHP-users メーリングリストの案内