AI活用開発演習 / 約20分
AI出力のリスク管理
なぜこれを学ぶか
AIはコードを生成しますが、「正確さ」「最新性」「セキュリティ」を保証しません。このレッスンではAI出力の3大リスク(ハルシネーション・古い情報・セキュリティ脆弱性)を学び、AIが書いたコードを本番に出す前のチェックポイントを身につけます。
ハルシネーション(幻覚)とは: AIが「もっともらしいが間違い」の情報を自信満々に生成する現象。存在しないAPIメソッド名・誤った仕様・架空のライブラリなどが代表例。「エラーになった」「ドキュメントに載っていない」ときはハルシネーションを疑う。
古い情報の問題: 言語モデルの学習データには「カットオフ日」があります。Node.jsのLTSバージョン・ライブラリのAPIの破壊的変更・廃止された書き方などは、AIが古いバージョン基準で答えることがあります。バージョン依存の情報は必ず公式ドキュメントで確認する。
AIが生成するセキュリティリスク(代表例): ❶SQLインジェクション — "SELECT * FROM users WHERE id = " + userId のように直接文字列結合するパターン。❷ハードコードされた秘密情報 — APIキー・パスワードをコードに直書き。❸入力値無検証 — フォームやリクエストボディの値を検証せず直接使う。❹エラーの露出 — スタックトレースやDB情報をそのままレスポンスに返す。
AI出力のチェックポイント10項目: ①APIメソッドは実在するか(公式ドキュメントで確認)②ライブラリバージョンが合っているか ③SQLはプレースホルダーを使っているか ④APIキー・パスワードが直書きされていないか ⑤ユーザー入力を検証しているか ⑥エラーメッセージが外部に漏れないか ⑦エッジケース(null/空/境界値)を試したか ⑧非同期処理でawaitが漏れていないか ⑨TypeScriptならany型の多用がないか ⑩既存コードの命名規則・スタイルに合っているか
「AIはコパイロット(副操縦士)」の心構え: 飛行機のコパイロットは操縦を補助しますが、最終判断は機長がします。AIもコードを提案しますが、それが正しいかの最終判断はあなたです。AIを使う時間分、検証スキルへの投資が重要になります。
重要ポイント
- ハルシネーション: AIは「もっともらしい間違い」を生成する。エラーになったら真っ先に疑う
- 学習データには賞味期限がある。バージョン依存情報は公式ドキュメントで確認
- SQLインジェクション・ハードコードされた秘密情報・入力無検証に特に注意
- AIはコパイロット。コードの最終責任者はあなた自身
理解度チェック
選ぶと即座に解説が表示されます。
生成AIに「Node.js で MySQL にクエリを投げる関数を書いて」と頼んだら以下のコードが返ってきた。最も重大な問題は?
ヒントを見る
userId がブラウザのフォームから来る場合、ユーザーが任意の文字列を入れられます。
コードレビュー演習
AIが生成した「ユーザー情報取得API」のコードです。 セキュリティの観点で問題を見つけ、最も重大なリスクを選んでください。
/* === AIが生成したコード(疑似出力)=== */
// Node.js + mysql2 によるユーザー情報取得
async function getUserById(userId) {
// ① SQLを文字列結合で生成
const sql = "SELECT * FROM users WHERE id = " + userId
try {
const [rows] = await conn.query(sql)
if (rows.length === 0) {
return { error: 'User not found' }
}
return rows[0]
} catch (err) {
// ② エラー情報をそのまま返している
return {
error: err.message,
stack: err.stack,
query: sql,
}
}
}
// APIキーの設定
const DB_PASSWORD = 'mySecretPass123' // ③ パスワードが直書き
const conn = mysql.createConnection({
host: 'localhost',
user: 'root',
password: DB_PASSWORD,
database: 'myapp'
})このコードに3つのセキュリティ問題が含まれています。「最も即座に悪用される危険性が高い」問題はどれ?
ヒントを見る
攻撃者が外部から「入力を操作」できる問題に注目してください。
スキルセルフチェック
このレッスンの内容をどの程度理解できましたか?