セキュリティを担保するプロンプト設計
AI開発プロンプトがセキュリティを決める
AI生成コードのセキュリティは、プロンプトの質 に大きく依存します。
“セキュリティ要件を明示しなければ、AIはセキュリティを考慮しない”
この章では、セキュリティを担保するプロンプト設計を解説します。
悪いプロンプトと良いプロンプト
悪いプロンプト:
ログイン機能を作って
このプロンプトでは、AIは「動く」ログイン機能を作りますが、セキュリティは考慮されません。
良いプロンプト:
ログイン機能を作って:
## 【必須】セキュリティ要件
- パスワードはbcryptでハッシュ化(コスト12以上)
- SQLインジェクション対策(プリペアドステートメント使用)
- レートリミット実装(5回/分)
- JWTの有効期限は1時間
- Cookieはhttponly, secure, samesiteフラグ設定
- 入力値のバリデーション実装
- エラーメッセージでユーザー存在を漏らさない
セキュリティプロンプトテンプレート
汎用的に使えるセキュリティプロンプトテンプレートを紹介します。
認証機能の実装ポイント機能
## 実装すべき機能要件
- [具体的な機能を記述]
## 【必須】セキュリティ要件
- [ ] パスワードハッシュ: bcrypt(コスト12以上)
- [ ] セッション管理: JWT(有効期限1時間)
- [ ] Cookie設定: HttpOnly, Secure, SameSite=Strict
- [ ] レート制限: 5回/15分
- [ ] アカウントロック: 5回失敗で30分
- [ ] 入力バリデーション: zodスキーマ
- [ ] SQLインジェクション対策: プリペアドステートメント
- [ ] ログ: 認証イベントを記録(パスワードは除外)
## AI開発で避けるべき禁止事項
- [ ] 平文パスワード保存
- [ ] MD5/SHA-1使用
- [ ] クライアントサイド認証
- [ ] パスワードのログ出力
API開発
## 実装すべき機能要件
- [具体的なエンドポイントを記述]
## 【必須】セキュリティ要件
- [ ] 認証: すべてのエンドポイントで検証
- [ ] 認可: ユーザーごとのアクセス制御
- [ ] 入力バリデーション: zodスキーマ
- [ ] レスポンス: 機密情報を含めない
- [ ] エラー処理: 詳細を漏らさない
- [ ] レート制限: 100回/分
- [ ] CORS: 必要なオリジンのみ許可
- [ ] HTTPS: 強制
## AI開発で避けるべき禁止事項
- [ ] APIキーのハードコード
- [ ] 機密情報のレスポンス含有
- [ ] 認証なしのエンドポイント
フロントエンド
## 実装すべき機能要件
- [具体的なUIを記述]
## 【必須】セキュリティ要件
- [ ] XSS対策: ユーザー入力のエスケープ
- [ ] CSRF対策: トークン使用
- [ ] 機密情報: フロントエンドに含めない
- [ ] 認証トークン: HttpOnly Cookieで管理
- [ ] CSP: 適切なヘッダー設定
## AI開発で避けるべき禁止事項
- [ ] innerHTML使用
- [ ] dangerouslySetInnerHTML使用
- [ ] APIキーの埋め込み
- [ ] eval()の使用
OWASP Top 10対応プロンプト
OWASP Top 10に対応するプロンプト要素を紹介します。
## OWASP Top 10 対策(必須チェック)
### A01: 認証の不備
- [ ] サーバーサイドで認証
- [ ] 強力なパスワードポリシー
- [ ] MFA対応(可能なら)
### A02: 暗号化の失敗
- [ ] パスワードはbcrypt
- [ ] 通信はHTTPS
- [ ] 機密データは暗号化
### A03: インジェクション
- [ ] プリペアドステートメント
- [ ] 入力バリデーション
- [ ] 出力エスケープ
### A04: 安全でない設計
- [ ] 最小権限の原則
- [ ] 多層防御
- [ ] 失敗時は安全に
### A05: セキュリティ設定ミス
- [ ] デフォルトパスワード変更
- [ ] 不要な機能の無効化
- [ ] エラーメッセージの制限
### A06: 脆弱なコンポーネント
- [ ] 最新版のライブラリ
- [ ] 依存関係の監査
- [ ] パッチの適用
### A07: 識別と認証の失敗
- [ ] セッション管理の適切な実装
- [ ] ログアウト時のトークン無効化
- [ ] セッションタイムアウト
### A08: データの完全性
- [ ] 署名の検証
- [ ] 安全なデシリアライゼーション
### A09: ログとモニタリング
- [ ] セキュリティイベントのログ
- [ ] 機密情報のログ除外
- [ ] 異常検知
### A10: SSRF
- [ ] URL検証
- [ ] 内部リソースへのアクセス制限
AI開発コンテキストファイルの活用
プロジェクト全体でセキュリティ要件を統一するために、コンテキストファイルを活用しましょう。
SECURITY.md:
# セキュリティ要件
## 認証機能の実装ポイント
- bcrypt(コスト12)
- JWT(有効期限1時間)
- レート制限(5回/15分)
## データベース
- プリペアドステートメント必須
- RLS設定必須
## API
- すべてのエンドポイントで認証検証
- 入力バリデーション必須
- レスポンスに機密情報を含めない
## フロントエンド
- innerHTML禁止
- APIキー埋め込み禁止
- CSPヘッダー設定
## AI開発で避けるべき禁止事項
- 平文パスワード
- MD5/SHA-1
- eval()
- document.write()
レビュー用プロンプト
生成されたコードをレビューさせるプロンプトも有効です。
以下のコードをセキュリティの観点からレビューして:
## チェック項目
1. SQLインジェクションの可能性
2. XSSの可能性
3. 認証・認可の不備
4. 機密情報の露出
5. 入力バリデーションの欠如
6. エラーハンドリングの問題
## 期待する出力形式の指定
- 問題点(深刻度: 高/中/低)
- 具体的な行番号
- 修正案
[コードをここに貼り付け]
この事例から学ぶべき教訓と実践ポイント
「セキュリティプロンプト設計」から学ぶべきことは以下の通りです。
-
プロンプトがセキュリティを決める
- 明示しなければ考慮されない
-
テンプレートを使う
- 認証、API、フロントエンド用
-
OWASP Top 10を意識
- すべての項目をカバー
-
コンテキストファイルで統一
- SECURITY.mdで要件を共有
-
レビュー用プロンプトも活用
- 生成後のチェック
まとめ:重要ポイントの振り返り
- プロンプトがセキュリティを決める
- テンプレート を使って漏れを防ぐ
- OWASP Top 10 をカバー
- SECURITY.md で要件を統一
- レビュープロンプト で生成後もチェック
- 教訓:セキュリティは「明示的に依頼」しなければ実装されない