Checkpoint: nhận diện injection trong code AI
Quiz
- 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ụ.
- Đ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.
- 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) + "'", ...)
- 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.
- Đ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.
- 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.
- 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.
- 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).
- 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 ?.
- 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.
Sign in to submit answers.