我正在通过Flex在AIR中开发应用程序,但没有看到SQLite哪里出了问题(我已经习惯了MySQL)。参数有效,但仅在某些情况下有效。内置卫生系统中是否包含此部分以防止sql注入(inject)?谢谢你的帮助!

作品:

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 =“*”和: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;

最佳答案

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

借助服务器端对参数化(即已准备好的)语句的支持,DB引擎将对查询进行一次解析,记住特殊的参数-它们的类型,最大长度,精度等-您将在后续执行中绑定(bind)已经解析的查询。但是,如果关键位(例如数据库对象)是未知的,则无法将查询正确解析为其语法元素。

因此,通常必须在存储过程或客户端代码中自行替换表名,而这些代码会动态合并/内插/无论要正确执行的SQL语句如何。无论如何,请记住使用SQL API的功能来引用数据库标识符,因为API不会帮您这样做。

关于apache-flex - SQLite参数-不允许表名作为参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1274432/

10-11 14:36
查看更多