PHPでアンケートフォームやメールフォームを設置する場合に、POSTされたデータの処理を考えます。
作業する度に、毎回考えさせられるような事なので、ここでメモとして残しておきます。
まず、POSTされたデータは、DBに格納する、ファイルに書き出す、メールで送信するなどのアウトプットが考えられるので、それぞれに応じた文字コードに変換してあげる必要があります。例えば、UTF-8に変換したいのであれば以下のように処理します。
mb_convert_encoding($str, "UTF-8", "auto");
次に、POSTではhtmlタグなどを送られることがあります。掲示板などでは自由にhtmlタグを許可すると、意図しない画像やリンクを貼られる恐れがあります。そこで特殊文字をHTMLエンティティに変換します。こちらについては以下のように処理します。
htmlspecialchars($str);
あと曲者としてはPHPの機能である「magic quotes」ですね。これは悪意のあるSQLを埋め込まれないよう、シングルクォート「’」を「’」にエスケープするものです。SQLインジェクション対策なんてのはDB接続ライブラリなんかで処理すればよいものなので、こんな機能は使いません。実際、PHP6ではこの機能の廃止が決まっているようです。
サーバ設定などでこの機能が有効となっている場合があるので、その場合は戻し処理をする必要があります。「get_magic_quotes_gpc()」でサーバ設定で有効になっているかどうかを判定して、真の場合はエスケープ文字を取り除く「stripcslashes($str)」。
上記の処理を関数としてまとめました。
function enc($str){ $str = htmlspecialchars(mb_convert_encoding($str, "UTF-8", "auto")); if(get_magic_quotes_gpc()){ $str = stripcslashes($str); } return $str; }
ちなみに、テキストエリアで入力されたものをHTML画面上に出力する場合は、改行コードを<br />タグに置換する処理を加えてあげればよいですね。
$str = nl2br(enc($str));
コメントする