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

Php 我可以在准备好的语句中参数化表名吗?,php,mysql,sql,Php,Mysql,Sql,我已经多次使用mysqli_stmt_bind_param函数。然而,如果我分离了我试图防止SQL注入的变量,我就会遇到错误 下面是一些代码示例: function insertRow( $db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol ) { $statement = $mysqli->prepare("INSERT INTO " .$new_ta

我已经多次使用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\u表。
连接,生成另一个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();
}

对你的问题的简短回答是“不”

从最严格的意义上讲,在数据库级别,准备好的语句只允许为SQL语句的“值”位绑定参数

考虑这一点的一种方式是“在运行时执行语句时可以替换的东西,而不会改变其含义”。表名不是这些运行时值之一,因为它决定SQL语句本身的有效性(即,哪些列名有效),在执行时更改表名可能会改变SQL语句是否有效

在稍高一点的级别上,即使在模拟预处理语句参数替换而不是实际将预处理语句发送到数据库的数据库接口中,例如PDO,它可以让您在任何地方使用占位符(因为在这些系统中,占位符在发送到数据库之前会被替换),表占位符的值将是一个字符串,并作为字符串包含在发送到数据库的SQL中,因此
SELECT*FROM?
mytable
一起使用,因为参数实际上会将
SELECT*FROM'mytable'
发送到数据库,这是无效的SQL

你最好的选择就是继续

SELECT * FROM {$mytable}
但是如果
$mytable
来自用户输入,那么您绝对应该有一个白色的表列表,您可以首先检查它。

(稍后回答,请参阅我的旁注)

在尝试创建“数据库”时,同样的规则也适用

不能使用预处理语句绑定数据库

即:

这是行不通的。使用安全列表代替


旁注:我添加了这个答案(作为一个社区wiki),因为它通常用于关闭问题,有些人在试图绑定数据库时发布了类似的问题,而不是一个表和/或列。

不,参数化查询不只是将参数值放入查询字符串中,它分别为RDBMS提供参数化查询和参数。但是这样的查询不能将表名或字段名作为参数。唯一的方法是将表名动态编码到查询字符串中,就像您已经做的那样。如果此字符串可能受到攻击,则应首先验证它;例如针对一个白名单的允许表。使用mysqli扩展是安全的,请继续!但别忘了清理和验证所有字符串。。如果表或字段名或任何与数据库相对立的名称!您想用什么特殊的函数来清理?@user1475765在您的表名上使用转义函数并不能保护您免受任何伤害,请使用白名单。Great advise可能是重复的,但根据我的经验,这不适用于更大的动态网站。如果您的站点具有多用户设置、大量且不断更新的库存等,则此解决方案将极难应用。网站的大小与表的数量以及最终用户可以通过参数直接查询的表的数量关系不大。最终,这是一个奇怪的网站,让最终用户在第一时间做到这一点。
CREATE DATABASE IF NOT EXISTS ?