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 参数 - 不允许表名作为参数的主要内容,如果未能解决你的问题,请参考以下文章