# ✅ Checkpoint: nhận diện injection trong code AI

By Better Wise



## Quiz

1. Vì sao code do AI sinh vẫn cần một vòng review bảo mật riêng, dù test đã pass?
   - Vì AI luôn cố tình chèn lỗ hổng để người dùng phải trả tiền cho bản vá.
   - Vì code AI sinh luôn dài hơn code người viết nên khó đọc.
   - Vì AI tối ưu cho đoạn code chạy được theo prompt, thiếu ngữ cảnh hệ thống và không chịu trách nhiệm hậu quả.
   - Vì test tự động không bao giờ kiểm tra được logic nghiệp vụ.
2. Đoạn code AI sau có rủi ro gì?

```js
app.get('/orders', (req, res) => {
  const sql = "SELECT * FROM orders WHERE customer_id = '" + req.query.customerId + "'";
  db.query(sql, (err, rows) => res.json(rows));
});
```
   - SQL injection do nối chuỗi trực tiếp với dữ liệu từ request.
   - XSS vì dữ liệu người dùng được render vào HTML.
   - Lộ secret vì connection string nằm trong code.
   - Không có rủi ro vì đã dùng db.query.
3. Bản sửa đúng cho câu SQL trên với driver mysql2 là gì?
   - db.query('SELECT * FROM orders WHERE customer_id = ?', [req.query.customerId], ...)
   - db.query('SELECT * FROM orders WHERE customer_id = ' + Number(req.query.customerId), ...)
   - db.query("SELECT * FROM orders WHERE customer_id = '?'", [req.query.customerId], ...)
   - db.query("SELECT * FROM orders WHERE customer_id = '" + escape(req.query.customerId) + "'", ...)
4. AI viết `"SELECT * FROM products ORDER BY " + req.query.sort`. Vì sao parameterized query thông thường không sửa được chỗ này?
   - Vì placeholder chỉ bind được giá trị, không bind được tên cột hay từ khóa như ORDER BY, nên phải dùng allowlist.
   - Vì ORDER BY không được phép xuất hiện trong câu SQL có tham số.
   - Vì chỉ PostgreSQL mới parameterize được ORDER BY.
   - Vì driver mysql2 không hỗ trợ mệnh đề ORDER BY.
5. Đoạn code AI sau gây ra lỗi gì?

```js
const el = document.getElementById('comment');
el.innerHTML = comment.text;
```
   - Không có lỗi vì đây chỉ là hiển thị văn bản bình luận.
   - CSRF: kẻ tấn công mượn cookie session để gửi request thay người dùng.
   - XSS: trình duyệt parse comment.text như HTML và chạy script nếu payload chứa thẻ có onerror.
   - SQL injection vì comment.text đi vào câu truy vấn.
6. Endpoint chuyển tiền `app.post('/api/transfer', ...)` xác thực bằng cookie session nhưng không có CSRF token. Lỗi gốc và lớp phòng thủ phù hợp là gì?
   - Thao tác thay đổi dữ liệu thiếu token; thêm CSRF token, cookie SameSite và kiểm tra header Origin.
   - Render dữ liệu không escape; sửa bằng textContent và CSP.
   - Lộ API key; sửa bằng cách chuyển key sang biến môi trường.
   - Nối chuỗi SQL; sửa bằng parameterized query.
7. Trong EJS, cú pháp có dấu ____ ngay sau % thì tự escape, còn dấu trừ thì in thô và tạo lỗ hổng XSS.
8. Thuộc tính cookie dùng để chặn trình duyệt gửi cookie trong request cross-site là ____ (ví dụ giá trị Lax hoặc Strict).
9. Với PostgreSQL và thư viện pg, tham số đầu tiên trong câu lệnh được viết là ____ thay vì dấu ?.
10. Hãy tự đánh giá: bạn có thể đọc một đoạn code AI ngắn và chỉ ra lỗi injection (SQL injection, XSS, CSRF) cùng bản sửa tối thiểu không? Viết ra 2 lỗi bạn tìm thấy và cách sửa từng lỗi.


---

## Contents

Part of [🛡️ Bảo mật web cho vibe coder: OWASP, secrets và dữ liệu người dùng](https://everwise.study/courses/bao-mat-web-cho-vibe-coder-owasp-secrets-va-du-lieu-nguoi-dung.md)

- **🔍 Nhận diện rủi ro trong code do AI sinh**
  - [🗺️ Vì sao code AI sinh cần review: bản đồ 6 rủi ro phổ biến](https://everwise.study/courses/bao-mat-web-cho-vibe-coder-owasp-secrets-va-du-lieu-nguoi-dung/ban-do-rui-ro-code-ai-sinh.md)
  - [🗄️ SQL injection: AI hay nối chuỗi và cách sửa bằng parameterized query](https://everwise.study/courses/bao-mat-web-cho-vibe-coder-owasp-secrets-va-du-lieu-nguoi-dung/sql-injection-parameterized-query-trong-code-ai.md) (sign-in required)
  - [🌐 XSS và CSRF: lỗi render dữ liệu và thao tác thiếu token](https://everwise.study/courses/bao-mat-web-cho-vibe-coder-owasp-secrets-va-du-lieu-nguoi-dung/xss-csrf-loi-render-va-thieu-token.md)
  - [✅ Checkpoint: nhận diện injection trong code AI](https://everwise.study/courses/bao-mat-web-cho-vibe-coder-owasp-secrets-va-du-lieu-nguoi-dung/checkpoint-nhan-dien-injection-code-ai.md) — this lesson
- **🔐 Secrets, cấu hình và quy trình review trước khi deploy**
  - [🔑 Lộ API key trong repo và quản lý biến môi trường](https://everwise.study/courses/bao-mat-web-cho-vibe-coder-owasp-secrets-va-du-lieu-nguoi-dung/lo-api-key-va-quan-ly-bien-moi-truong.md)
  - [🧱 HTTPS, phân quyền cơ bản và validate input ở server](https://everwise.study/courses/bao-mat-web-cho-vibe-coder-owasp-secrets-va-du-lieu-nguoi-dung/https-phan-quyen-validate-input-server.md)
  - [📋 Checklist review code AI trước khi deploy](https://everwise.study/courses/bao-mat-web-cho-vibe-coder-owasp-secrets-va-du-lieu-nguoi-dung/checklist-review-code-ai-truoc-deploy.md) (premium content)
  - [🏁 Checkpoint: secrets, cấu hình và quy trình review](https://everwise.study/courses/bao-mat-web-cho-vibe-coder-owasp-secrets-va-du-lieu-nguoi-dung/checkpoint-secrets-cau-hinh-review.md) (premium content)
- [Course cheatsheet](https://everwise.study/courses/bao-mat-web-cho-vibe-coder-owasp-secrets-va-du-lieu-nguoi-dung/cheatsheet.md) (premium content)
