php(cakephp)のセキュリティ実装に関する質問です。

以下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するように同じ場所で処理したほうがいいという
認識であっていますでしょうか。

どうぞよろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/02/06 01:35:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:oil999 No.1

回答回数1728ベストアンサー獲得回数320

ポイント50pt

のような実装の流れと考えましたが、その認識はあっていますでしょうか。

合っています。

まず、バリデーションチェックします。
たとえばログイン文字として許しているのが半角英数字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からの入力データをサニタイズする目的ではあまり使われません。

【参考】データのサニタイズ(CakePHP公式)

http://book.cakephp.org/2.0/ja/core-utility-libraries/sanitize.html

id:pretaroe No.2

回答回数531ベストアンサー獲得回数75

ポイント50pt

>php(cakephp)のセキュリティ実装
>あまり上記のセキュリティの脆弱性を考えられたコードがないの
方針によるかと思います。

・POSTなどの受け取り時の処理
・SQLを発行する前の処理
・WEBに出力する時の処理

を決めて、ルールを決め、ルールを徹底するために、ラップ関数などを作るなどするかと思います。


>あと、sanitize::cleanは、制御文字はエスケープしないと思うので
>さらに、制御文字をpreg_replaceするように同じ場所で処理したほうがいいという
>認識であっていますでしょうか。

POSTなどの受け取り時の処理で、改行を取り除くと決めたなら
質問通りの処理で問題ないと思います。

正解は何通りもある問題なので、あとは選択の問題です。

チェックは必ずリクエスト処理の最初に行われる入力バリデーション処理で行い,不正な文字エンコーディングを検出した場合にはリクエスト処理をエラーにして終了させます。サニタイズして処理を継続してはいけません。不正な文字エンコーディングの不都合がある部分だけを取り除くと,別の問題が発生する場合があるからです。

PHPの場合,文字エンコーディングが正しい文字エンコーディングであるかチェックするための関数,mb_check_encoding関数を利用して,入力チェック時にすべての文字列の文字エンコーディングが期待している文字エンコーディングとして妥当であるかチェックします。
http://gihyo.jp/dev/serial/01/php-security/0027

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません