SQLite 参数 - 不允许表名作为参数

Posted

技术标签:

【中文标题】SQLite 参数 - 不允许表名作为参数【英文标题】:SQLite Parameters - Not allowing tablename as parameter 【发布时间】:2010-11-19 10:53:31 【问题描述】:

我正在通过 Flex 在 AIR 中开发一个应用程序,但我没有看到 SQLite 哪里出了问题(我已经习惯了 mysql)。参数有效,但仅在某些情况下有效。这部分内置环卫系统是不是针对sql注入?感谢您的帮助!

作品:

sqlite

"INSERT :Fields FROM Category",其中参数为:Fields = "*"

as3

var statement:SQLStatement = new SQLStatement();
statement.connection = connection;
statement.text = "INSERT :Fields FROM Category";
statement.parameters[":Fields"] = "*";
statement.execute;

不起作用(“:Table”处的 SQL 语法错误):

sqlite

"INSERT :Fields FROM :Table",其中参数为:Fields = "*" and :Table = "Category"

as3

var statement:SQLStatement = new SQLStatement();
statement.connection = connection;
statement.text = "INSERT :Fields FROM :Table";
statement.parameters[":Fields"] = "*";
statement.parameters[":Table"] = "Category";
statement.execute;

【问题讨论】:

【参考方案1】:

通常不能将 SQL 参数/占位符用于数据库标识符(表、列、视图、模式等)或数据库函数(例如,CURRENT_DATE),而只能用于绑定文字价值观

通过服务器端对参数化(也称为准备好的)语句的支持,数据库引擎会解析您的查询一次,记住您将绑定的任何参数的特性——它们的类型、最大长度、精度等已解析查询的后续执行。但如果关键位(如数据库对象)未知,则查询无法正确解析为其句法元素。

因此,通常必须自己替换表名,在存储过程或客户端代码中动态连接/插值/任何要正确执行的 SQL 语句。在任何情况下,请记住使用您的 SQL API 的函数来引用数据库标识符,因为 API 不会为您这样做。

【讨论】:

你的第一段说明了一切。【参考方案2】:

不确定这是否相同,但我在 Java 中遇到了类似的东西。基本上你不能添加一个表作为参数,所以你必须像这样生成语句:

var statement:SQLStatement = new SQLStatement();
statement.connection = connection;
statement.text = stringUtil.substitute("INSERT :Fields FROM 0", "Category");
statement.parameters[":Fields"] = "*";
statement.execute;

这很可能不是最安全的解决方案,因此您可能希望在添加表名之前对数据进行一些自定义验证.. 所以有人不会尝试将表名发送给它 ";drop tableName... "

【讨论】:

以上是关于SQLite 参数 - 不允许表名作为参数的主要内容,如果未能解决你的问题,请参考以下文章

将表名作为参数传递时 PL/SQL 函数不起作用

表名作为 PostgreSQL 函数参数

存储过程,将表名作为参数传递

将表名作为参数传递给存储过程

在 UDF 中声明表变量以输入表名作为参数

将表名作为输入参数动态传递并使用它[重复]