validation


クライアントととのデータ受渡しの際に行う必要があるバリデーションについての自分メモ。

一般的なvalidation関数

htmlspecialchars
  htmlspecialchars
  @param  string 処理対象文字列
  @param  int    処理オプション(default ENT_COMPAT)
  @param  string 変換文字セット(default true)
  @param  bool   気にしない
  @retval string

&, ', ", <, > をHTMLエンティティに変換する事が出来る


第2引数

  • ENT_CMOPAT(2)  :シングルクウォートを変換しない
  • ENT_QUOTES(3)  :全て変換する
  • ENT_NOQUOTES(0) :シングルクウォート、ダブルクウォートを変換しない

  ※ PHPのコアな定義済み定数で、()の中は実体値
    => get_defined_constant で定義済み定数を取得可能。
    基本的には ENT_QUOTES を使う。


第3引数
不正な文字エンコーディングを利用した攻撃を防ぐためにも指定した方が良い。

htmlspecialchars ( $str, ENT_QUOTES, 'UTF-8' );

もしくは

htmlspecialchars ( $str, ENT_QUOTES, mb_internal_encording() );


■ htmlspecialchars 変換表

変換前 htmlspecialchars ($str) htmlspecialchars ($str, ENT_QUOTES)
& &amp; &amp;
&lt; &lt;
> &gt; &gt;
" &quot; &quot;
' ' &#039;
htmlentities
  htmlentities
  @param  string 処理対象文字列
  @param  int    処理オプション(default ENT_COMPAT)
  @param  string 変換文字セット(default true)
  @param  bool   気にしない
  @retval string

htmlspecialchars よりも詳細にHTMLエンティティ化を行う。
htmlspecialchars が5つ程度の変換なのに対して、htmlentities は100個の文字を変換する
※ get_html_translation_table で変換テーブルを取得可能

=> 逆変換は html_entity_decode

addslashes
  addslashes
  @param  string 処理対象文字列
  @retval string

バックスラッシュ(¥), NULL(¥x00), ', "  をエスケープ処理する。

mysql_real_escape_string
  mysql_real_escape_string
  @param  string   処理対象文字列
  @param  resource DBリンク
  @retval string

MySQLにデータを投入する場合は基本的にこれを通した方が良い
¥00, ¥n, ¥r, ¥, ', ", ¥x1a(EOF)  をエスケープ処理する。


■ addslashes, mysql_real_escape_string 変換表

変換前 addslashes mysql_real_escape_string
¥x00 ¥0 ¥0
   
' ¥' ¥'
" ¥" ¥"
¥n   ¥n
¥r   ¥r
¥x1a   ¥Z

validation の一般関数化

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