【发布时间】:2020-10-03 07:35:26
【问题描述】:
我遇到了一个奇怪的问题,即创建表会将反引号添加到数据库中的表名。
public function create_table($name)
{
$sql = "
CREATE TABLE IF NOT EXISTS `?` (
id int(11) NOT NULL AUTO_INCREMENT,
url varchar(255) NOT NULL,
resolved tinyint(1) NOT NULL,
PRIMARY KEY (id)
)";
$query = $this->_pdo->prepare($sql);
$query->bindValue(1, $name);
if($query->execute())
{
print("Created");
}
else
{
var_dump($query->errorInfo());
}
}
我这样做并绑定$name 的原因是它将由我正在制作的网络爬虫动态完成以查找常见的文件和目录名称,并且由于大量路径可收集为每个站点确定一个表,并根据其主机名生成其名称。 (可能的狡猾主机名示例:https://whe.re/)
但这导致了这个。
所以我尝试不使用它们,但它会引发错误
“您的 SQL 语法有错误;请查看与您的 MariaDB 服务器版本相对应的手册,了解在 ''random_site' 附近使用的正确语法
我没有看到或想到什么,自从我使用 PHP 已经有一段时间了,我很茫然,因为我的所有搜索都让我明白为什么在进行查询时表名应该用反引号括起来不是我的问题。
谢谢
信息:MariaDB
PHP:7.4.6
【问题讨论】:
-
这些是引号,而不是反引号。您不能绑定表名。它被引用是因为你绑定了它,然后它在反引号中执行,所以你说的实际名称是
'+ NAME +'。您应该创建一个包含所有可能名称的数组并与之进行比较。看whitelist检查。 -
@user3783243 谢谢,这就是我的想法,只是不确定所以在这里问。
-
我实际上认为您当前的实现可以被注入。我认为准备好的语句不会触及反引号或
),因此恶意用户可以关闭create命令并执行其他操作。 (假设仿真开启) -
$name的确切值是多少? -
@Martin
$name本来是动态的,但在阅读了@GMB 的回答后,我想我会改变我要做的方式
标签: php mysql database-design mariadb create-table