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

Những thiếu sót của mysql_real_escape_string?

Thiếu sót chính của mysql_real_escape_string hay của phần mở rộng mysql_ nói chung là khó áp dụng chính xác hơn các API khác, hiện đại hơn, đặc biệt là các câu lệnh đã chuẩn bị. mysql_real_escape_string được cho là được sử dụng trong chính xác một trường hợp:thoát nội dung văn bản được sử dụng làm giá trị trong câu lệnh SQL giữa các dấu ngoặc kép. Ví dụ:

$value = mysql_real_escape_string($value, $link);
$sql = "... `foo` = '$value' ...";
                     ^^^^^^

mysql_real_escape_string đảm bảo rằng $value trong ngữ cảnh trên không làm lộn xộn cú pháp SQL. Nó không hoạt động như bạn nghĩ ở đây:

$sql = "... `foo` = $value ...";

hoặc tại đây:

$sql = "... `$value` ...";

hoặc tại đây:

$sql = mysql_real_escape_string("... `foo` = '$value' ...");

Nếu được áp dụng cho các giá trị được sử dụng trong bất kỳ ngữ cảnh nào khác với một chuỗi được trích dẫn trong một câu lệnh SQL, thì nó sẽ được áp dụng sai và có thể hoặc không làm sai cú pháp kết quả và / hoặc cho phép ai đó gửi các giá trị có thể kích hoạt các cuộc tấn công SQL injection. Trường hợp sử dụng của mysql_real_escape_string rất hẹp, nhưng hiếm khi được hiểu một cách chính xác.

Một cách khác để ngâm mình trong nước nóng bằng cách sử dụng mysql_real_escape_string là khi bạn đặt mã hóa kết nối cơ sở dữ liệu bằng phương pháp sai. Bạn nên làm điều này:

mysql_set_charset('utf8', $link);

Bạn có thể cũng làm điều này mặc dù:

mysql_query("SET NAMES 'utf8'", $link);

Vấn đề là cái sau bỏ qua API mysql_, cái mà vẫn cho rằng bạn đang nói chuyện với cơ sở dữ liệu bằng latin1 (hoặc cái gì khác). Khi sử dụng mysql_real_escape_string bây giờ, nó sẽ giả sử mã hóa ký tự sai và các chuỗi thoát khác với cơ sở dữ liệu sẽ diễn giải chúng sau này. Bằng cách chạy SET NAMES truy vấn, bạn đã tạo ra một khoảng cách giữa cách API máy khách mysql_ đang xử lý các chuỗi và cách cơ sở dữ liệu sẽ diễn giải các chuỗi này. Điều này có thể được sử dụng cho các cuộc tấn công tiêm trong các tình huống chuỗi nhiều byte nhất định.

Không có lỗ hổng bảo mật cơ bản nào trong mysql_real_escape_string mà tôi biết về nếu nó được áp dụng đúng cách. Tuy nhiên, một lần nữa, vấn đề chính là việc áp dụng nó không đúng cách rất dễ dàng, dẫn đến lỗ hổng bảo mật.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chấm dứt các kết nối mysql nhàn rỗi

  2. PostgreSQL so với MySQL:Cái nào tốt nhất?

  3. Xử lý các giao dịch trong MySQL

  4. Làm thế nào để thực thi một lệnh MySQL từ một tập lệnh shell?

  5. Tạo một chỉ mục trên một bảng sản xuất MySQL khổng lồ mà không cần khóa bảng