2

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

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

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

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

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

任何想法你们如何准备查询中的字段值以在 sql 中使用?可能这是一件基本的事情,但我在 C/C++ 方面不太聪明。

你的帮助会很有帮助

4

2 回答 2

4

使用带参数的查询而不是替换东西,这可能会导致几个问题(如 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 准备语句的更多信息。

于 2013-01-23T15:38:13.913 回答
1

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

于 2013-01-23T15:35:54.287 回答