1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【新人エンジニア向け】ユーザー入力は疑うのに、AIの出力を疑わないのは危険です

1
Posted at

新人のころ、ユーザーが入力した文字列は「危ないかもしれない」と疑うように習います。でも、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の返答を画面に出している箇所を探して、そこを textContentesc_html に変えてみてください。それだけで、初心者がやりがちな事故の大半は防げます。

次の自分に渡すメモ

  • AIの出力は「外から来た、信用できない文字列」。ユーザー入力と同じ扱い
  • 画面に出すときはエスケープ。HTMLで見せたいときはサニタイズしてから
  • 返ってきたコード・SQL・コマンドを、確認なしで実行しない
  • 保存して後で生表示も、結局XSSになる
  • 認可は、AIの判断ではなく自分のコードの条件で決める

「AIが作ったから安全」は、いちばん優しい罠です。出どころがどこでも、画面に出す前に一度疑う。これを新人のうちから手癖にしておくと、後がだいぶ楽になります。役に立ったらストックして、実装で迷ったとき見返してください。


ふだんはraplsworks.comで、WordPressプラグイン開発やClaude Codeまわりのことを書いています。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?