我正在通过Flex在AIR中开发一个应用程序,但我没有看到我在哪里遇到SQLite(我已经习惯了MySQL)。参数有效,但仅限于某些情况。这部分是针对sql注入的内置卫生系统吗?谢谢你的帮助!
使用:
源码
“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;
不起作用(“:”表格中的SQL语法错误):
源码
“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;
答案 0 :(得分:32)
通常,不能对数据库标识符(表,列,视图,模式等)或数据库函数(例如CURRENT_DATE
)使用SQL参数/占位符,而是仅用于绑定文字值。
通过服务器端支持参数化(又称准备)语句,数据库引擎会解析您的查询一次,记住您将绑定的任何参数的特征 - 它们的类型,最大长度,精度等等。后续执行已解析的查询。但是,如果关键位(如数据库对象)未知,则无法将查询正确地解析为其语法元素。
因此,通常必须在存储过程或客户端代码中自己替换表名,动态地连接/插入/淡化要正确执行的SQL语句。在任何情况下,请记住使用SQL API的函数来引用数据库标识符,因为API不会为您执行此操作。
答案 1 :(得分:-1)
不确定这是否相同但我在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 ... “