SQL Injection là gì ?
Bài viết hôm nay mình muốn chia sẽ với các bạn về một chủ đề tấn công cơ bản “SQL Injection”.
I . Định nghĩa SQL Injection ?
Trước hết chúng ta cùng tìm hiểu “SQL Injection” là gì ?
SQL injection is a code injection technique, used to attack data-driven applications, in which malicious SQL statements are inserted into an entry field for execution (e.g. to dump the database contents to the attacker). (wikipedia.com)
Từ định nghĩa trích dẫn từ trang wikipedia trên chúng ta có thể hiểu nôm na đó là một kĩ thuật tấn công vào cơ sở dữ liệu bằng cách chèn các đoạn mã đọc hại vào, giúp cho hệ thống bị đánh lạc hướng, và dữ liệu bị phá hủy hay bị đánh cắp.
II. Các ví dụ
a) Tấn công bằng mệnh đề luôn đúng
Đầu tiên một ví dụ dễ thấy đó là các chức năng tìm kiếm hoặc trang đăng nhập, bạn hãy xem đoạn code truy vấn SQL dưới đây mô tả đoạn code kiểm tra người dùng có tồn tại trong hệ thông hay không
SELECT * FROM user WHERE username = $username
Các bạn có thấy đoạn mã trên quen quen không nào ? Mình tin là chúng ta đã sử dụng đoạn code tương tự như trên 1 lần trong đời khi mới bước vào lĩnh vực lập trình web rồi đây 🙂 . Sau đây mình sẽ cho các bạn thấy đoạn code trên nguy hiểm như thế nào? Giả sử trong ô đăng nhập ai đó cố tình điền vào “or 1=1” thì khi truy vấn, câu SQL của chúng ta sẽ trở thành mệnh đề luôn đúng như dưới đây
SELECT * FROM user WHERE username = $username OR 1 = 1
Vì là “or 1=1” nên câu SQl trên luôn thực thi và một kẻ nào đó sẽ có thể đăng nhập vào hệ thống của bạn một cách dễ dàng, điều này là hết sức nguy hiểm, nhất là các trang back end quản trị website của bạn.
b) Tấn công để phá hoại trực tiếp dữ liệu
Cũng đoạn truy vấn trên, nhưng chúng ta không cố tình nhập vào “OR 1=1″ mà lần này nhập thêm như thế này vào ô input chưa username để đăng nhâ[j như sau : ” ; DROP table table_name”‘
Lúc này đoạn truy vấn đầy đủ sẽ trở thành
SELECT * FROM user WHERE username = $username ; Drop table table_name
Vì SQL hỗ trợ thực thi một chuỗi lệnh liên tiếp và cách nhau bằng dấu chấm phẩy “;” , vì thế với câu lệnh trên, sau khi lấy ra thông tin user, nó sẽ thực thi lệnh xóa đi một table được chỉ định nào đó. Điều này thực sự hết sức nguy hiểm, phá hoại trực tiếp đến hệ thống cơ sở dữ liệu
Như các bạn thấy, chỉ với một vài ví dụ, đủ để chúng ta thấy được rằng nhưng điều nhỏ bé đôi khi lại gây ra những tác hại vô cùng nghiêm trọng. Trong các bài blog tới, mình sẽ cố gắng viết tiếp về các kiểu tấn công khác và phương hướng khắc phục. Thân


Bài viết rất cơ bản. Để chống sql injection: – sử dụng hàm mysqli_real_escape_string để lọc các ký tự thoát khi thực thi câu truy vấn ( với driver mysqli) – sử dụng hàm htmlentries để mã hóa các ký tự đặc biệt sang dạng entries – lọc dữ liệu đầu vào khi thực thi câu truy vấn: + ví dụ: product id có kiểu int, sử dụng hàm settype để đặt kiểu dữ liệu là integer settype($product_id,”integer”); cho dù truyền biến product_id có dạng 1 or 1=1 thì product_id cũng sẽ chỉ nhận giá trị 1. …. Đó là… Read more »
Cám ơn chia sẽ của bạn nhé