入力された値をチェックするために、あらかじめ受付可能な文字などを指定しておく方式です。不正なパターンを防ぐ「ブラックリスト」よりもチェックは厳しくなります。
1 2 3 4 5 6 7 8 9 10 |
<?php $word ="Google"; $whitelist = array("Google","Yahoo","Facebook"); if( in_array($word,$whitelist) ) { echo "一致しました"; }else{ echo "一致しません"; } |
4行目
$whitelistに、あらかじめ入力可能なホワイトリストを配列で用意しています。
スポンサーリンク
クロスサイトスクリプティング(XSS)対策
htmlspecialchars関数はHTMLテキスト用のエスケープ関数なので万全ではありません。例えば、 入力された値を、<a href=”◯◯◯”>sample</a>の◯◯◯のようなタグの中で出力する場合は、htmlspecialcharsだけでは対処できません。
試しに javascript:alert(‘Test’) という文字列が入力された場合を想定して、下記のコードのようにa hrefの属性に出力させてみます。$xssはhtmlspecialchars関数を通していますが、ブラウザで表示させるとアラートが表示されてしまいます。
1 2 3 |
<?php $xss = "javascript:alert('Test')"; echo '<a href="'.htmlspecialchars($xss, ENT_QUOTES).'">link</a>'; |
このような場合は、入力時に正規表現でjavascriptが入っていないかをチェックしたり、「http://」や「https://」で始まる文字列のみを出力するなどのホワイトリスト方式によるチェックが必要となります。
ホワイトリスト方式によるチェック
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php function urlCheck($url) { if (!preg_match('/^(https?:\/\/.+)$/', $url)) { return false; } return true; } $xss = "javascript:alert('Test')"; if(urlCheck($xss)){ echo '<a href="'.htmlspecialchars($xss, ENT_QUOTES).'">link</a>'; }else{ echo "不正を検知しました。"; } |
関連ページ
クロスサイトスクリプティング(XSS)[htmlspecialchars]