【问题标题】:Create a dynamic name table with Prepared Statement in java在java中使用Prepared Statement创建一个动态名称表
【发布时间】:2017-05-24 11:47:29
【问题描述】:

我想在java for oracle 中创建一个表,同时从用户那里获取表的名称,或者像一个程序变量一样:

String query= CREATE TABLE ? (ID NUMBER , NAME VARCHAR2(20));
PreparedStatement preStatement = connection.prepareStatement(query );
preStatement.setString(1,tableNAME);

但是我有 INVALID TABLE NAME 错误;

我怎样才能达到这个目的(通过动态名称创建表)?

非常感谢!

【问题讨论】:

  • 不能将标识符(表名、列名)作为参数传递给PreparedStatement

标签: java sql oracle jdbc


【解决方案1】:

您总是可以将表名连接到字符串中(在检查 SQL 注入的可能性之后)

String query= "CREATE TABLE " + tablename + " (ID NUMBER , NAME VARCHAR2(20))";

【讨论】:

    【解决方案2】:

    在准备好的语句中,它首先编译查询,然后绑定值。因此,您不能将表名设置为通过准备好的语句进行查询。
    正常追加表名查询会导致Sql注入。
    最好的方法是将表名列入白名单并检查其中的表名。并使用它。

    别的 试试下面的方法,它会避免sql注入。

    String tableName = urtablename;
    String query= String.format("CREATE TABLE  \"%s\" (ID NUMBER , NAME VARCHAR2(20))", tableName.replace("\"", "\"\""));
    

    【讨论】:

    • “这里的动态值包含在双引号内,因此无法注入”我对此不确定,我绝对不会依赖于此。如果没有其他办法,至少对tableName(例如正则表达式^[a-zA-Z_\-]+$)进行非常严格检查,这样就不允许出现有趣的Unicode字符
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多