Tấn công SQL Injection và cách khắc phục

Khi lập trình website việc bị tấn công bằng sql injection là hoàn toàn có thể xảy ra nếu các bạn chưa trang bị kiến thức. Vậy cách tấn công sql injection là gì? làm sao để phòng ngừa và khắc phục khi bị tấn công.
  • 11:03 02/12/2016
  • Kỳ Nhân
  • 0 Bình luận
  • 792

- SQL Injection (SQLi)

- Khi thiết kế website, thường tạo phần admin và đăng ký đăng nhập. Hiện tượng tấn công bằng SQL Infection xảy ra khi có các form đăng nhập vào website.

- Hack website bằng SQL Infection là xử dụng lỗi các câu query, select trong sql để đăng nhập mà không cần biết user và mật khẩu. Khi đó

- Vậy tấn công bằng SQL Infection như thế nào? Ta theo dõi ví dụ. Đầu tiên có form đăng nhập yêu cầu người dùng nhập vào 2 trường là username và password. Khi đó hacker có thể thêm, xóa, sửa cơ sở dữ liệu của trang web, gây ảnh hưởng đến toàn cơ sở dữ liệu.

- Cách tấn công SQL Injection

Ví dụ ta có đoạn code dùng để xử lý đăng nhập user như sau:

if($_POST) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $sql = "select * from users where username='$username' and password='$password'";
    echo $sql."< br >";
    $check = mysqli_num_rows(mysqli_query($link, $sql));
    echo $check;
}

- Giả sử có table users và có một user là admin và mật khẩu là 123456. Khi đó người dùng nhập username và password vào thì câu lệnh sql sẽ là select * from users where username='admin' and password='123456' và sẽ cho ra kết quả đúng.

- Giờ thử tấn công bằng SQL Injection thử, các bạn nhập vào username và password bên dưới

admin
' OR '1'='1
// sql in ra la
select * from users where username='admin' and password='' OR '1'='1'

Như vậy lợi dụng sơ hở của câu lệnh sql ta vẫn đăng nhập được dù không biết mật khẩu. Các bạn có thể tùy biến câu lệnh vào cả username và password như dán vào cả hai trường username và password luôn.

' OR '1'='1
' OR '1'='1
// sql in ra la
select * from users where username='' OR '1'='1' and password='' OR '1'='1'

- Thường thì một số bạn sài mã hóa cho mật khẩu và không mã hóa cho username nên vẫn bị tấn công bằng SQL Injection như thường

- Cách khắc phục tấn công SQL Injection

- Có nhiều cách phòng chống tấn công SQL Injection như xóa các ký tự đặc biệt trong các dữ liệu đầu vào của khách hàng. Như ở trên nếu ta xóa đi dấu nháy đơn là không thể bị tấn công được, ta dùng hàm mysql_real_escape_string()

- Tuy nhiên cách tốt nhất là ta mã hóa toàn bộ username và password thì hoàn toàn loại bỏ cách tấn công này.

if($_POST) {
    $username = md5($_POST['username']);
    $password = md5($_POST['password']);
    $sql = "select * from users where username='$username' and password='$password'";
    echo $sql."< br >";
    $check = mysqli_num_rows(mysqli_query($link, $sql));
    echo $check;
}

- Chỉ cẩn lưu database thêm 2 trường mã hóa username và password nữa, rồi câu lệnh sql chỉ dựa vào database đã mã hóa là đươc. Khi đó tấn công bằng SQL Infection không thể làm gì được ta hết vì vào đã mã hóa ra chuỗi ký tự rồi làm gì còn các đoạn text query nữa.

- Chúc các bạn hạn chế và khắc phục được cách tấn công này.