gpt4 book ai didi

c++ - 是否可以对任何语句字符串使用准备好的语句?

转载 作者:搜寻专家 更新时间:2023-10-31 02:05:31 24 4
gpt4 key购买 nike

目前我使用准备好的语句来处理这样的事情:

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

最佳答案

Prepared statement 用于值,它是一种防止 SQL 注入(inject)的安全方法。

任何有界参数威胁为单个值,不能是其他东西。否则 SQL 注入(inject)仍然是可能的。

例如:没有参数绑定(bind),你可以使用 concat 字符串:

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

但是对于参数绑定(bind),整个加法将作为单一值受到威胁:

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

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

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

自动添加周围的单引号,并转义任何特殊字符。例如:单引号 (') 转为 ('') 所以整个加法作为一个单一的值(value)受到威胁,除了一个值(value)你不能添加任何东西。

关于c++ - 是否可以对任何语句字符串使用准备好的语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51836444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com