Xem xét các dòng dưới đây từ mysql_real_escape_string () hướng dẫn sử dụng:
Việc chèn SQL trong MySQL sẽ không thể thực hiện được chỉ với các ký tự đặc biệt sau:\b
\0
\n
\r
\t
\Z
.
Tuy nhiên, hướng dẫn sử dụng String Literals nêu những điều sau nhưng các lý do được chỉ định (hoặc không) không liên quan đến SQL injection:
Hơn nữa, trong một thử nghiệm đơn giản, bất kể thời tiết, các ký tự đặc biệt được liệt kê ở trên có thoát ra ngoài hay không, MySQL đều cho kết quả tương tự. Nói cách khác, MySQL thậm chí còn không bận tâm:
$query_sql = "SELECT * FROM `user` WHERE user = '$user'";
Truy vấn trên hoạt động tương tự đối với các phiên bản không thoát và không thoát của các ký tự được liệt kê ở trên như được đưa vào bên dưới:
$user = chr(8); // Back Space
$user = chr(0); // Null char
$user = chr(13); // Carriage Return
$user = chr(9); // Horizontal Tab
$user = chr(26); // Substitute
$user = chr(92) .chr(8); // Escaped Back Space
$user = chr(92) .chr(0); // Escaped Null char
$user = chr(92) .chr(13); // Escaped Carriage Return
$user = chr(92) .chr(9); // Escaped Horizontal Tab
$user = chr(92) .chr(26); // Escaped Substitute
Bảng thử nghiệm và dữ liệu được sử dụng trong thử nghiệm đơn giản:
-- Table Structure
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` varchar(10) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- Table Data
INSERT INTO `user` ( `user` ) VALUES
( char( '8' ) ),
( char( '0' ) ),
( char( '10' ) ),
( char( '13' ) ),
( char( '9' ) ),
( char( '26' ) );