Chuyển đến nội dung chính

レッスン 18: Vibe コーディングにおけるセキュリティ

AI によって生成されたコードによくあるセキュリティ脆弱性。 OWASP トップ 10 と Vibe コーディング。即時注射のリスク。安全なコーディングパターン。セキュリティスキャンツール。セキュリティのためのコードレビュー。

💻 プログラミング — レッスン 18 レッスン 18: Vibe コーディングにおけるセキュリティ

GitHub Copilot を使用した Vibe コーディング: 基本から高度まで

パート 6: プロフェッショナルな Vibe コーディング — 品質、セキュリティ、プロダクション

xdev.asia

1. AI 生成コードのセキュリティの現状

2025 年から 2026 年にかけて Vibe コーディングがブームになりますが、それに伴いセキュリティ上の深刻な懸念が生じます。

研究 結果
ベラコード (2026) AI コードを使用するアプリの 72% にセキュリティ上の欠陥がある
スタンフォード (2025) AI を使用する開発者は安全性の低いコードを作成し、セキュリティについてはより自信を持っています
GitHub (2026) AI コード スキャンは、AI 生成コードと併用すると 3 倍多くの問題を検出します

核心的な問題: AI は、セキュリティ上の脆弱性のあるコードを含む公開コードに基づいてトレーニングされています。 AIは差別しない コード例 (チュートリアル、StackOverflow) プロダクションコード。

2. OWASP トップ 10 と Vibe コーディング

2.1.注射 (A03:2021)

AI は安全でない SQL クエリを生成することがよくあります。

// ❌ AI có thể generate:
const users = await db.query(
  `SELECT * FROM users WHERE email = '${email}'`
);

// ✅ Phải yêu cầu:
const users = await db.query(
  'SELECT * FROM users WHERE email = $1',
  [email]
);
// Prompt an toàn:
Always use parameterized queries. Never concatenate user input
into SQL strings. Use ORM methods when available.

2.2.認証の失敗 (A07:2021)

// ❌ AI có thể generate weak JWT:
jwt.sign(payload, 'secret123')  // Hardcoded secret!

// ✅ Secure version: jwt.sign(payload, process.env.JWT_SECRET!, { expiresIn: '15m', algorithm: 'RS256', // Asymmetric })

2.3.機密データの漏洩 (A02:2021)

// ❌ AI có thể log sensitive data:
console.log('User login:', { email, password });
res.json({ user: { ...user } });  // Includes password hash!

// ✅ Chỉ return cần thiết: const { password, ...safeUser } = user; res.json({ user: safeUser });

2.4.安全でない直接オブジェクト参照 (A01:2021)

// ❌ AI thường bỏ auth check:
app.get('/api/tasks/:id', async (req, res) => {
  const task = await prisma.task.findUnique({
    where: { id: req.params.id },
  });
  res.json(task);  // Any user can access any task!
});

// ✅ Luôn check ownership: app.get('/api/tasks/:id', auth, async (req, res) => { const task = await prisma.task.findFirst({ where: { id: req.params.id, project: { members: { some: { userId: req.userId } }, }, }, }); if (!task) return res.status(404).json({ error: 'Not found' }); res.json(task); });

3. AI コードの一般的な脆弱性

脆弱性 AIの頻度 例
ハードコードされたシークレット 非常に高い コード内の API キー、パスワード
入力検証が欠落している 高 ユーザー入力を検証しない
弱い暗号通貨 高 bcrypt、SHA-256 の代わりに MD5
認証チェックが欠落している 平均 エンドポイントがユーザーを検証しない
SQLインジェクション 平均 文字列連結クエリ
XSS 平均 HTML の直接レンダリング
パストラバーサル 低い サニタイズされていないファイルパス

4. 即時注射のリスク

MCP サーバーを使用する場合、または AI を介してユーザー入力を処理する場合:

// User nhập vào form:
"; DROP TABLE users; --

// Nếu AI xử lý raw input:
AI có thể generate code chứa malicious input

予防:

  • ユーザー入力を AI プロンプトに直接渡さないでください
  • AI に送信する前に入力をサニタイズする
  • 実行前に AI 出力を検証する
  • 拒否リストの代わりに許可リストを使用する

5. 安全なプロンプトパターン

