Đối với một số mã hóa hiếm, chẳng hạn như GBk - có.
Nhưng bạn không nên hoàn nguyên nó không phải vì lý do này. Dù sao thì dấu ngoặc kép cũng nên được tắt (và sẽ có trong phiên bản PHP tiếp theo). Vì vậy, mysql_real_escape_string () là hàm thoát duy nhất còn lại. Lưu ý rằng nó không phải là chức năng ngăn chặn tiêm sql. Nhiều người không hiểu điểm này:nó chỉ là một phần của cú pháp. Nó phải được sử dụng không phải để "bảo vệ" bất cứ thứ gì, mà để lắp ráp truy vấn SQL chính xác về mặt cú pháp. Và phải được sử dụng mỗi khi bạn xây dựng truy vấn của mình, bất kể dữ liệu đến từ đâu. Chắc chắn nó cũng sẽ bảo vệ bạn khỏi việc tiêm SQL như một tác dụng phụ.
Tất nhiên, mysql_real_escape_string()
chỉ hoạt động trong các chuỗi được trích dẫn. Vì vậy, nếu bạn làm như vậy
$num=mysql_real_escape_string($num);
$sql="SELECT INTO table SET data=$num"; /BAD!!!
Nó sẽ không bảo vệ gì.
$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
- Hãy nhớ rằng mo make
mysql_real_escape_string()
hoạt động như dự kiến, phải đặt mã hóa ứng dụng khách phù hợp và có thể chỉ vớimysql_set_charset()
, truy vấn SET NAMES sẽ không thiết lập điều đó.
Nếu bạn muốn loại bỏ tất cả những phức tạp này, bạn có thể sử dụng tuyên bố chuẩn bị sẵn , mặc dù bạn sẽ cần chuyển trình điều khiển mysql của mình sang mysqli hoặc PDO.
Xin lưu ý rằng không có cú pháp thích hợp cũng như các câu lệnh chuẩn bị sẵn sẽ không giúp bạn với các phần truy vấn ngoài các nghĩa đen. Bạn không thể thoát Mã định danh hoặc toán tử. Nếu bạn tình cờ sử dụng động các phần này, chúng phải được mã hóa cứng trong tập lệnh của bạn, như thế này (đối với mệnh đề ORDER BY):
$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders));
$orderby=$orders[$key];
$query="SELECT * FROM `table` ORDER BY $orderby";
hoặc điều này (mệnh đề WHERE)
$w=array();
if (!empty($_GET['rooms'])) $w[]="rooms='".mysql_real_escape_string($_GET['rooms'])."'";
if (!empty($_GET['space'])) $w[]="space='".mysql_real_escape_string($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mysql_real_escape_string($_GET['max_price'])."'";
if (count($w)) $where="WHERE ".implode(' AND ',$w); else $where='';
$query="select * from table $where";