WebアプリケーションでAIを活用する際、見落としがちな重大なセキュリティリスクがあります。それはXSS(クロスサイトスクリプティング)です。AIが生成した内容をそのまま表示すると、悪意のあるスクリプトが実行される可能性があります。

本記事では、プログラミング初心者の你也を対象に、AI出力のXSS対策サニタイゼーションをゼロからわかりやすく解説します。HolySheep AIのAPIを活用しながら実践的な対策を身につけましょう。

XSS(クロスサイトスクリプティング)とは?

XSSとは、攻撃者がWebページに悪意のあるスクリプトを埋め込む攻撃手法です。AIが生成したテキストに以下のような危険なコードが含まれている可能性があります:

【スクリーンショットヒント:XSS攻撃の流れを説明した図。入力→AI処理→出力→ブラウザでのスクリプト実行】

必要な準備物

始める前に、以下の環境を整えましょう。

Step 1:プロジェクトの作成と基本設定

まず、作業を 위한フォルダを作成し、必要なパッケージをインストールします。

# プロジェクトフォルダの作成
mkdir ai-sanitization-demo
cd ai-sanitization-demo

Node.jsプロジェクトの初期化

npm init -y

必要なパッケージをインストール

npm install axios dompurify jsdom

【スクリーンショットヒント:ターミナルでのパッケージインストール完了後の画面】

Step 2:HolySheep AI API的基本設定

HolySheep AIのAPIを設定ファイルにまとめます。HolySheep AIは¹=$7.3の為替レートで提供されており、レートは業界最安値の¹=$です。

// config.js
const HOLYSHEEP_CONFIG = {
  // HolySheep AI APIエンドポイント
  baseURL: 'https://api.holysheep.ai/v1',
  
  // APIキーを環境変数から取得
  apiKey: process.env.HOLYSHEEP_API_KEY,
  
  // 利用可能なモデルと価格(2026年更新)
  models: {
    'gpt-4.1': { input: 2.50, output: 8.00 },
    'claude-sonnet-4.5': { input: 3.00, output: 15.00 },
    'gemini-2.5-flash': { input: 0.30, output: 2.50 },
    'deepseek-v3.2': { input: 0.10, output: 0.42 }
  }
};

module.exports = HOLYSHEEP_CONFIG;

私自身、初めてAPIを触れる際は「どこに接続すればいいの?」という疑問でいっぱいでした。HolySheep AIのドキュメントは分かりやすく、™秒未満のレイテンシでストレスなく開発を進められました。

Step 3:AIからの応答をサニタイズする関数を作成

ここが本記事の核心です。AIの出力を安全にHTMLに表示するためのサニタイザー関数を作成します。

// sanitizer.js
const { JSDOM } = require('jsdom');
const createDOMPurify = require('dompurify');

// 安全なDOM環境を作成
const window = new JSDOM('').window;
const DOMPurify = createDOMPurify(window);

/**
 * AI出力をサニタイズする関数
 * @param {string} aiOutput - AIが生成した生のテキスト
 * @param {object} options - サニタイズオプション
 * @returns {string} - サニタイズされたHTML
 */
function sanitizeAIOutput(aiOutput, options = {}) {
  const defaultOptions = {
    // scriptタグとstyleタグを完全に削除
    FORBID_TAGS: ['script', 'style', 'iframe', 'object', 'embed'],
    
    // 属性レベルでの制御
    FORBID_ATTR: ['onerror', 'onload', 'onclick', 'onmouseover'],
    
    // タグ名を小文字に変換
    ALLOW_DATA_ATTR: false,
    
    // aタグのリダイレクト先を制限
    ADD_ATTR: ['target'],
    
    // 完全なHTMLサニタイズ(デフォルト)
    ALLOWED_TAGS: ['p', 'br', 'b', 'i', 'u', 'strong', 'em', 
                   'ul', 'ol', 'li', 'a', 'h1', 'h2', 'h3', 'blockquote'],
    
    ALLOWED_ATTR: ['href', 'target', 'class']
  };

  const mergedOptions = { ...defaultOptions, ...options };

  // DOMPurifyでサニタイズ
  const clean = DOMPurify.sanitize(aiOutput, mergedOptions);

  return clean;
}

