我可以在准备好的语句中参数化表名吗?

我可以在准备好的语句中参数化表名吗?

我多次使用mysqli_stmt_bind_param函数。但是,如果我将试图防止SQL注入的变量分开,则会遇到错误。

下面是一些代码示例:

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();}

是否可以某种方式替换.$new_table.与另一个问号语句连接,创建另一个BIND参数语句,还是添加到现有语句中以防止SQL注入?

像这样或某种形式的:

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();}


慕森王
浏览 759回答 2
2回答

阿晨1998

对你问题的简短回答是“不”。在最严格的意义上,在数据库级别上,准备语句只允许将参数绑定到SQL语句的“值”位。其中一种思维方式是“在运行时执行语句时可以替换的东西,而不改变其含义”。表名不是这些运行时值之一,因为它决定SQL语句本身的有效性(即哪些列名是有效的),并且在执行时更改它可能会改变SQL语句是否有效。在稍高的级别上,即使在模拟已准备好的语句参数替换而不是实际将准备好的语句发送到数据库(例如PDO)的数据库接口中,PDO允许您在任何地方使用占位符(因为占位符在发送到这些系统中的数据库之前被替换),表占位符的值将是一个字符串,并将其封装在发送到数据库的SQL中,因此SELECT * FROM ?带着mytable因为Param最终会发送SELECT * FROM 'mytable'到数据库,这是无效的SQL。你最好的选择就是继续SELECT * FROM {$mytable}但是你绝对一点儿没错应该有一个表的白名单,如果是这样的话,应该首先对照这些表进行检查。$mytable来自用户输入。

慕村9548890

当尝试创建“数据库”时,同样的规则也适用。不能使用准备好的语句绑定数据库。即:CREATE DATABASE IF NOT EXISTS ?不会起作用的。代之以安全员。附带说明:我添加了这个答案(作为一个社区wiki),因为它通常用来结束问题,一些人在试图绑定一个数据库而不是一张桌子和/或一列。
打开App,查看更多内容
随时随地看视频慕课网APP