Rumah >pangkalan data >tutorial mysql >Bagaimanakah Kami Boleh Menggunakan Nama Jadual Berparameter dengan Selamat dalam Pernyataan yang Disediakan untuk Mencegah Suntikan SQL?
Nama Jadual Berparameter dalam Pernyataan Disediakan: Dilema
Walaupun mysqli_stmt_bind_param telah terbukti berkesan untuk melindungi daripada suntikan SQL, ia menghadapi had apabila pembolehubah mempengaruhi nama jadual terlibat. Seperti yang digambarkan dalam coretan kod yang disediakan:
function insertRow( $db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol ) { $statement = $mysqli->prepare("INSERT INTO " .$new_table . " VALUES (?,?,?,?,?,?,?);"); mysqli_stmt_bind_param( $statment, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol ); $statement->execute(); }
Penggabungan bermasalah $new_table memperkenalkan kerentanan kepada suntikan SQL. Percubaan untuk menggantikan ini dengan pemegang tempat lain, seperti yang ditunjukkan dalam coretan berikut, gagal:
function insertRow( $db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol ) { $statement = $mysqli->prepare("INSERT INTO (?) VALUES (?,?,?,?,?,?,?);"); mysqli_stmt_bind_param( $statment, 'ssssisss', $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol ); $statement->execute(); }
Batasan Penyata Disediakan
Isu teras terletak pada ketidakupayaan daripada pernyataan yang disediakan untuk melindungi parameter yang mentakrifkan struktur pernyataan SQL, seperti nama jadual. Ini kerana pernyataan yang disediakan secara eksklusif membenarkan parameter untuk nilai yang tidak mengubah makna pernyataan. Memandangkan nama jadual menentukan kesahihan pernyataan SQL, mengubah suainya semasa pelaksanaan berpotensi membatalkannya.
Walaupun dengan antara muka pangkalan data seperti PDO yang meniru pernyataan yang disediakan dengan menggantikan parameter sebelum menghantarnya ke pangkalan data, nilai pemegang tempat masih kekal rentetan yang disertakan dalam pernyataan SQL. Akibatnya, PILIH DARI ? dengan mytable sebagai parameter akhirnya akan menghantar SELECT DARI 'mytable' ke pangkalan data, menjadikannya tidak sah.
Mengurangkan Risiko
Pendekatan paling selamat kekal menggunakan $mytable dalam rentetan, tetapi ia mesti disertakan dengan senarai putih jadual yang mana input pengguna disemak. Ini menghalang pelakon berniat jahat daripada melaksanakan pernyataan SQL pada jadual sewenang-wenangnya. Oleh itu, kod berikut menunjukkan pelaksanaan yang selamat:
if (whitelisted_tables($mytable)) { $statement = $mysqli->prepare("INSERT INTO $mytable VALUES (?,?,?,?,?,?,?);"); mysqli_stmt_bind_param( $statment, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol ); $statement->execute(); }
Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Menggunakan Nama Jadual Berparameter dengan Selamat dalam Pernyataan yang Disediakan untuk Mencegah Suntikan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!