SQLite的参数 - 不使表名作为参数(SQLite Parameters - Not allow

2019-06-18 10:36发布

我正在开发通过Flex的AIR中的应用程序,但我没有看到在那里我使用SQLite去错(我已经习惯到MySQL)。 参数工作,但只在某些情况下。 反对sql注入的内置卫生系统的一部分? 谢谢你的帮助!

作品:

源码

“INSERT:域FROM类别”,其中所述参数是:字段=“*”

AS3

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

不工作(在SQL语法错误“:表”):

源码

“INSERT:域FROM:表”,其中的参数是:字段=“*”和:表=“类别”

AS3

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

Answer 1:

通常一个不能使用SQL参数/占位符数据库标识符 (表,列,视图,模式等)或数据库功能(例如, CURRENT_DATE ),而是仅用于结合文字

随着参数(又名准备)语句的服务器端支持,数据库引擎解析查询一次,记住任何参数的peculiars - 它们的类型,长度最大,精度等 - 你会在后续执行绑定已解析的查询。 但查询不能被正确解析成其语法元素如果关键位,如数据库对象,是未知的。

所以,一个通常具有替换表名自己,在存储过程中或在动态concats /内插/凡是SQL语句被正确执行客户端代码。 在任何情况下,请一定要使用SQL API的功能引用数据库标识符 ,因为API不会为你做。



Answer 2:

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

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

这是最有可能不是最安全的解决方案,所以你可能要到一些数据的自定义验证您添加的表名前..所以有人不尝试发送它的表名“落表名......”



文章来源: SQLite Parameters - Not allowing tablename as parameter
标签: flex sqlite air