/**
 * プレーンなテキストのみを許可(より厳格)
 */
function sanitizePlainText(text) {
  const window = new JSDOM('').window;
  const purifier = createDOMPurify(window);
  
  return purifier.sanitize(text, {
    ALLOWED_TAGS: [],
    ALLOWED_ATTR: []
  });
}

module.exports = { sanitizeAIOutput, sanitizePlainText };

Step 4:実践的なAI呼び出しとサニタイズの例

実際にHolySheep AIのAPIを呼び出し、結果をサニタイズして表示する完整な例を見てみましょう。

// app.js
const axios = require('axios');
const { sanitizeAIOutput, sanitizePlainText } = require('./sanitizer');
const HOLYSHEEP_CONFIG = require('./config');

/**
 * HolySheep AIにリクエストを送信
 */
async function callAI(userMessage) {
  try {
    const response = await axios.post(
      ${HOLYSHEEP_CONFIG.baseURL}/chat/completions,
      {
        model: 'deepseek-v3.2',  // コスト効率の良いモデルを選択
        messages: [
          {
            role: 'system',
            content: 'あなたは丁寧なアシスタントです。'
          },
          {
            role: 'user',
            content: userMessage
          }
        ],
        max_tokens: 1000,
        temperature: 0.7
      },
      {
        headers: {
          'Authorization': Bearer ${HOLYSHEEP_CONFIG.apiKey},
          'Content-Type': 'application/json'
        }
      }
    );

    return response.data.choices[0].message.content;
  } catch (error) {
    console.error('API呼び出しエラー:', error.message);
    throw error;
  }
}

/**
 * Webアプリケーションでの表示例
 */
async function displayAIResponse(userMessage) {
  // Step 1: AIから応答を取得
  const rawAIOutput = await callAI(userMessage);
  
  // Step 2: 応答をサニタイズ
  const safeHTML = sanitizeAIOutput(rawAIOutput);
  
  // Step 3: Webページに表示(HTML挿入)
  const container = document.getElementById('ai-response');
  container.innerHTML = safeHTML;  // 安全!
  
  // 必要に応じてテキストのみ也表示
  const plainText = sanitizePlainText(rawAIOutput);
  console.log('サニタイズ後のテキスト:', plainText);
}

// 使用例
// displayAIResponse('自己紹介をお願いします');

Step 5:ブラウザ側での追加対策

サーバーサイドでのサニタイズに加えて、ブラウザ側でも Content Security Policy(CSP)を設定することを强烈に推奨します。

// express-server.js(Node.js/Express使用時)
const express = require('express');
const helmet = require('helmet');
const app = express();

// Content Security Policyを設定
app.use(helmet.contentSecurityPolicy({
  directives: {
    defaultSrc: ["'self'"],
    scriptSrc: ["'self'"],
    styleSrc: ["'self'"],
    imgSrc: ["'self'", 'data:'],
    // AI出力の描画を許可(リスクを理解した上で)
    // scriptSrc: ["'self'", "'unsafe-inline'"], // ⚠️ 非推奨
  }
}));

// 静的ファイルの配信
app.use(express.static('public'));

// APIエンドポイント
app.post('/api/ai-query', async (req, res) => {
  const { prompt } = req.body;
  
  try {
    const response = await callAI(prompt);
    const sanitized = sanitizeAIOutput(response);
    
    res.json({ 
      success: true, 
      html: sanitized,
      text: sanitizePlainText(response)
    });
  } catch (error) {
    res.status(500).json({ 
      success: false, 
      error: '処理中にエラーが発生しました' 
    });
  }
});

app.listen(3000, () => {
  console.log('サーバーがポート3000で起動しました');
});

XSS攻撃の種類とサニタイズ策略

AI出力に対するXSS攻撃にはいくつかの種類があります、それぞれに対応した対策が必要です。

リフレクテッドXSS

URLパラメータ 등에 포함された悪意あるスクリプトがそのまま頁に表示されるタイプです。

