是否有任何C SQLite API用于引用/转义表的名称?

时间:2010-02-08 13:56:28

标签: c sqlite escaping quotes

sqlite3_bind_text表名不可能,因为sqlite3_prepare_v2未能准备如下语句:

SELECT * FROM ? ;

我假设需要表名来解析语句,因此引用需要在sqlite3_prepare_v2之前发生。

sqlite3_quote_tablename之类的东西吗?也许它已经存在于我无法识别的名称下,但我在函数列表中找不到任何内容。

6 个答案:

答案 0 :(得分:2)

如果表名中包含无效字符,您可以将表名用双引号括起来,如下所示。

sqlite> create table "test table" (id);
sqlite> insert into "test table" values (1);
sqlite> select * from "test table";
id
----------
1

当然,您应该尽可能避免使用无效字符。它使开发变得复杂并且几乎总是不必要的(IMO只有在你继承一个已经以这种方式完成并且它太大而无法改变的项目时才有必要。)

答案 1 :(得分:1)

当使用带有参数的SQLite预处理语句时,参数:“在表达式中指定一个占位符,用于填充运行时

在执行任何SQL语句之前,SQLite会将SQL字符串“编译”为由内部虚拟机执行的一系列opcodes。 SQL语句运行的表名和列名是编译过程的必需部分。

可以使用参数将“值”绑定到这样的预处理语句:

SELECT * FROM FOO WHERE name=?;

然后调用sqlite3_bind_text()将字符串gavinbeatty绑定到已编译的语句。但是,这种架构意味着不能使用如下参数:

SELECT * FROM ? WHERE name=?;    // Can't bind table name as a parameter
SELECT * FROM FOO WHERE ?=10;    // Can't bind column name as a parameter

答案 2 :(得分:1)

您建议的sqlite3_quote_tablename函数可以清理输入以防止sql注入攻击。为此,它可以解析输入以确保它是字符串文字。 http://sqlite.org/lang_expr.html#litvalue

答案 3 :(得分:0)

如果SQLite不接受表名作为参数,我认为没有针对您的问题的解决方案......

考虑到:

  

使用sqlite3_bind()未赋值的参数被视为NULL。

因此,对于您的查询,表名将为NULL,这当然是无效的。

答案 4 :(得分:0)

我也在寻找这样的东西,也找不到它。在我的例子中,预期的表名总是在一组固定的表中(因此很容易验证)。另一方面,字段名称并非如此,我最终过滤了字符串,几乎删除了所有不是字母,数字或下划线的内容(我知道我的字段符合这些参数)。这就行了。

答案 5 :(得分:0)

SQLite将为https://www.sqlite.org/printf.html函数族中的%w格式为您转义标识符。