Tôi có thể sử dụng cái gì thay vì Mysql_real_escape_string?

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úc

Nế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_ERR0, 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_ERR1 được sử dụng trong ví dụ được bao gồm trong thư viện CR_INSECURE_API_ERR2 và hoạt động giống như hàm CR_INSECURE_API_ERR3 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_ERR6 (hoặc với CR_INSECURE_API_ERR7, tương đương)

mysql_real_escape_string có bị phản đối không?

Tiện ích mở rộng này không được dùng trong PHP 5. 5. 0 và nó đã bị xóa trong PHP 7. 0 .

Khi nào thì sử dụng mysql_real_escape_string?

Định nghĩa và cách sử dụng . escapes special characters in a string for use in an SQL query, taking into account the current character set of the connection.

mysql_real_escape_string có ngăn SQL injection không?

PHP cung cấp mysql_real_escape_string() để thoát các ký tự đặc biệt trong chuỗi trước khi gửi truy vấn tới MySQL. Hàm này được nhiều người sử dụng để thoát dấu nháy đơn trong chuỗi và đồng thời ngăn chặn các cuộc tấn công SQL injection .

mysql_real_escape_string có an toàn không?

Nếu bạn sử dụng mysql_real_escape_string một cách nhất quán mỗi khi bạn đưa nội dung vào một chuỗi ký tự SQL, thì không sao, không có vấn đề gì về bảo mật .