MENU

コーディングクイズ No.63:セキュリティ(XSS対策)

毎日コーディングクイズシリーズ!今回はセキュリティの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);
答えを確認する

✅ 正解: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>素晴らしい商品!"
// 安全な出力: "&lt;script&gt;alert('XSS攻撃')&lt;/script&gt;素晴らしい商品!"

実際の開発では、データベースへの保存時ではなく、出力時にエスケープを行うのがWordPressのベストプラクティスです。これにより、データの原型を保持しながら、表示時のみ安全な形式に変換できます。

💡 ポイント
  • WordPressでは出力内容に応じて専用のエスケープ関数を使用する
  • テキスト出力:esc_html()、URL出力:esc_url()、属性値:esc_attr()
  • データ保存時ではなく、出力時にエスケープすることが重要
  • ユーザー入力を含む全ての動的コンテンツは必ずエスケープする習慣をつける
よかったらシェアしてね!