【问题标题】:SQLite Parameters - Not allowing tablename as parameterSQLite 参数 - 不允许表名作为参数
【发布时间】: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;

【问题讨论】:

    标签: apache-flex sqlite air


    【解决方案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... "

    【讨论】:

      猜你喜欢
      • 2014-06-10
      • 1970-01-01
      • 2023-03-27
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多