c++ - 是否可以对任何语句字符串使用准备好的语句?
问题描述
目前我使用准备好的语句来处理这样的事情:
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'"
自动添加周围的单引号,并转义任何特殊字符。例如:single qoute (') 变成 ('') 所以整个加法都被当作一个单一的值来威胁,除了一个值你不能添加任何东西。
推荐阅读
- flutter - Provider 使用 Flutter 在另一个页面中返回 NULL
- java - 如何在 Java 中不递归地读取目录
- html - 为什么 Bootstrap 不能正确呈现我的 html?
- r - tidymodels metric_set:错误:“metric_set()”的所有输入都必须是函数。这些输入不是: (2)
- scala - 如何在 main 方法的 scala 参数上使用 isLetter?
- javascript - 用于填充 HTML 下拉列表的 PHP 查询响应(循环通过 2D 数组)
- snowflake-cloud-data-platform - 雪花任务多个计划
- c++ - glVertexAttribPointer 步幅参数如何工作?
- html - 如何在忽略标题旁边的图标时居中?
- python-3.x - Python - Tkinter 同时运行两个线程