Saya telah dituntun untuk percaya bahwa:
$selection = mysql_query($dblink, "SELECT * FROM table WHERE name='$idValue' ");
dapat dengan mudah dikompromikan dengan nilai untuk $idValue
yang menutup '
lalu tambahkan perintah tambahan, seperti
$idValue = "z'; DELETE * FROM table WHERE name IS NOT NULL";
Sementara saya menyadari Anda menyatakan bahwa beberapa pernyataan dinonaktifkan, sesuatu yang tidak mengerikan adalah mengembalikan data yang tidak sah daripada mengedit data dalam tabel secara langsung, seperti:
$idValue = "z' OR name IS NOT NULL OR name = 'x";
Sedangkan dengan MySQLi ada kemungkinan bahwa pendekatan tersebut dapat digunakan dengan prepared statements
, yang akan mencegah variabel bertindak di luar statusnya hanya sebagai variabel. Seperti:
mysqli->prepare("SELECT * FROM tables WHERE name = ? LIMIT 1");
mysqli->bind_param("s",$idValue);
mysqli->execute();
Pemahaman saya tentang bind_param
adalah variabel tersebut akan membuat semua kata kunci dan karakter kunci MySQL lolos sehingga mencegah pelanggaran keamanan dan kembalinya baris yang tidak sah.
Ini adalah pilihan yang tidak dimiliki oleh MySQL . Pernyataan yang disiapkan membantu meningkatkan keamanan injeksi tetapi tidak akan mencegah serangan injeksi saja, tetapi lebih banyak yang harus digunakan sebagai bagian dari strategi yang lebih luas oleh programmer.
Sama seperti mengenakan pelindung tubuh tidak akan membuat Anda tak terkalahkan, tetapi itu akan sangat meningkatkan peluang Anda untuk bertahan hidup. MySQLi bukan peluru ajaib, dan juga bukan PDO, tetapi mereka akan meningkatkan tingkat keamanan secara keseluruhan.
MySQL juga ditinggalkan dan seperti yang dinyatakan oleh Christopher, tidak lagi dipertahankan berarti jumlah lubang dan masalah dengannya hanya akan meningkat seiring dengan berkembangnya teknologi lain.
Ringkasan
Jika Anda menulis MySQLi pernyataan dengan cara yang sama seperti Anda menulis pernyataan MySQL, maka Anda tidak akan memiliki perlindungan tambahan dari suntikan. Namun, MySQLi menawarkan Pernyataan yang Disiapkan pendekatan yang secara signifikan meningkatkan pertahanan terhadap injeksi SQL, tetapi perubahan antarmuka basis data yang mendasari itu sendiri tidak memberi Anda manfaat atau perlindungan yang melekat kecuali jika Anda memilih untuk mengkodekannya sendiri menggunakan pernyataan yang disiapkan .