Rumah >pembangunan bahagian belakang >tutorial php >Bolehkah Nama Jadual Diparameterkan dalam Pernyataan yang Disediakan untuk Mencegah Suntikan SQL?

Bolehkah Nama Jadual Diparameterkan dalam Pernyataan yang Disediakan untuk Mencegah Suntikan SQL?

DDD
DDDasal
2024-12-27 08:35:14324semak imbas

Can Table Names Be Parameterized in Prepared Statements to Prevent SQL Injection?

Memparameterkan Nama Jadual dalam Pernyataan yang Disediakan: Adakah Mungkin?

Percubaan untuk membuat parameter nama jadual dalam pernyataan yang disediakan biasanya membawa kepada kelemahan suntikan SQL. Walaupun fungsi mysqli_stmt_bind_param membenarkan parameter mengikat kepada nilai, ia tidak menyokong nama jadual berparameter.

Sebagai contoh, coretan kod berikut menunjukkan percubaan untuk meparameterkan nama jadual:

function insertRow($db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol) {
    $statement = $mysqli->prepare("INSERT INTO ? VALUES (?,?,?,?,?,?,?);");
    mysqli_stmt_bind_param($statement, 'ssssisss', $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol));
    $statement->execute();
}

Walau bagaimanapun , pendekatan ini tidak betul dan akan mengakibatkan pertanyaan tidak sah apabila dilaksanakan. Penyata yang disediakan direka bentuk untuk mengikat parameter kepada nilai tertentu dan nama jadual tidak dianggap sebagai nilai yang boleh diparameterkan.

Sebaliknya, adalah disyorkan untuk menggunakan nama jadual statik bersama-sama dengan senarai putih nilai yang dibenarkan untuk melindungi daripada Suntikan SQL. Contohnya:

function insertRow($db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol) {
    if (!in_array($new_table, $allowed_tables)) {
        throw new Exception("Invalid table name");
    }

    $statement = $mysqli->prepare("INSERT INTO $new_table VALUES (?,?,?,?,?,?,?);");
    mysqli_stmt_bind_param($statement, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol);
    $statement->execute();
}

Pendekatan ini memastikan bahawa hanya nama jadual yang sah digunakan, mengurangkan risiko suntikan SQL yang dikaitkan dengan perubahan nama jadual dinamik.

Atas ialah kandungan terperinci Bolehkah Nama Jadual Diparameterkan 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