新人のころ、ユーザーが入力した文字列は「危ないかもしれない」と疑うように習います。でも、AIに生成させた文字列は、なぜかそのまま画面に出してしまう。ここが、いまいちばん見落とされている穴です。
先に一行で言います。AIの出力は、ユーザー入力と同じ「外から来た、信用できない文字列」として扱う。 これだけ守れば、初心者がやりがちな事故のほとんどは防げます。
「AIが生成したものだから安全」ではありません。プロンプトインジェクションで、攻撃者はAIの出力を操れます。つまりAIの返り値は、攻撃者が書いた文字列かもしれない、と考えるのが安全です。
下に、コピペで直せる型を7個並べます。上から見て、自分のコードに当てはまるものを直してください。
なぜ「AIの出力」を疑うのか
ユーザー入力を疑う理由は「攻撃者が中身を決められるから」でした。AIの出力も、実は同じです。
AIに渡すデータ(ユーザーの質問、読み込ませた文章、Webページ)の中に、攻撃者は「こう出力しろ」という指示を仕込めます。これがプロンプトインジェクションです。仕込まれれば、AIの返り値は攻撃者の思いどおりの文字列になりうる。だから、出どころがAIでも、扱いはユーザー入力と同じでいい。むしろ見た目が自然なぶん油断しやすいので、より気をつけるくらいでちょうどいいです。
1. 画面に出すときは、生で innerHTML に入れない
いちばん多い事故です。AIの返答をそのまま innerHTML に入れると、その中の <script> が動きます。
// ❌ 危ない
el.innerHTML = aiText;
// ✅ テキストとして出す
el.textContent = aiText;
PHPでも同じです。
// ❌ 危ない
echo $ai_text;
// ✅ エスケープして出す
echo esc_html( $ai_text );
2. HTMLとして見せたいときは、サニタイズしてから
Markdownを変換して表示するなど、どうしてもHTMLで出したいときは、生のまま入れずにサニタイズを通します。
// ✅ DOMPurify などで通してから
el.innerHTML = DOMPurify.sanitize(html);
// ✅ 許可するタグだけ通す
echo wp_kses_post( $ai_html );
3. 返ってきたコードを、そのまま実行しない
AIが書いたコードを eval や動的実行に流すのは、いちばん危険な部類です。
// ❌ 絶対にやらない
eval(aiCode);
実行するなら、人間が読んでから。自動で回すなら、サンドボックスや権限を絞った環境で動かします。
4. 返ってきたSQLやコマンドを、確認なしで叩かない
「AIにSQLを書かせて、そのままDBに投げる」も同じ危険です。プレースホルダを使い、生成された文字列を直接クエリに連結しない。
// ✅ 値はプレースホルダで渡す
$wpdb->prepare( "SELECT * FROM t WHERE id = %d", $id );
5. DBに保存して、あとで生で表示しない(格納型XSS)
その場で出さなくても、AIの出力をDBに保存して別の画面で生表示すれば、結局XSSになります。「保存するときは素のまま、表示するときにエスケープ」を徹底する。
6. 返ってきたURLやリンクを、検証せずに踏ませない
javascript: で始まるURLなど、リンクに見えて危ないものがあります。出力されたURLは、スキーム(http / https)を確認してから使う。
// ✅ http(s) だけ許可
const ok = /^https?:\/\//i.test(url);
7. 「AIが言ったから」を、認可や分岐の根拠にしない
「このユーザーは管理者だとAIが判断しました」で権限を渡す、みたいな設計はやらない。認可は、AIの出力ではなく、自分のコードの確かな条件で決めます。
まず1個だけ試すなら
全部いっぺんに直さなくていいです。いちばん効くのは1番(生で innerHTML に入れない)。自分のコードで、AIの返答を画面に出している箇所を探して、そこを textContent か esc_html に変えてみてください。それだけで、初心者がやりがちな事故の大半は防げます。
次の自分に渡すメモ
- AIの出力は「外から来た、信用できない文字列」。ユーザー入力と同じ扱い
- 画面に出すときはエスケープ。HTMLで見せたいときはサニタイズしてから
- 返ってきたコード・SQL・コマンドを、確認なしで実行しない
- 保存して後で生表示も、結局XSSになる
- 認可は、AIの判断ではなく自分のコードの条件で決める
「AIが作ったから安全」は、いちばん優しい罠です。出どころがどこでも、画面に出す前に一度疑う。これを新人のうちから手癖にしておくと、後がだいぶ楽になります。役に立ったらストックして、実装で迷ったとき見返してください。
ふだんはraplsworks.comで、WordPressプラグイン開発やClaude Codeまわりのことを書いています。