代码之家  ›  专栏  ›  技术社区  ›  KLee1

使用准备好的语句的变量列名

  •  32
  • KLee1  · 技术社区  · 14 年前

    我想知道是否有任何方法可以使用准备好的语句指定返回的列名。

    我使用的是MySQL和Java。

    当我尝试它:

    String columnNames="d,e,f"; //Actually from the user...
    String name = "some_table"; //From user...
    String query = "SELECT a,b,c,? FROM " + name + " WHERE d=?";//...
    stmt = conn.prepareStatement(query);
    stmt.setString(1, columnNames);
    stmt.setString(2, "x");
    

    我得到这种类型的语句(在执行前打印)。

    SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'
    

    不过,我想看看:

    SELECT a,b,c,d,e,f FROM some_table WHERE d='x'
    

    我知道我不能为表名这样做,正如前面讨论的那样 here ,但不知道是否有方法可以对列名执行此操作。

    如果没有,那么我只需要尝试确保我清理了输入,这样就不会导致SQL注入漏洞。

    6 回复  |  直到 7 年前
        1
  •  32
  •   BalusC    9 年前

    这表示数据库设计不好。用户不需要知道列名。创建一个包含这些“列名”的真实数据库列,并将数据存储在该列中。

    无论如何,不能将列名设置为 PreparedStatement 价值观。只能设置列 价值观 作为 准备声明 价值观

    如果您想继续这个方向,您需要清理列名并自己连接/构建SQL字符串。引用单独的列名并使用 String#replace() 在列名中转义相同的引号。

        2
  •  15
  •   wgl    12 年前

    准备允许列名的白名单。使用“查询”在白名单中查找列名称是否存在。如果没有,则拒绝查询。

        3
  •  2
  •   G__    14 年前

    I think this case can't work because the whole point of the prepared statement is to prevent the user from putting in unescaped query bits - so you're always going to have the text quoted or escaped.

    如果要安全地影响查询结构,则需要在Java中对该输入进行消毒。

        4
  •  1
  •   Grbh Niti    7 年前
    public void MethodName(String strFieldName1, String strFieldName2, String strTableName)
    {
    //Code to connect with database
    String strSQLQuery=String.format("select %s, %s from %s", strFieldName, strFieldName2, strTableName);
    st=conn.createStatement();
    rs=st.executeQuery(strSQLQuery);
    //rest code
    }
    
        5
  •  0
  •   Nissa TheRealPir    8 年前

    Use sql injection disadvantage of Statement Interface as advantage. 前任:

    st=conn.createStatement();
    String columnName="name";
    rs=st.executeQuery("select "+ columnName+" from ad_org ");
    
        6
  •  -2
  •   Rob    7 年前

    下面是Java中的解决方案。

    String strSelectString = String.format("select %s, %s from %s", strFieldName, strFieldName2, strTableName);