Rumah >pangkalan data >tutorial mysql >Bagaimanakah Kami Boleh Menggunakan Nama Jadual Berparameter dengan Selamat dalam Pernyataan yang Disediakan untuk Mencegah Suntikan SQL?

Bagaimanakah Kami Boleh Menggunakan Nama Jadual Berparameter dengan Selamat dalam Pernyataan yang Disediakan untuk Mencegah Suntikan SQL?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-23 18:08:10369semak imbas

How Can We Securely Use Parameterized Table Names in Prepared Statements to Prevent SQL Injection?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn