今回解説するWebアプリケーションのバリデーションの欠陥はPHPに限った問題ではありません。多くのプラットフォームのWebアプリケーションで見過ごされているバリデーション仕様の欠陥です。それは文字エンコーディングのチェックです。
文字エンコーディングバリデーションの必要性
筆者の知る限りでは,
文字エンコーディングを利用した攻撃自体は当時でも新しい攻撃手法ではありませんでした。文字エンコーディングを利用した攻撃は,
意図している通りの正しい文字エンコーディングが利用されているか確認することの重要性は随分昔から
データベースシステムの場合
データベースシステムの場合,
以来, しかし, 現在でも, シングルバイト圏の開発者に, データベースシステムの場合, Webアプリケーションの場合, これらの攻撃が文字エンコーディングを利用して行われる可能性があります。 不正な文字エンコーディングの利用を許してしまうと, システムへ与える影響を考えれば, ユーザからの入力チェックは入力を受け入れるアプリケーションの責任です。出力を受け入れるアプリケーションが正しく処理できるよう, ユーザが正しい文字エンコーディングで出力してくれる, 文字エンコーディングのバリデーションとは異なる問題ですが, 文字エンコーディングのチェックは, チェックは必ずリクエスト処理の最初に行われる入力バリデーション処理で行い, PHPの場合, 入力のバリデーション例
文字エンコーディングバリデーションの重要性に対する無理解
文字エンコーディングを正しく扱わないリスク
文字エンコーディングのバリデーション
<?php
function _validate_encoding($val, $key) {
if (!mb_check_encoding($key) || !mb_check_encoding($val)) {
trigger_error('Invalid charactor encoding detected.');
exit;
}
}
$vars = array($_GET, $_POST, $_COOKIE, $_SERVER, $_REQUEST);
array_walk_recursive($vars, '_validate_encoding');