Tidak, tidak ada!
Secara teknis ada PDO::quote()
tetapi jarang digunakan dan tidak setara dengan mysql_real_escape_string()
Benar! Jika Anda sudah menggunakan PDO dengan cara yang benar seperti yang didokumentasikan menggunakan pernyataan yang disiapkan , maka itu akan melindungi Anda dari injeksi MySQL.
# Example:
Di bawah ini adalah contoh aman kueri basis data menggunakan pernyataan yang disiapkan (pdo)
try {
// first connect to database with the PDO object.
$db = new \PDO("mysql:host=localhost;dbname=xxx;charset=utf8", "xxx", "xxx", [
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
} catch(\PDOException $e){
// if connection fails, show PDO error.
echo "Error connecting to mysql: " . $e->getMessage();
}
Dan, sekarang dengan asumsi koneksi dibuat, Anda dapat menjalankan kueri Anda seperti ini.
if($_POST && isset($_POST['color'])){
// preparing a statement
$stmt = $db->prepare("SELECT id, name, color FROM Cars WHERE color = ?");
// execute/run the statement.
$stmt->execute(array($_POST['color']));
// fetch the result.
$cars = $stmt->fetchAll(\PDO::FETCH_ASSOC);
var_dump($cars);
}
Sekarang, seperti yang mungkin Anda ketahui, saya belum pernah menggunakan apa pun untuk melarikan diri/membersihkan nilai $_POST["color"]
. Dan kode ini aman dari injeksi myql berkat PDO dan kekuatan pernyataan yang disiapkan.
Perlu dicatat bahwa Anda harus memberikan charset=utf8
sebagai atribut, di DSN
. Anda seperti yang terlihat di atas, untuk alasan keamanan, dan selalu aktifkan PDO untuk menampilkan kesalahan dalam bentuk pengecualian.
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
jadi kesalahan dari kueri basis data Anda tidak akan mengungkapkan data sensitif seperti struktur direktori Anda, nama pengguna basis data, dll.
Last but not least, ada saat-saat ketika Anda seharusnya tidak mempercayai PDO 100%, dan akan terikat untuk mengambil beberapa tindakan ekstra untuk mencegah injeksi sql, salah satunya adalah, jika Anda menggunakan versi lama dari mysql [ mysql =< 5.3.6 ]
seperti yang dijelaskan dalam jawaban ini
Namun, menggunakan pernyataan siap seperti yang ditunjukkan di atas akan selalu lebih aman, daripada menggunakan salah satu fungsi yang dimulai dengan mysql_
Selamat membaca