5.1.セキュリティのためのカスタム指示


## Security Requirements
  • NEVER hardcode secrets, API keys, or passwords
  • ALWAYS use parameterized queries, never string concatenation for SQL
  • ALWAYS validate and sanitize user input at API boundaries
  • ALWAYS check authorization before returning data
  • NEVER log sensitive data (passwords, tokens, PII)
  • Use bcrypt with cost factor >= 12 for password hashing
  • Use HTTPS for all external API calls
  • Set security headers (CORS, CSP, HSTS)
  • Implement rate limiting on auth endpoints

5.2.セキュリティ第一のプロンプト

// Thay vì:
Create a login endpoint

// Dùng: Create a secure login endpoint with:

  • Rate limiting (5 attempts per minute per IP)
  • Password hashing with bcrypt (cost 12)
  • JWT with short expiry (15 min) + refresh token
  • Account lockout after 10 failed attempts
  • Audit logging for failed attempts
  • No password in response or logs

6. セキュリティスキャンツール

6.1. GitHub の高度なセキュリティ

GitHub Secret Scanning: phát hiện secrets trong code
CodeQL: static analysis cho security vulnerabilities
Dependabot: scan dependencies cho known vulnerabilities

6.2. CI/CD パイプライン内

# .github/workflows/security.yml
name: Security Scan
on: [pull_request]
jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
  # Dependency scan
  - run: npm audit --audit-level=high

  # Secret detection
  - uses: trufflesecurity/trufflehog@main
    with:
      path: ./

  # SAST scan
  - uses: github/codeql-action/analyze@v3
    with:
      languages: javascript-typescript

  # Container scan (if using Docker)
  - uses: aquasecurity/trivy-action@master
    with:
      scan-type: fs
      scan-ref: .

6.3. IDEレベルのスキャン

// Copilot itself can help with security review:
@workspace /review Check all API endpoints for:
1. Missing authentication middleware
2. Missing input validation
3. SQL injection vulnerabilities
4. Hardcoded secrets
5. Sensitive data in responses

7. Vibe コーディングの安全なコーディング パターン

パターン 1: 最初にミドルウェアを検証する

// Yêu cầu AI tạo validation middleware:
const validateRequest = (schema: z.ZodSchema) => {
  return (req: Request, res: Response, next: NextFunction) => {
    const result = schema.safeParse(req.body);
    if (!result.success) {
      return res.status(400).json({
        error: 'Validation failed',
        details: result.error.issues,
      });
    }
    req.body = result.data;  // Use validated data
    next();
  };
};

パターン 2: 認可ガード

// Resource-level authorization:
const canAccessProject = async (userId: string, projectId: string) => {
  const member = await prisma.projectMember.findUnique({
    where: {
      userId_projectId: { userId, projectId },
    },
  });
  return member !== null;
};

パターン 3: 出力のサニタイズ

// Chỉ return fields cần thiết:
const sanitizeUser = (user: User) => ({
  id: user.id,
  name: user.name,
  email: user.email,
  avatar: user.avatar,
  // Exclude: password, resetToken, etc.
});

8. Vibe コーディングのセキュリティ チェックリスト

# チェックする いつ
1 ハードコードされたシークレットはありません すべてのコミット
2 すべてのエンドポイントでの入力検証 新しい各エンドポイント
3 保護されたルートの認証ミドルウェア それぞれの新ルート
4 パラメータ化されたクエリ 各DBクエリ
5 ログ/応答に機密データがない 各APIのレスポンス
6 依存関係には CVE がありません 毎週
7 設定されたセキュリティヘッダー 1 回 + 検証
8 認証エンドポイントのレート制限 1 回 + 検証

9. まとめ

Vibe コーディングのセキュリティには次の要件が必要です 異なる考え方:

  • 信頼するが検証する: AI コードには常にセキュリティ レビューが必要です
  • 多層防御: 複数層のセキュリティチェック
  • スキャンを自動化する: CI/CD は AI の問題を強制的に作成する必要があります
  • デフォルトで安全: カスタム命令によりセキュリティ パターンを適用
  • 最新情報を入手: AI モデルは向上しますが、脅威の状況も変化します

次の記事: 技術的負債と保守性 — Vibe コーディングを使用する際の技術的負債を管理します。