【PHP】ユーザーからの入力はhtmlspecialchars()を使ってエスケープしよう!
今回は「htmlspecialchars()」についてです。
・ユーザーからの入力をそのまま表示するサイトを作ってはいけない
・セキュリティの観点から。
・じゃあどうすれば?「エスケープ」しよう!
特殊文字とは?
“ ダブルクォーテーションマーク " これで表す
‘ シングルクォーテーションマーク ' これで表す
< (小なり記号) <
> (大なり記号) >
などの、
・HTMLのコードとして意味を持つもの
エスケープとは?
・HTMLエンティティ を使って特殊文字を変換してあげること
HTML文書内で特定の文字や記号を表現するために使用される特殊な記述形式のこと
ブラウザはこれを解析し、対応する実際の文字に置き換えて表示します。
これは、技術的には「文字参照(character reference)」と呼ばれ、アンパサンド(&)で始まり、セミコロン(;)で終わるという形式を取ります。
HTMLタグ
という文字列をそのまま表示したい場合、HTMLには次のように記述します。
<p>HTMLタグ</p>
// PHPコードの例
$string = ‘ Hello “World” ‘;
// デフォルト設定
$escaped_default = htmlspecialchars($string);
// 結果: Hello "World"
PHPではユーザーからデータを受け取り、それを表示することもある
そこで、その受け取ったデータを「エスケープ」して、安全に扱う必要がある
XSS攻撃を防ぐ!
XSSは「Cross-Site Scripting(クロスサイト・スクリプティング)」の略
頭文字を取ってXSSと呼ばれています。
CSS(Cascading Style Sheets)と区別するため、CではなくX
実際には第二引数の指定が重要
htmlspecialchars()関数の第二引数で
エスケープの対象とするクォーテーション(引用符)の種類が指定できる
・ENT_COMPAT ダブルクォーテーションマークだけ 「デフォルト」
・ENT_QUOTES おすすめ 両方エスケープ可能
・ENT_NOQUOTES どちらもエスケープされない
第三引数で文字コードの指定!
// 最も推奨される形式
$safe_output = htmlspecialchars($input_value, ENT_QUOTES, ‘UTF-8’);
htmlspecialchars()がすべてを解決する訳ではない!
だけど、必ず使おう!
・SQLインジェクションなどは防げない