SQL injection · Inject SQL
When input becomes a command
- Many apps build a database query by gluing the user's input into a string. That is dangerous.
- If an attacker types SQL as their input, it can become part of the query. This is SQL injection — the most famous web attack.
Khi đầu vào trở thành lệnh
- Nhiều ứng dụng xây dựng truy vấn cơ sở dữ liệu bằng cách nối đầu vào của người dùng vào một chuỗi. Điều đó rất nguy hiểm.
- Nếu kẻ tấn công nhập SQL như đầu vào của chúng, nó có thể trở thành một phần của truy vấn. Đây là SQL injection — cuộc tấn công web nổi tiếng nhất.
See the attack
- Imagine a login that checks
... WHERE name = '<whatever you typed>'. - An attacker types
' OR '1'='1as the name. The query becomes:
'1'='1'is always true, so the database returns every user. The login is bypassed. Run it and see.
Quan sát cuộc tấn công
- Hãy tưởng tượng một đăng nhập kiểm tra
... WHERE name = '<whatever you typed>'. - Một kẻ tấn công nhập
' OR '1'='1làm tên. Truy vấn trở thành:
SELECT * FROM users WHERE name = '' OR '1'='1';
'1'='1'là luôn đúng, nên cơ sở dữ liệu trả về mọi người dùng. Đăng nhập bị vượt qua. Hãy thử chạy nó và xem kết quả.
The fix: parameterised queries
- Never glue user input into SQL. Use parameterised queries (also called prepared statements).
- The database treats the input strictly as a value, never as code — so
' OR '1'='1is just a (failed) name to look up. - Also apply least privilege: the web app's database account should only do what it needs.
Giải pháp: truy vấn tham số
- Không bao giờ nối trực tiếp đầu vào của người dùng vào câu lệnh SQL. Hãy sử dụng truy vấn tham số (còn gọi là lệnh chuẩn bị sẵn).
- Cơ sở dữ liệu xử lý đầu vào một cách nghiêm ngặt như một giá trị, không phải mã — vì vậy
' OR '1'='1chỉ là một tên (không thành công) cần tìm kiếm. - Áp dụng nguyên tắc quyền tối thiểu: tài khoản cơ sở dữ liệu của ứng dụng web chỉ được thực hiện những việc cần thiết.
Your turn
- Below, write a precise, safe query that returns only bob by his
id. That is the spirit of a parameterised lookup.
Covers: A-Level data security; web application security.
Đến lượt bạn
- Bên dưới, hãy viết một truy vấn chính xác và an toàn để trả về duy nhất bob thông qua
idcủa anh ấy. Đó chính là tinh thần của một phép tra cứu có tham số.
Phạm vi: An ninh dữ liệu A-Level; An ninh ứng dụng web.
Common mistakes
- Never build a query by joining raw user input into the text.
- Use parameterised queries so input can never change the query.
Lỗi thường gặp
- Không bao giờ xây dựng truy vấn bằng cách ghép nối đầu vào thô của người dùng vào văn bản.
- Sử dụng truy vấn tham số để đảm bảo đầu vào không thể thay đổi truy vấn.
First, run the attack and see the damage. The app glued the attacker's input into the query, so the condition became name = '' OR '1'='1'. Complete the query exactly like that and see every user leak out. · Trước tiên, hãy chạy cuộc tấn công và xem hậu quả. Ứng dụng đã ghép đầu vào của kẻ tấn công vào truy vấn, nên điều kiện trở thành name = '' OR '1'='1'. Hoàn thành truy vấn y hệt như vậy và xem mọi người dùng bị rò rỉ ra ngoài.
Click Run to see the output here. · Nhấn Chạy để xem kết quả ở đây.
A safe lookup uses a precise condition. Change the query to return only bob's row, by adding WHERE id = 2. · Một tìm kiếm an toàn sử dụng điều kiện chính xác. Thay đổi truy vấn để chỉ trả về dòng của bob, bằng cách thêm WHERE id = 2.
Click Run to see the output here. · Nhấn Chạy để xem kết quả ở đây.