2011年05月21日 Category:PHP

フォームから送られた値をエスケープするPHPの関数

PHPマスターとなるべく勉強中です。現在のレベルは初心者に毛が生えた程度。

最初の第一歩として、PHPでメールフォームを作ることに挑戦している。
メールフォームでは、送信されたvalueの値をエスケープ処理する必要がある。
なので、関数にしておけば後々使えるかもしれないと思ったので作ってみた。

フォーム用エスケープ関数

function escapeDate($post){
 $escapeArr = $post;
 foreach($escapeArr as $key => $val){
  if(!(is_array($val))){
   $val = htmlspecialchars($val, ENT_QUOTES, 'UTF-8');
   if (get_magic_quotes_gpc()) {
    $val = stripslashes($val);
   }
   $escapeArr[$key] = $val;
  }
 }
 return $escapeArr;
}

引数で渡された配列をforeachで回して、フォームのvalueを

htmlspecialchars(HTMLエスケープ)とstripslashes(バックスラッシュを取り除く)

の2つの関数に通してます。

4行目のif文でvalueが配列だったらforeachの中身を丸ごとスキップしているのは、
htmlspecialchars関数が引数に配列を渡すことができないから。

<input type="checkbox" name="check[]" value="チェック01" />チェック01

上のようにname属性にチェックボックスは『[]』をつけて、配列として受け取らないといけない。
今回の話とは違うけど、この仕様に気づかなくてちょっとハマッた。

とにかくこれで関数を実行してやれば、エスケープが一気に終了する。

//エスケープ関数の実行
$postData = escapeDate($_POST);

これだけやっておけば絶対安全!…というほどエスケープ処理は単純な話じゃなさそうだけど、だいたい大丈夫なはず。

ついでにこの関数を作るために使っていた「エスケープお試しフォーム」のソースも張っておく。
コピペするだけで使えます。

<h1>エスケープお試しフォーム</h1>
<table>
<form action="<?php $_SERVER["PHP_SELF"]; ?>" method="post">
<tr><td>
<input name="name" type="text" value="<h1>テキストのテスト</h1>" />
</td></tr>
<tr><td>
<textarea name="textarea" cols="40" rows="3">
<h1>h1見出し</h1>
 
<script type="text/javascript">
alert('アラート');
</script></textarea>
</td></tr>
<tr><td>
<input type="checkbox" name="check[]" value="チェック01" />チェック01
<input type="checkbox" name="check[]" value="チェック02" />チェック02
<input type="checkbox" name="check[]" value="チェック03" />チェック03
</td></tr>
<tr><td>
<input type="submit" value="送信" />
</td></tr>
</form>
</table>
 
<?php
//エスケープ関数
function escapeDate($post){
 $escapeArr = $post;
 foreach($escapeArr as $key => $val){
  if(!(is_array($val))){
   $val = htmlspecialchars($val, ENT_QUOTES, 'UTF-8');
   if (get_magic_quotes_gpc()) {
    $val = stripslashes($val);
   }
   $escapeArr[$key] = $val;
  }
 }
 return $escapeArr;
}
 
//エスケープ関数の実行
$postData = escapeDate($_POST);
 
echo '<p>';
echo '関数を通した場合<br />';
foreach($postData as $key => $value){
 if(is_array($value)){
  foreach($value as $arrKey => $arrVal){
   echo 'arrKey:'.$arrKey.'<br />arrVal:'.$arrVal.'<br /><br />';
  }
 }else{
 echo 'key:'.$key.'<br />value:'.$value.'<br /><br />';
 }
}
echo '関数を通さない場合<br />';
foreach($_POST as $key => $value){
 if(is_array($value)){
  foreach($value as $arrKey => $arrVal){
   echo 'arrKey:'.$arrKey.'<br />arrVal:'.$arrVal.'<br /><br />';
  }
 }else{
 echo 'key:'.$key.'<br />value:'.$value.'<br /><br />';
 }
}
echo '</p>';
?>

最後に見つけてしまった


function myhtmlspecialchars($string) {
    if (is_array($string)) {
        return array_map("myhtmlspecialchars", $string);
    } else {
        return htmlspecialchars($string, ENT_QUOTES);
    }
}

配列以外にも対応しているし、かなりすっきりしてる。
array_mapっていうのを知らなかった。
精進します…。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

トラックバックURL

Page Top