mysql_real_escape_string[]
không thành công và tạo ra lỗi nếu chế độ SQL được bật. Trong trường hợp này, hàm không thể thoát khỏi các ký tự trích dẫn ngoại trừ bằng cách nhân đôi chúng và để thực hiện điều này đúng cách, hàm phải biết nhiều thông tin về ngữ cảnh trích dẫn hơn mức có sẵn. Thay vào đó, hãy sử dụng mysql_real_escape_string_quote[]
, có thêm một đối số để xác định ngữ cảnh trích dẫn
Đối số mysql
phải là một kết nối mở, hợp lệ vì việc thoát ký tự phụ thuộc vào ký tự do máy chủ sử dụng
Chuỗi trong đối số from
được mã hóa để tạo ra chuỗi SQL đã thoát, có tính đến bộ ký tự hiện tại của kết nối. Kết quả được đặt trong đối số to
, theo sau là byte null kết thúc
Các ký tự được mã hóa là \
,
char query[1000],*end; end = my_stpcpy[query,"INSERT INTO test_table VALUES['"]; end += mysql_real_escape_string[&mysql,end,"What is this",12]; end = my_stpcpy[end,"','"]; end += mysql_real_escape_string[&mysql,end,"binary data: \0\r\n",16]; end = my_stpcpy[end,"']"]; if [mysql_real_query[&mysql,query,[unsigned int] [end - query]]] { fprintf[stderr, "Failed to insert row, Error: %s\n", mysql_error[&mysql]]; }0,
char query[1000],*end; end = my_stpcpy[query,"INSERT INTO test_table VALUES['"]; end += mysql_real_escape_string[&mysql,end,"What is this",12]; end = my_stpcpy[end,"','"]; end += mysql_real_escape_string[&mysql,end,"binary data: \0\r\n",16]; end = my_stpcpy[end,"']"]; if [mysql_real_query[&mysql,query,[unsigned int] [end - query]]] { fprintf[stderr, "Failed to insert row, Error: %s\n", mysql_error[&mysql]]; }1,
char query[1000],*end; end = my_stpcpy[query,"INSERT INTO test_table VALUES['"]; end += mysql_real_escape_string[&mysql,end,"What is this",12]; end = my_stpcpy[end,"','"]; end += mysql_real_escape_string[&mysql,end,"binary data: \0\r\n",16]; end = my_stpcpy[end,"']"]; if [mysql_real_query[&mysql,query,[unsigned int] [end - query]]] { fprintf[stderr, "Failed to insert row, Error: %s\n", mysql_error[&mysql]]; }2 [ASCII 0],
char query[1000],*end; end = my_stpcpy[query,"INSERT INTO test_table VALUES['"]; end += mysql_real_escape_string[&mysql,end,"What is this",12]; end = my_stpcpy[end,"','"]; end += mysql_real_escape_string[&mysql,end,"binary data: \0\r\n",16]; end = my_stpcpy[end,"']"]; if [mysql_real_query[&mysql,query,[unsigned int] [end - query]]] { fprintf[stderr, "Failed to insert row, Error: %s\n", mysql_error[&mysql]]; }3,
char query[1000],*end; end = my_stpcpy[query,"INSERT INTO test_table VALUES['"]; end += mysql_real_escape_string[&mysql,end,"What is this",12]; end = my_stpcpy[end,"','"]; end += mysql_real_escape_string[&mysql,end,"binary data: \0\r\n",16]; end = my_stpcpy[end,"']"]; if [mysql_real_query[&mysql,query,[unsigned int] [end - query]]] { fprintf[stderr, "Failed to insert row, Error: %s\n", mysql_error[&mysql]]; }4 và Control+Z. Nói một cách chính xác, MySQL chỉ yêu cầu dấu gạch chéo ngược đó và ký tự trích dẫn được sử dụng để trích dẫn chuỗi trong truy vấn được thoát.
mysql_real_escape_string[]
trích dẫn các ký tự khác để dễ đọc hơn trong tệp nhật ký. Để so sánh, hãy xem quy tắc trích dẫn cho chuỗi ký tự và hàm SQL trong Chuỗi ký tự, và Hàm chuỗi và Toán tửChuỗi được trỏ tới bởi from
phải dài
char query[1000],*end; end = my_stpcpy[query,"INSERT INTO test_table VALUES['"]; end += mysql_real_escape_string[&mysql,end,"What is this",12]; end = my_stpcpy[end,"','"]; end += mysql_real_escape_string[&mysql,end,"binary data: \0\r\n",16]; end = my_stpcpy[end,"']"]; if [mysql_real_query[&mysql,query,[unsigned int] [end - query]]] { fprintf[stderr, "Failed to insert row, Error: %s\n", mysql_error[&mysql]]; }8 byte. Bạn phải phân bổ bộ đệm
to
dài ít nhất mysql_real_escape_string[]
0 byte. [Trong trường hợp xấu nhất, mỗi ký tự có thể cần được mã hóa bằng cách sử dụng hai byte và phải có chỗ cho byte null kết thúc. ] Khi mysql_real_escape_string[]
trả về, nội dung của to
là một chuỗi kết thúc null. Giá trị trả về là độ dài của chuỗi được mã hóa, không bao gồm byte null kết thúcNếu bạn phải thay đổi bộ ký tự của kết nối, hãy sử dụng hàm mysql_real_escape_string[]
3 thay vì thực hiện câu lệnh mysql_real_escape_string[]
4 [hoặc mysql_real_escape_string[]
5]. mysql_real_escape_string[]
3 hoạt động giống như mysql_real_escape_string[]
4 nhưng cũng ảnh hưởng đến bộ ký tự được sử dụng bởi mysql_real_escape_string[]
, mà mysql_real_escape_string[]
4 thì không
Ví dụ sau chèn hai chuỗi đã thoát vào một câu lệnh CR_INSECURE_API_ERR
0, mỗi chuỗi nằm trong các ký tự trích dẫn đơn
char query[1000],*end; end = my_stpcpy[query,"INSERT INTO test_table VALUES['"]; end += mysql_real_escape_string[&mysql,end,"What is this",12]; end = my_stpcpy[end,"','"]; end += mysql_real_escape_string[&mysql,end,"binary data: \0\r\n",16]; end = my_stpcpy[end,"']"]; if [mysql_real_query[&mysql,query,[unsigned int] [end - query]]] { fprintf[stderr, "Failed to insert row, Error: %s\n", mysql_error[&mysql]]; }
Hàm CR_INSECURE_API_ERR
1 được sử dụng trong ví dụ được bao gồm trong thư viện CR_INSECURE_API_ERR
2 và hoạt động giống như hàm CR_INSECURE_API_ERR
3 nhưng trả về một con trỏ tới null kết thúc của tham số đầu tiên
Độ dài của chuỗi mã hóa được đặt trong đối số to
, không bao gồm byte rỗng kết thúc hoặc -1 nếu xảy ra lỗi
Bởi vì mysql_real_escape_string[]
trả về một giá trị không dấu, bạn có thể kiểm tra -1 bằng cách so sánh giá trị trả về với CR_INSECURE_API_ERR
6 [hoặc với CR_INSECURE_API_ERR
7, tương đương]