GitHub CopilotやChatGPTなどの生成AIを活用したコーディングは開発速度を向上させますが、生成されたコードが「構文エラーなく動作するものの、セキュリティ脆弱性やパフォーマンスの問題を抱えている」ケースが散見されます。
本記事では、実務でAI生成コードをPR(プルリクエスト)に取り込む際、人間がどこを重点的にチェックすべきか、具体的なコード例とチェックリストを用いて解説します。
AI生成コードに潜む代表的な「危険なパターン」
AIは文脈に基づいてそれっぽいコードを生成しますが、非推奨APIの利用、入力値の検証漏れ、リソース解放の忘却などを引き起こしがちです。
1. SQLインジェクションが可能なコード
ユーザー入力をそのまま文字列連結してクエリを構築するコードは、最も典型的な危険パターンです。
悪い例(AIが生成しがちなアンチパターン)
# Python (Flask例)
@app.route('/user')
def get_user():
user_id = request.args.get('id')
# 文字列連結によるSQL構築(危険)
query = f"SELECT * FROM users WHERE id = '{user_id}'"
cursor.execute(query)
return cursor.fetchall()
良い例(パラメータ化クエリの利用)
# Python (Flask例)
@app.route('/user')
def get_user():
user_id = request.args.get('id')
# プレースホルダーを使用したパラメータ化クエリ
query = "SELECT * FROM users WHERE id = %s"
cursor.execute(query, (user_id,))
return cursor.fetchall()
2. 例外処理の握りつぶしとログ出力の不備
AIはエラーハンドリングを簡略化するために except Exception: pass のようなコードを出力することがあります。
悪い例
// Node.js例
try {
await processData(data);
} catch (err) {
// エラーを握りつぶし、何が起きたか追跡不能になる
console.log("error occurred");
}
良い例
// Node.js例
try {
await processData(data);
} catch (err) {
// 適切なログレベルとコンテキスト情報の記録、必要に応じた再投げ
logger.error('Failed to process data', { error: err.message, stack: err.stack });
throw new ProcessingException('Data processing failed');
}
実務で使えるレビュアー用チェックリスト
コードレビュー時に以下の観点を網羅しているか確認してください。
| チェック項目 | 確認内容 | 対策・修正方針 |
|---|---|---|
| 入力値検証・エスケープ | 外部からの入力値(クエリパラメータ、POSTボディ)を無検証で利用していないか | バリデーションライブラリの導入、エスケープ処理の徹底 |
| 認証・認可 | エンドポイントに対して適切なアクセス制御が行われているか | ミドルウェア等での認可チェックの挟み込み |
| リソース管理 | DB接続やファイルハンドルの閉じ忘れがないか |
with 構文や try-finally による確実に解放する構造の適用 |
| 例外処理 | 例外がキャッチされずにプロセスが落ちる、あるいは握りつぶされていないか | 適切な例外クラスのキャッチとスタックトレースの記録 |
| 依存ライブラリ | 実在しない、または非推奨のパッケージをインポートしていないか |
package.json や requirements.txt の確認と脆弱性スキャン |
コードレビューテンプレート(PR記載用)
Pull Request作成時やレビュー時にテンプレートを活用することで、AI生成コードの確認漏れを防ぎます。
## AI利用の有無
- [ ] 本PRコードの一部または全部にAI生成ツールを使用している
## AI生成コードに対する確認事項
- [ ] 外部からの入力値に対する適切なバリデーション/エスケープが行われているか
- [ ] 機密情報(APIキーやパスワード等)がハードコードされていないか
- [ ] 依存ライブラリは実在し、ライセンスやセキュリティに問題がないか確認したか
- [ ] エラーハンドリングで例外を無意味に握りつぶしていないか
- [ ] 既存のプロジェクトコーディング規約に沿っているか
## 動作確認環境
- Node.js v18.x / Python 3.10 等(動作確認を行った環境を明記)
導入時の注意点
-
AIの出力を過信しない
AIは文脈的に「もっともらしい」コードを出力しますが、最新のセキュリティ仕様やフレームワークの破壊的変更に追従できていない場合があります。 -
自動テストの併用
AI生成コードをプロジェクトに取り込む際は、ユニットテストや静的解析ツール(ESLint、Bandit、SonarQubeなど)をCIに組み込み、機械的に検出できる違反を自動で弾く構成を推奨します。 -
公式ドキュメントの参照
使用しているライブラリやAPIの正確な仕様については、必ず各技術の公式ドキュメントを参照して最新の推奨実装を確認してください。