[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.이것은 나쁜 DB 설계를 나타냅니다. 사용자는 열 이름에 대해 알 필요가 없습니다. 그 "열 이름"을 보유하고 실제 DB 컬럼을 작성하고 대신에 따라 데이터를 저장합니다.
이것은 나쁜 DB 설계를 나타냅니다. 사용자는 열 이름에 대해 알 필요가 없습니다. 그 "열 이름"을 보유하고 실제 DB 컬럼을 작성하고 대신에 따라 데이터를 저장합니다.
어떤 식 으로든에서, 아니, 당신은 PreparedStatement의 값으로 열 이름을 설정할 수 없습니다. 당신은 PreparedStatement의 값으로 열 값을 설정할 수 있습니다
이 방향으로 계속하려는 경우, 당신은 / 및 CONCATENATE (회피 SQL 인젝션에) 열 이름을 살균 SQL 문자열 자신을 구축 할 필요가있다. 별도의 열 이름을 견적 및 (가) 열 이름 내부의 동일한 견적을 탈출 대체 문자열 #을 사용합니다.
-
==============================
2.허용 열 이름의 화이트리스트를 준비합니다. 열 이름이 있는지 확인하기 위해 화이트리스트에서 조회 할 '쿼리'를 사용합니다. 그렇지 않을 경우, 쿼리를 거부합니다.
허용 열 이름의 화이트리스트를 준비합니다. 열 이름이 있는지 확인하기 위해 화이트리스트에서 조회 할 '쿼리'를 사용합니다. 그렇지 않을 경우, 쿼리를 거부합니다.
-
==============================
3.내 생각이 경우 수있는 준비된 문장의 요점은 이스케이프 쿼리 비트에서 퍼팅에서 사용자를 방지 할 수 있기 때문에하지 작업 - 당신은 항상 인용 또는 탈출 텍스트를 할거야 그래서.
내 생각이 경우 수있는 준비된 문장의 요점은 이스케이프 쿼리 비트에서 퍼팅에서 사용자를 방지 할 수 있기 때문에하지 작업 - 당신은 항상 인용 또는 탈출 텍스트를 할거야 그래서.
안전하게 쿼리 구조에 영향을하려는 경우 자바에서이 입력을 소독해야합니다.
-
==============================
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.장점으로 문 인터페이스의 SQL 주입 단점을 사용합니다. 전의:
장점으로 문 인터페이스의 SQL 주입 단점을 사용합니다. 전의:
st=conn.createStatement(); String columnName="name"; rs=st.executeQuery("select "+ columnName+" from ad_org ");
-
==============================
6.허용 대답은 실제로 올바르지 않습니다. 영업 방식이 나쁜 DB 설계를 표시하지만,이 비즈니스 로직에 의해 요구 될 수있다 (예를 들어 MySQL의 IDE)
허용 대답은 실제로 올바르지 않습니다. 영업 방식이 나쁜 DB 설계를 표시하지만,이 비즈니스 로직에 의해 요구 될 수있다 (예를 들어 MySQL의 IDE)
MySQL은 제표를 작성하기위한 어쨌든, 그건 당신이 알 필요가 무엇입니까? 값이지만 열 이름, 테이블 이름 등을 탈출해야하는 경우, 사용 ?? 대신.
이런 식으로 뭔가 작동합니다 :
SELECT ??, ??, ?? FROM ?? WHERE ?? < ?
[ 'ID', '이름', '어드레스', '사용자'ID ', 100]으로 설정 값
-
==============================
7.다음은 자바의 솔루션입니다.
다음은 자바의 솔루션입니다.
String strSelectString = String.format("select %s, %s from %s", strFieldName, strFieldName2, strTableName);
from https://stackoverflow.com/questions/3135973/variable-column-names-using-prepared-statements by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 테스트에 가장 좋은 방법은 행은 MySQL의 테이블에 존재하는 경우 (0) | 2020.03.12 |
---|---|
[SQL] 차이 사이의 가입 및 INNER는 가입 (0) | 2020.03.12 |
[SQL] SELECT 또는 INSERT는 경쟁 조건에 발생하기 쉬운 함수에서인가? (0) | 2020.03.12 |
[SQL] ERROR 1452 : 추가 또는 자식 행을 업데이트 할 수 없습니다 : 외래 키 제약 조건이 실패 (0) | 2020.03.12 |
[SQL] 내부는 어디 대 가입 (0) | 2020.03.12 |