是否可以对任何语句字符串使用预准备语句?

Is it possible to use prepared statements for any statementstring?

本文关键字:语句 字符串 任何 是否      更新时间:2023-10-16

目前我使用预准备语句来做这样的事情:

driver = get_driver_instance();
con = driver->connect("tcp://127.0.0.1:3306", "root", "root/");
con->setSchema("unknown_project");
query = "SELECT username FROM `unknown_project`.`users` WHERE accesslevel = ?;";
pstmt = con->prepareStatement(query);
pstmt->setInt(1, 5);
std::string tmp;
res = pstmt->executeQuery();
while (res->next()) {
tmp = res->getString(1);
results.push_back(tmp);
}
for (auto dummy : results) {
std::cout << dummy << std::endl;
}

我现在的问题是,是否可以将预准备语句用于以下(非工作,我没有得到回报(示例?

driver = get_driver_instance();
con = driver->connect("tcp://127.0.0.1:3306", "root", "root");
con->setSchema("unknown_project");
query = "SELECT username FROM `unknown_project`.`users` WHERE ? = ?;";
pstmt = con->prepareStatement(query);
pstmt->setString(1, "accesslevel"); // use accesslevel
pstmt->setInt(2, 5);
std::string tmp;
res = pstmt->executeQuery();
while (res->next()) {
tmp = res->getString(1);
results.push_back(tmp);
}
for (auto dummy : results) {
std::cout << dummy << std::endl;
}

预准备语句用于值,它是防止SQL注入的安全方法。

任何有界参数都作为单个值受到威胁,并且不能是其他东西。 其他SQL注入仍然是可能的。

例如: 在没有参数绑定的情况下,使用 concat 字符串,您可以执行以下操作:

Query = "Select * from A where key=" + "1 union all select * from passwords"

但是使用参数绑定,整个添加将作为单个值受到威胁:

Query = "Select * from A where key=?"

因此,具有相同字符串值的绑定字符串将给出:

Query = "Select * from A where key='1 union all select * from password'"

将自动添加周围的单引号,并转义任何特殊字符。例如:单个 qoute ('( 转到 (''( 所以 整个添加作为单个值受到威胁,除了一个值之外,您不能添加任何内容。