Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Apakah perlu menggunakan mysql_real_escape_string(), saat magic_quotes_gpc aktif?

Untuk beberapa penyandian langka, seperti GBk - ya.
Tapi Anda harus mengembalikannya bukan karena alasan ini. Kutipan ajaib tetap harus dimatikan (dan akan ada di versi PHP berikutnya). Jadi, mysql_real_escape_string() adalah satu-satunya fungsi escape yang tersisa. Perhatikan bahwa ini bukan fungsi pencegahan injeksi sql. Banyak orang tidak mengerti hal ini:ini hanya bagian dari sintaks. Itu harus digunakan bukan untuk "melindungi" apa pun, tetapi untuk merakit kueri SQL yang benar secara sintaksis. Dan harus digunakan setiap kali Anda membuat kueri, dari mana pun data berasal. Tentu itu akan melindungi Anda dari injeksi SQL juga, sebagai efek samping.
Tentu saja, mysql_real_escape_string() hanya berfungsi dalam string yang dikutip. Jadi, jika Anda melakukannya

$num=mysql_real_escape_string($num);
$sql="SELECT INTO table SET data=$num"; /BAD!!!

Itu tidak akan melindungi apa pun. Jika Anda akan menggunakan nomor yang tidak dikutip, itu harus dilemparkan ke jenis yang tepat wajib, seperti ini:

$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
  • Perlu diingat bahwa saya membuat mysql_real_escape_string() berfungsi sebagaimana mestinya, pengkodean klien yang tepat harus disetel, dan ini mungkin hanya dengan mysql_set_charset() fungsi, kueri SET NAMES tidak akan menyetelnya.

Jika Anda ingin menghilangkan semua kerumitan ini, Anda dapat menggunakan pernyataan yang disiapkan , meskipun Anda perlu mengganti driver mysql Anda ke mysqli atau PDO.

Harap dicatat bahwa tidak ada sintaks yang tepat atau pernyataan yang disiapkan tidak akan membantu Anda dengan bagian kueri selain literal. Anda tidak dapat keluar dari Identifier atau operator. Jika Anda menggunakan bagian-bagian ini secara dinamis, mereka harus di-hardcode dalam skrip Anda, seperti ini (untuk klausa ORDER BY):

$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders));
$orderby=$orders[$key];
$query="SELECT * FROM `table` ORDER BY $orderby";

atau ini (klausa 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";


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cara mengindeks ulang tabel mysql

  2. PHP MYSQL mengambil TEKS dengan baris baru

  3. Apakah menggunakan Tabel Master untuk kolom bersama praktik yang baik untuk seluruh database?

  4. Unduhan Excel macet 188kb

  5. Masalah MySql dan memasukkan ID terakhir tetap ada