【问题标题】:How to prepare a C++ string for sql query如何为 sql 查询准备 C++ 字符串
【发布时间】:2013-01-23 15:24:11
【问题描述】:

我必须准备适合查询的字符串,因为这些字符串将在查询中用作字段值。如果它们包含 ' 等,则 sql 查询将无法执行。

因此,我想用 '' 替换 ' 我已经看到了用子字符串查找和替换子字符串的代码。但我想这个问题有点棘手,因为替换字符串还包含两个单引号 '' 替换一个引号 ' 所以当我必须找到下一次出现时,它会遇到一个 ' 被故意替换。

我正在使用 Sql lite C api,示例查询可能如下所示

 select * from persons where name  = 'John' D'oe'

由于 John Doe 包含一个 ' 查询将失败,所以我希望名称中所有出现的 ' 都替换为 ''

你们知道如何准备查询中的字段值以在 sql 中使用吗?可能这是一个基本的东西,但我在 C/C++ 方面不太聪明。

你的帮助会很有帮助

【问题讨论】:

    标签: c++ c sqlite


    【解决方案1】:

    使用带参数的查询而不是替换内容,这可能会导致一些问题(例如 SQL 注入漏洞)。

    MySQL 示例:

    sql::Connection *con = ...;
    string query = "SELECT * FROM TABLE WHERE ID = ?";
    sql::PreparedStatement *prep_stmt = con->prepareStatement(query);
    prep_stmt->setInt(1, 1); // Replace first argument with 1
    prep_stmt->execute();
    

    这将执行SELECT * FROM TABLE WHERE ID = 1

    编辑:有关 SQLite 准备语句 herehere 的更多信息。

    【讨论】:

    • 感谢您的回答是 sqlite C api 的 sql::Connection 和 sql::PreparedStatement 部分?我找不到它
    • 它明确指出:MySQL 示例。您忘记了问题中的 SQLite 标签,并在我的回答后添加了它。我向您添加了有关如何使用 SQLite C API 的链接。
    • 谢谢,我发现你指出了正确的方向,我接受它作为这个问题的一部分,但不幸的是使用 C api'我遇到了问题,这就是为什么我对 C sqlite api 有一个特别的问题。
    • 再次,我已经在答案中为您链接了如何使用 SQLite C API 进行操作。请花点时间阅读整个答案和 cmets。
    【解决方案2】:

    这取决于您使用的 SQL 库。其中一些会有PreparedStatement的概念,你会用问号代替变量,然后当你在语句上设置这些变量时,它会在内部确保你不能注入sql命令。

    【讨论】:

    • 我明白了,我正在使用 sqlite C++ apis,它有我可以使用的东西吗?
    • 您应该可以调用 query.prepare(),这是您设置 SQL 查询并设置变量的地方。您不想滚动自己的代码进行反sql注入,只需使用api的prepared statement概念
    猜你喜欢
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 2012-11-05
    • 2013-03-27
    • 2023-02-08
    • 1970-01-01
    相关资源
    最近更新 更多