복붙노트

[SQL] 준비된 문을 사용하여 변수 열 이름

SQL

준비된 문을 사용하여 변수 열 이름

준비된 문을 사용하여 반환 된 열 이름을 지정 어쨌든이 있다면 궁금 해서요.

나는 MySQL과 자바를 사용하고 있습니다.

언제 그것을 시도 :

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'

나는 논의 된 바와 같이 나는 테이블 이름에 대해이 작업을 수행 할 수 있다는 것을 알고 열 이름을 위해 그것을 할 수있는 방법이 있다면 여기지만, 궁금 해서요.

이없는 경우에, 난 그냥 시도하고 있는지가 SQL 주입 취약점으로 이어질하지 않도록 내가 입력을 살균 있는지 확인해야합니다.

해결법

  1. ==============================

    1.이것은 나쁜 DB 설계를 나타냅니다. 사용자는 열 이름에 대해 알 필요가 없습니다. 그 "열 이름"을 보유하고 실제 DB 컬럼을 작성하고 대신에 따라 데이터를 저장합니다.

    이것은 나쁜 DB 설계를 나타냅니다. 사용자는 열 이름에 대해 알 필요가 없습니다. 그 "열 이름"을 보유하고 실제 DB 컬럼을 작성하고 대신에 따라 데이터를 저장합니다.

    어떤 식 으로든에서, 아니, 당신은 PreparedStatement의 값으로 열 이름을 설정할 수 없습니다. 당신은 PreparedStatement의 값으로 열 값을 설정할 수 있습니다

    이 방향으로 계속하려는 경우, 당신은 / 및 CONCATENATE (회피 SQL 인젝션에) 열 이름을 살균 SQL 문자열 자신을 구축 할 필요가있다. 별도의 열 이름을 견적 및 (가) 열 이름 내부의 동일한 견적을 탈출 대체 문자열 #을 사용합니다.

  2. ==============================

    2.허용 열 이름의 화이트리스트를 준비합니다. 열 이름이 있는지 확인하기 위해 화이트리스트에서 조회 할 '쿼리'를 사용합니다. 그렇지 않을 경우, 쿼리를 거부합니다.

    허용 열 이름의 화이트리스트를 준비합니다. 열 이름이 있는지 확인하기 위해 화이트리스트에서 조회 할 '쿼리'를 사용합니다. 그렇지 않을 경우, 쿼리를 거부합니다.

  3. ==============================

    3.내 생각이 경우 수있는 준비된 문장의 요점은 이스케이프 쿼리 비트에서 퍼팅에서 사용자를 방지 할 수 있기 때문에하지 작업 - 당신은 항상 인용 또는 탈출 텍스트를 할거야 그래서.

    내 생각이 경우 수있는 준비된 문장의 요점은 이스케이프 쿼리 비트에서 퍼팅에서 사용자를 방지 할 수 있기 때문에하지 작업 - 당신은 항상 인용 또는 탈출 텍스트를 할거야 그래서.

    안전하게 쿼리 구조에 영향을하려는 경우 자바에서이 입력을 소독해야합니다.

  4. ==============================

    4.

    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. ==============================

    5.장점으로 문 인터페이스의 SQL 주입 단점을 사용합니다. 전의:

    장점으로 문 인터페이스의 SQL 주입 단점을 사용합니다. 전의:

    st=conn.createStatement();
    String columnName="name";
    rs=st.executeQuery("select "+ columnName+" from ad_org ");
    
  6. ==============================

    6.허용 대답은 실제로 올바르지 않습니다. 영업 방식이 나쁜 DB 설계를 표시하지만,이 비즈니스 로직에 의해 요구 될 수있다 (예를 들어 MySQL의 IDE)

    허용 대답은 실제로 올바르지 않습니다. 영업 방식이 나쁜 DB 설계를 표시하지만,이 비즈니스 로직에 의해 요구 될 수있다 (예를 들어 MySQL의 IDE)

    MySQL은 제표를 작성하기위한 어쨌든, 그건 당신이 알 필요가 무엇입니까? 값이지만 열 이름, 테이블 이름 등을 탈출해야하는 경우, 사용 ?? 대신.

    이런 식으로 뭔가 작동합니다 :

    SELECT ??, ??, ?? FROM ?? WHERE ?? < ? 
    

    [ 'ID', '이름', '어드레스', '사용자'ID ', 100]으로 설정 값

  7. ==============================

    7.다음은 자바의 솔루션입니다.

    다음은 자바의 솔루션입니다.

    String strSelectString = String.format("select %s, %s from %s", strFieldName, strFieldName2, strTableName);
    
  8. from https://stackoverflow.com/questions/3135973/variable-column-names-using-prepared-statements by cc-by-sa and MIT license