Using a prepared statement and variable bind Order By in Java with JDBC driver

前端 未结 3 1775
情深已故
情深已故 2020-12-01 14:27

I\'m using

  1. jdbcTemplate to make JDBC connections to a mySQL DB
  2. prepared statements to protect myself as much as possible from SQL injection attacks
相关标签:
3条回答
  • 2020-12-01 14:55

    I would just concatenate the column name and the order to the SQL query, but only after

    1. verifying that the column name and order are valid in this context.
    2. sanitizing them to counter any attempt of SQL Injection attack.

    I feel this is efficient compared to fetching the results to the application layer and sorting them here.

    0 讨论(0)
  • 2020-12-01 14:58

    My suggestion is the mapping of keys and columns. It's a safe solution.

    At the beginning, we initiate our map in the simplest possible way. For convenience, I overloaded the get (Obiect key) method to return the default column ("fullName") in case of failure. This will protect against SqlExeption.

        static Map<String,String> sortCol;
    {
        sortCol = new HashMap<String, String>(){
            {//Enter all data for mapping
                put("name","fullName");
                put("rok","year");
                put("rate","likes");
                put("count-rate","countRate");
    
            }
            /**
             * 
             * @param key for column name
             * @return column name otherwise default "fullName"
             */
            @Override
            public String get(Object key) {
                String col =super.get(key);
                return null==col?"fullName":col;
            }
        };
    }
    

    Here is a simple example of use.

    String sqlQuery= "Select \"fullName\",year,likes,count-rate, country ..."+
     "from  blaBla..."+
     "where blaBla..."+
     "order by "+sortCol.get("keySort") "\n"; // keySort can have the value name, count-rate etc .. 
    

    By the way, you should never reveal the real names of columns in user interfaces, such as REST or SOAP etc ... For the attacker, this is a great help.

    0 讨论(0)
  • 2020-12-01 15:06

    Placeholders ? can only be used for parameter values but not with column and sort order directions. So the standard way to do this as is pointed e.g. here is to use String#format() or something similar to append your column name and order value to your query.

    Another option is to use Spring Data JPA where you can give to your method as an argument an instance of type Sort which can contain all needed info for database to sort.

    0 讨论(0)
提交回复
热议问题