以下ipaサイトの7-(ii)に、
”外部からの入力の全てについて、改行コードを削除します。あるいは、改行コードだけでなく、制御コ
ード全てを削除してもよいかもしれません。” とあります。
http://www.ipa.go.jp/security/vuln/documents/website_security.pdf
それで、textareaは無い前提で、例えば、ログインというアクションの実装した場合を考えた場合
のようなコードが考えられますが、その場合、
バリデーション処理
↓
$this->dataの改行文字(or制御文字をreplace)
↓
ログイン処理
のような実装の流れと考えましたが、その認識はあっていますでしょうか。
(ネットのいろんなページで、サンプルコードがありますが、
あまり上記のセキュリティの脆弱性を考えられたコードがないのか、
それとも私の考えが至らないのか、Sanitize::cleanとか見ないので、
疑問に思いました。)
あと、sanitize::cleanは、制御文字はエスケープしないと思うので
さらに、制御文字をpreg_replaceするように同じ場所で処理したほうがいいという
認識であっていますでしょうか。
どうぞよろしくお願いします。
合っています。
まず、バリデーションチェックします。
たとえばログイン文字として許しているのが半角英数字8~12桁であるなら
preg_match('/^[a-zA-Z0-9]{8,12}$/', $data);
のようにして、正規表現でマッチングさせるとシンプルで応用範囲も広いです。
バリデーションチェック後は、ユーザー側にエラーを送って再入力を促します。
バリデーションチェックができていればサニタイズの必要はありませんが、もしやるのであれば、たとえば制御コードのみを取り除くのであれば、正規表現を使って
$data = preg_replace('/[\x00-\x1f\x7f]/', '', $data);
とやることが多いです。
Sanitize::cleanは、SQLインジェクション対策が主な目的であることと、v.1.1と1.2で挙動がだいぶ違っていることから、HTMLからの入力データをサニタイズする目的ではあまり使われません。
http://book.cakephp.org/2.0/ja/core-utility-libraries/sanitize.html
>php(cakephp)のセキュリティ実装
>あまり上記のセキュリティの脆弱性を考えられたコードがないの
方針によるかと思います。
・POSTなどの受け取り時の処理
・SQLを発行する前の処理
・WEBに出力する時の処理
を決めて、ルールを決め、ルールを徹底するために、ラップ関数などを作るなどするかと思います。
>あと、sanitize::cleanは、制御文字はエスケープしないと思うので
>さらに、制御文字をpreg_replaceするように同じ場所で処理したほうがいいという
>認識であっていますでしょうか。
POSTなどの受け取り時の処理で、改行を取り除くと決めたなら
質問通りの処理で問題ないと思います。
正解は何通りもある問題なので、あとは選択の問題です。
■
チェックは必ずリクエスト処理の最初に行われる入力バリデーション処理で行い,不正な文字エンコーディングを検出した場合にはリクエスト処理をエラーにして終了させます。サニタイズして処理を継続してはいけません。不正な文字エンコーディングの不都合がある部分だけを取り除くと,別の問題が発生する場合があるからです。
PHPの場合,文字エンコーディングが正しい文字エンコーディングであるかチェックするための関数,mb_check_encoding関数を利用して,入力チェック時にすべての文字列の文字エンコーディングが期待している文字エンコーディングとして妥当であるかチェックします。
http://gihyo.jp/dev/serial/01/php-security/0027
コメント(0件)