関数辞典
🔧 htmlspecialchars()
htmlspecialchars() — HTML エスケープで XSS 対策
シグネチャ
htmlspecialchars(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, ?string $encoding = null, bool $double_encode = true): string
- 引数 1
string $string- 引数 2
int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401- 引数 3
?string $encoding = null- 引数 4
bool $double_encode = true- 戻り値
string
解説
HTML 特殊文字(`<` `>` `&` `"` `'`)をエンティティに変換します。 ユーザー入力を画面に出力する際の XSS (= クロスサイトスクリプティング) 対策として必須です。 「画面に出る前に必ず通す」 を徹底することで、 攻撃者がスクリプトタグを仕込んでも実行されずに文字列として表示されます。
使用例
<?php
$user_input = '<script>alert(1)</script>';
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
// <script>alert(1)</script>
// テンプレートで全変数を escape する例
function e(string $s): string {
return htmlspecialchars($s, ENT_QUOTES | ENT_HTML5, 'UTF-8');
}
よくある用途
1. テンプレート内でユーザー入力を出力する全箇所 (= フォームエコー、 検索結果、 コメント表示)。 2. メール本文に動的データを差し込む際の防御。 3. JSON でない HTML 文脈すべて。
落とし穴 / 注意点
❌ JavaScript 内に直接埋め込む文字列のエスケープには htmlspecialchars だけでは不十分 (= json_encode を使う)。 ❌ URL 属性 (= href/src) に動的値を入れる場合は htmlspecialchars に加えて、 javascript: スキーマを排除するチェックが必要。 ❌ encoding 引数を省略すると PHP の default_charset 設定に依存します。 安全のため `'UTF-8'` を明示すべきです。 ❌ 二重エスケープ (= 既に escape 済の値に対して再度 htmlspecialchars) は double_encode=false で防げますが、 設計レベルで「どの境界でエスケープするか」 を 1 つに決めるのが王道です。
代替手段・関連関数
・htmlentities() — htmlspecialchars より広い文字を変換する (= 通常は htmlspecialchars で十分)。 ・strip_tags() — タグそのものを除去 (= リッチテキスト編集のサニタイズ)。 ・HTML Purifier ライブラリ — 許可タグだけ残す本格的サニタイザ。 ・json_encode($str, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT) — JavaScript 文字列向け。