毎日コーディングクイズシリーズ!今回はセキュリティのXSS対策について、実践的なクイズ形式で学習しましょう!
🎯 問題
WordPressのカスタムフィールドから取得したユーザー入力データを、商品レビュー機能で出力する際の状況です。管理画面でレビューのタイトルを入力できる機能を実装していますが、悪意のあるユーザーが「素晴らしい商品!」というレビュータイトルを入力した場合を想定してください。
<div class="review-item">
<h3 class="review-title">
<?php echo $review_title; ?>
</h3>
<div class="review-content">
<p>商品の詳細レビュー内容がここに表示されます。</p>
</div>
</div>
このコードでXSS攻撃を防ぐために最も適切で安全な対策は何でしょうか?
A. $review_title = htmlspecialchars($review_title, ENT_QUOTES, ‘UTF-8’);
B. $review_title = wp_kses($review_title, array(‘strong’ => array(), ‘em’ => array()));
C. $review_title = esc_html($review_title);
D. $review_title = strip_tags($review_title);
B. $review_title = wp_kses($review_title, array(‘strong’ => array(), ‘em’ => array()));
C. $review_title = esc_html($review_title);
D. $review_title = strip_tags($review_title);
答えを確認する
✅ 正解:C
正解
正解は C. esc_html() です!
解説
WordPressでHTML出力を行う際、esc_html()関数はXSS攻撃を防ぐ最も推奨される方法です。この関数は特殊文字を自動的にHTMLエンティティに変換し、スクリプトの実行を完全に防ぎます。WordPress独自の関数で、セキュリティ面でも最適化されています。
- 選択肢A: htmlspecialchars()はPHPの標準関数で機能的には正解に近いですが、WordPressでは専用のesc_html()を使用することが推奨されています。WordPressの文字エンコーディング設定と統合されていません。
- 選択肢B: wp_kses()は許可されたHTMLタグのみを通す関数ですが、レビュータイトルには基本的にHTMLタグは不要です。また、設定次第では脆弱性が残る可能性があります。
- 選択肢C: esc_html()はWordPressの推奨関数で、すべての特殊文字をHTMLエンティティに変換します。<、>、&、”、’などが安全にエスケープされ、完全にXSS攻撃を防げます。
- 選択肢D: strip_tags()はHTMLタグを削除しますが、JavaScriptイベント属性や特殊文字は残る可能性があり、完全なXSS対策にはなりません。
WordPressのテーマ開発では、出力する内容の性質に応じて適切なエスケープ関数を選択することが重要です。テキスト出力にはesc_html()、URL出力にはesc_url()、属性値出力にはesc_attr()を使い分けましょう。
<div class="review-item">
<h3 class="review-title">
<?php echo esc_html($review_title); ?>
</h3>
<div class="review-content">
<p>商品の詳細レビュー内容がここに表示されます。</p>
</div>
</div>
// 悪意のある入力: "<script>alert('XSS攻撃')</script>素晴らしい商品!"
// 安全な出力: "<script>alert('XSS攻撃')</script>素晴らしい商品!"
実際の開発では、データベースへの保存時ではなく、出力時にエスケープを行うのがWordPressのベストプラクティスです。これにより、データの原型を保持しながら、表示時のみ安全な形式に変換できます。
💡 ポイント
- WordPressでは出力内容に応じて専用のエスケープ関数を使用する
- テキスト出力:esc_html()、URL出力:esc_url()、属性値:esc_attr()
- データ保存時ではなく、出力時にエスケープすることが重要
- ユーザー入力を含む全ての動的コンテンツは必ずエスケープする習慣をつける