Một số vấn đề khi thao tác với CSDL

Một phần của tài liệu Bài giảng phân tích ứng dụng web (Trang 97 - 99)

CHƯƠNG 8: PHP VÀ CƠ SỞ DỮ LIỆU MYSQL 8.1 Các kiểu dữ liệu trong MySQL

8.4 Một số vấn đề khi thao tác với CSDL

Lưu ý vấn đề bảo mật với lỗi sql injection. Nếu ta cần cung cấp 1 tham số cho câu lệnh SQL, nhất là các tham số từ trình duyệt do người dùng nhập vào, bạn hãy lưu ý đề phòng lỗi bảo mật SQL Injection. Giả sử ta muốn thay đổi mật mã của account xyz, mật mã mới được người dùng nhập vào và lưu vào trong biến $newPwd, đoạn mã đổi password có thể tương tự như sau:

//...

$sql = "UPDATE member SET password='$newPwd' WHERE username='xyz'"; mysqli_query($con, $sql);

//... ?>

Giả sử người dùng nhập vào mật mã mới là zzz, câu lệnh SQL sẽ trở thành UPDATE member SET password='zzz' WHERE username='xyz'

Hoàn toàn hợp lệ và đúng đắn, không có gì phải thắc mắc hết.

Nhưng giả sử người dùng nhập vào mật mã mới là zzz'#, câu lệnh SQL sẽ trở thành UPDATE member SET password='zzz'#' WHERE username='xyz'

Nhưng gì phía sau ký tự # sẽ được MySQL xem là chú thích và sẽ bỏ qua, như vậy câu lệnh SQL của chúng ta trên thực tế sẽ tương đương với:

UPDATE member SET password='zzz'

Vậy ta thấy ở đây sau khi chạy câu lệnh này, password của tất cả các account đều là zzz hết, tất hiên là account admin cũng sẽ bị đổi password thành zzz và lúc này hậu quả tiếp theo ra sao chắc bạn cũng đã rõ!

Để tránh bị SQL injection, khi đưa các tham số vào câu lệnh SQL, bạn nên luôn nhớ và áp dụng 2 điều sau:

• Nếu tham số là số (số nguyên hoặc số thực), cộng thêm 0 vào tham số trước khi đưa vào câu lệnh SQL. Tức là:

$thamso+=0;

$sql = "...$thamso...";

• Nếu tham số là chuỗi, sử dụng hàm mysql_real_escape_string trước khi đưa tham số vào câu lệnh SQL. Tức là:

$thamso = mysql_real_escape_string($thamso, $conn); $sql = "...'$thamso'...";

Một phần của tài liệu Bài giảng phân tích ứng dụng web (Trang 97 - 99)