Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

lỗ hổng mysql_escape_string

Câu trả lời không hay:

Không đáng tin cậy. Bạn đang đề cập đến mysql_escape_string() , không tính đến mã hóa kết nối (while mysql_real_escape_string() hiện).

Vì vậy, có thể là một chuỗi được làm thủ công cẩn thận, với mã điểm UTF8 chưa hoàn thiện được chế tạo cẩn thận ở phía trước, might dẫn đến kết quả là dấu ngoặc kép được thoát bởi mysql_escape_string() nhưng bản thân lối thoát đang bị MySQL bỏ qua vì nó sẽ "xem" nó là một ký tự UTF8.

Ví dụ:

0xC2' OR 1=1 ;--

sẽ được thoát bởi mysql_escape_string() như

0xC2\' OR 1=1 ;--

sẽ được lắp ráp thành

WHERE password='0xC2\' OR 1=1 ;--';

và được MySQL nhìn thấy (nếu mã hóa kết nối thích hợp có hiệu lực) như, ví dụ:

WHERE password='€' OR 1=1 ;[--';]    <-- the bracketed part is considered a comment and ignored

đây sẽ là một cách chèn SQL cổ điển.

Nhưng điều này dựa trên thực tế là bạn đã chỉ định, có thể là do mất tập trung, một hàm không được dùng nữa . Nếu bạn thực sự đang đề cập đến mysql_real_escape_string() , sau đó nó sẽ không hoạt động.

Ngoài ra, điều này giả định rằng cả máy chủ hoặc lớp ứng dụng (ví dụ:PHP) sử dụng bất kỳ loại xác thực bộ ký tự nào khi điền đầu vào. Nếu họ làm vậy, UTF8 không hợp lệ sẽ bị xóa khi đến nơi và thậm chí không bao giờ được nhìn thấy bởi mysql_escape_string , tất nhiên sau đó sẽ là đủ.

Câu trả lời thực sự:

Không sử dụng mysql_escape_string (hoặc mysql_whatever ) ở tất cả. Chúng đã không được dùng nữa và mã của bạn có thể ngừng hoạt động. Sử dụng các hàm PDO để thay thế.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tạo Bảng và cột động bằng cách sử dụng trình kết nối python mysql

  2. Bộ nhớ Cơ sở dữ liệu RDS hết dung lượng

  3. MYSQL Chọn trên một cột hai giá trị

  4. Tạo một chuỗi ngày

  5. Làm cách nào để chèn bản ghi bằng hàm MySQL NOW () trong MySQLi với bind_param?