Security(セキュリティ)

PHP脆弱性対応:フォームのセキュリティー対策 入力値の妥当性チェック

前回のXSS脆弱性対策(セキュリティー対策)の続きで、

今回は入力値の妥当性チェックについてです。

 

しっかりとチェック処理を入れておかないと、

スパムメールの踏み台にされたりフィッシング詐欺メールの送信処理に使われてしまいます

 

それで、

妥当性チェックといっても、

チェックすることは多すぎて大変です!!

 

例えば、

メールアドレスが正しく入力されているかをチェックする場合には、

<?php
/*
*説明:メールアドレスの形式をチェックする
* IN :$mail チェック対象となるメールアドレス
* OUT:エラーが無ければ「true」、エラーがあれば「false」を返す
*/
function checkMailAddress($mail = ""){

 if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $mail)){

  return true;

 }else{

  return false;

 }

}
?>

という関数を作成して、

<?php
if(!checkMailAddress($mail)){
  echo "メールアドレスを半角英数字で正しく入力してください。";
}
?>

とすればチェックできます。

 

ただし、

メールアドレスのチェックは本来はこれだけでは不十分で、

完全なチェックコードを書くのは相当な作業量になるようです。

 

また、

電話番号だと、

<?php
if(preg_match("/^0\d{8,9}$/", $tel_num)){

  return true;

}else{

  return false;

}
?>

とします。

 

これは、

「0」から始まり、9桁もしくは10桁で入力されていることを確認しています。

 

これは

数字のみ入力を許可する場合の処理で、

例えば「-」付きの電話番号をチェックする場合には、

<?php
if(preg_match("/\d{2,4}-\d{2,4}-\d{4}/", $number)){

 return true;

}else{

 return false;

}
?>

となります。

これはファックス番号もほとんど同じです。

 

因みに携帯電話だと、

<?php
/*
*説明:携帯番号の形式をチェックする
* IN :$number チェック対象となる携帯番号
* OUT:エラーが無ければ「true」、エラーがあれば「false」を返す
*/
function checkKeitaiNumber($number = ""){

 if(preg_match("/^0(7|8|9)0\d{8}$/", $number)){

  return true;

 }else{

  return false;

 }

}
?>

で対応可能だと思います。

 

その他にも、

名前やふりがなに全角以外の文字が入っていないかは、

<?php
/*
*説明:全角文字のみかをチェックする
* IN :$string チェック対象となる文字列
* OUT:エラーが無ければ「true」、エラーがあれば「false」を返す
*/
function checkHalf($string){

 if(mb_convert_kana($string, "AK", "文字コード") != $string){

  return false;

 }else{

  return true;

 }

}
?>

という関数で対応しています。

mb_convert_kanaでの変換前の文字列と変換後の文字列とで差異が出れば、

全角以外が混ざっていると判定しています。

 

その他にも、

例えば、性別を問うラジオボタンを設けた場合、

性別は「男」か「女」だけなので、

それ以外の値が送られてきていないか?

 

また、

郵便番号は「3桁-4桁」で入力されているか?

 

数字のみのを入力する項目は半角数字で入力されているか?
※is_numeric()関数でのチェックだとまずいらしいので、正規表現でチェックして下さい。

 

年齢であれば、3桁以内の半角英数のみで入力されているか?
※「preg_match("/^\d{1,3}$/", $age)」とすればOK!!

 

入力された日付けは妥当か?
※日付けはcheckdate()関数を使えば便利ですね!!

 

などのチェックが必要です。

 

それと、

テキストボックスの項目には必ず「maxlength="xx"」を設定しておき、

設定したmaxlength以上の文字数のテキストが送られてきていないか?

のチェックも必要です。
※「maxlength」の値は、ブラウザ上で簡単に改変できます。

 

取り敢えず、

妥当性チェックといってもチェックすることは山程あり、

結構面倒な作業ではあります。

 

この記事を書いている人
株式会社ディープ
名前足立拓也

メールアドレスadachi@deep-deep.jp

関連記事

最近の記事

  1. PHP(ピー・エイチ・ピー)
  2. レンタルサーバ:おすすめの共用サーバ
  3. ホームページ(homepage)
  4. システムアップデート
  5. エックスサーバー(XSERVER)
  6. エックスサーバー(XSERVER)
  7. エックスサーバー(XSERVER)
  8. WEBサイト構築
  9. スパム(SPAM)対策
  10. サイト公開

Twitter

ダッチ@職業ブロガー兼プログラマー
@gatsu0000

  • うちの会社も時々ランサーズ使ってるけど、めっちゃ助かってます! 中小は、人件費のような固定費がかさむのは痛くてなかなか新しい人を採用できんから、 必要な時にお互いマッチングして仕事を依頼できるのはありがたいです。 創業者からのメ… twitter.com/i/web/status/1…
    about 8時間 ago via Twitter Web Client

アーカイブ

PAGE TOP