http://vietjack.com/sql/index.jsp Copyright © vietjack.com Injection SQL Nếu bạn nhận User Input thơng qua Webpage chèn vào SQL Database, tình cờ, bạn mở rộng cửa bảo mật bên ngoài, mà biết đến với tên gọi SQL Injection Chương hướng dẫn bạn cách ngăn cản tình xảy giúp bạn bảo vệ Script bạn lệnh SQL Server-Side Script PERL Script Injection thường xảy bạn yêu cầu input từ người dùng, tên họ, thay cung cấp tên, họ cung cấp cho bạn lệnh SQL mà bạn chạy Database mà khơng hay biết Đừng tin vào liệu cung cấp người dùng, xử lý liệu này, qui tắc, điều thực Pattern Matching (so khớp mẫu) Trong ví dụ dưới, name bị giới hạn ký tự chữ-số cộng với dấu gạch có độ dài từ đến 20 ký tự (bạn sửa đổi thấy cần thiết) if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysql_query("SELECT * FROM SINHVIEN WHERE name=$matches[0]"); } else { echo "user name not accepted"; } Để minh họa vấn đề, bạn xem phần trích sau: // gia su ban co input la nhu sau $name = "Hoang'; DELETE FROM SINHVIEN;"; mysql_query("SELECT * FROM CUSTOMSRS WHERE name='{$name}'"); Lời gọi hàm xem để lấy ghi từ bảng SINHVIEN, với cột name so khớp với name xác định người dùng Thông thường, $name chứa ký tự chữ-số có khoảng trống Nhưng đây, việc phụ thêm truy vấn hoàn toàn tới $name, lời gọi http://vietjack.com/ Trang chia sẻ học online miễn phí Page http://vietjack.com/sql/index.jsp Copyright © vietjack.com tới Database gây vấn đề lớn: truy vấn DELETE bị tiêm vào xóa tất ghi từ bảng SINHVIEN May mắn là, bạn sử dụng MySQL, hàm mysql_query() không cho phép Query Stacking thực thi nhiều truy vấn SQL lời gọi hàm đơn Nếu bạn nỗ lực để thực nhiều truy vấn, lời gọi hàm thất bại Tuy nhiên, với PHP Database, ví dụ SQLite PostgreSQL, lại cho thực nhiều truy vấn, thực thi tất truy vấn cung cấp chuỗi điều tạo vấn đề nghiêm trọng Ngăn cản SQL Injection Bạn xử lý tất Escape Character cách khéo léo ngôn ngữ Scripting PERL PHP MySQL extension cho PHP cung cấp hàm mysql_real_escape_string() để tránh ký tự nhập vào mà có ý nghĩa đặc biệt với MySQL if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysql_real_escape_string($name); mysql_query("SELECT * FROM SINHVIEN WHERE name='{$name}'"); LIKE Quandary SQL Để định vị LIKE Quandary, kỹ thuật người dùng tạo phải chuyển đổi ký tự '%' '_' người dùng cung cấp thành literal (hằng) Sử dụng hàm addcslashes(), hàm mà giúp bạn xác định dãy ký tự để thoát $sub = addcslashes(mysql_real_escape_string("%str"), "%_"); // $sub == \%str\_ mysql_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'"); http://vietjack.com/ Trang chia sẻ học online miễn phí Page ... tạo vấn đề nghiêm trọng Ngăn cản SQL Injection Bạn xử lý tất Escape Character cách khéo léo ngôn ngữ Scripting PERL PHP MySQL extension cho PHP cung cấp hàm mysql_real_escape_string() để tránh... với MySQL if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysql_real_escape_string($name); mysql_query("SELECT * FROM SINHVIEN WHERE name='{$name}'"); LIKE Quandary SQL Để...http://vietjack.com /sql/ index.jsp Copyright © vietjack.com tới Database gây vấn đề lớn: truy vấn DELETE bị tiêm vào xóa tất ghi từ bảng SINHVIEN May mắn là, bạn sử dụng MySQL, hàm mysql_query() không