保存型XSS

AIが生成した内容をデータベースに保存し、後から他のユーザーに表示される攻撃です。最も危険度が高いため、サニタイズは必ず保存前に行うべきです。

DOMベースXSS

クライアントサイドのJavaScriptがユーザー入力を不安全な方法でDOM操作する攻撃です。

【スクリーンショットヒント:各XSS攻撃タイプの流れを比較する表】

セキュリティチェックリスト

AI機能を実装する前に、必ず以下の項目を確認してください:

HolySheep AIの料金体系とコスト最適化

AI導入においてコスト管理も重要です。HolySheep AIは以下の特徴で効率的な開発を支援します:

モデル入力(/MTok)出力(/MTok)
DeepSeek V3.2$0.10$0.42
Gemini 2.5 Flash$0.30$2.50
GPT-4.1$2.50$8.00
Claude Sonnet 4.5$3.00$15.00

よくあるエラーと対処法

エラー1:APIキーが認識されない

# ❌ 間違い:コードに直接APIキーを記述
const apiKey = 'sk-xxxx';  // 安全ではありません

✅ 正しい:環境変数を使用

.envファイルに記述

HOLYSHEEP_API_KEY=sk-xxxx

コードではこう読む

const apiKey = process.env.HOLYSHEEP_API_KEY;

解決方法: APIキーは絶対にソースコードに書かず、.envファイルで管理し、.gitignore.envを追加してください。

エラー2:サニタイズ後になにも表示されない

# ❌ 問題:許可されていないHTMLタグが削除される
const unsafe = 'これが本文です';
sanitizeAIOutput(unsafe);
// 結果: 'これが本文です' (scriptタグが削除される)

✅ 解決:許可リストにh1やspanを追加

const clean = DOMPurify.sanitize(unsafe, { ALLOWED_TAGS: ['p', 'br', 'h1', 'h2', 'span', 'script'], // 必要に応じて ALLOWED_ATTR: ['href', 'class', 'id'] });

解決方法: ALLOWED_TAGSオプションで必要なタグを明示的に許可してください。ただし、scriptonclickなどの危険なタグは絶対に許可しないでください。

エラー3:CORS エラーでAPIに接続できない

# ❌ 問題:ブラウザから直接APIを呼び出そうとしている
fetch('https://api.holysheep.ai/v1/chat/completions', {...});

✅ 解決:サーバーサイドプロキシを経由する

// app.js app.post('/api/proxy', async (req, res) => { const response = await axios.post( 'https://api.holysheep.ai/v1/chat/completions', req.body, { headers: { 'Authorization': Bearer ${process.env.HOLYSHEEP_API_KEY} } } ); res.json(response.data); });

解決方法: APIキーがブラウザに露出するのを防ぎ、バックエンド経由でのみAPIを呼び出すように架构を変えてください。

エラー4:特殊文字がエスケープされない

# ❌ 問題:<や>などの実体参照がそのまま出力される
const input = '100 < 200 > 50';
container.innerHTML = input;
// 表示: 100 < 200 > 50

✅ 解決:textContentを使用して 안전하게描画

const input = '100 < 200 > 50'; const span = document.createElement('span'); span.textContent = input; // 自動的にエスケープされる container.appendChild(span); // 表示: 100 < 200 > 50

解決方法: ユーザー入力を含む要素はinnerHTMLではなくtextContentを使用してください。HTMLを描画する必要がある場合は、サニタイズ後のinnerHTMLを使用します。

まとめ

AI出力をWebアプリケーションで表示する際は、セキュリティを最優先に考える必要があります。本記事のポイントまとめ:

セキュリティは一度設定すれば終わりではありません。定期的な監査と最新の脆弱性情첀の確認を習慣づけましょう。

HolySheep AIのAPIは<50msの低レイテンシと¹=$の為替レートで、 разработкаと実運用双方的成本効率に優れています。無料クレジット付きで начатьできますので、セキュリティを意識したAIアプリケーション開発を始めましょう。

👉 HolySheep AI に登録して無料クレジットを獲得