Home >Backend Development >PHP Tutorial >Can Table Names Be Parameterized in Prepared Statements to Prevent SQL Injection?
Parameterizing Table Names in Prepared Statements: Is It Possible?
Attempting to parameterize table names within prepared statements commonly leads to SQL injection vulnerabilities. While the mysqli_stmt_bind_param function allows binding parameters to values, it does not support parameterized table names.
For example, the following code snippet demonstrates an attempt to parameterize the table name:
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(); }
However, this approach is incorrect and will result in an invalid query when executed. Prepared statements are designed to bind parameters to specific values, and table names are not considered values that can be parameterized.
Instead, it is recommended to use static table names in conjunction with a whitelist of allowed values to protect against SQL injection. For example:
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(); }
This approach ensures that only valid table names are used, mitigating SQL injection risks associated with dynamic table name changes.
The above is the detailed content of Can Table Names Be Parameterized in Prepared Statements to Prevent SQL Injection?. For more information, please follow other related articles on the PHP Chinese website!