首页 > 解决方案 > 是否可以对任何语句字符串使用准备好的语句?

问题描述

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

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

标签: c++prepared-statementmysql-connector

解决方案


准备好的语句用于值,它是防止 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 (') 变成 ('') 所以整个加法都被当作一个单一的值来威胁,除了一个值你不能添加任何东西。


推荐阅读