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.