2017-12-13 12 views
0

나는 준비된 문장이 데이터베이스에 SQL 주입을 피하는 좋은 방법이라고 읽었습니다. 고객이 조용한 변수 UI 을 먼저 원하고 테이블을 선택한 다음 열과 텍스트로 구성된 몇 가지 조건을 지정해야합니다. 그래서 기본적으로 (순진)의 최종 생성물은 다음과 같이 표시됩니다prepared statement/sql-injection preventation from variable

이제 문제는이 보안 얻는 방법이다
Select * from %TABLENAME% where %ATTRIBUTENAME% = %VALUE% 

?

물론 모든 테이블에 대한 명령문을 미리 작성하는 prepare Statement 솔루션을 구축 할 수 있지만이를 유지하는 노력이 크게 줄어들 기 때문에 나에게는 어리석은 생각처럼 들립니다. 조용한 몇 테이블). 가능한 한 일반적인 제보를 안전하게 해결하는 방법에 대해 알고 싶습니다.

+0

그리고 네 나는 고객이 같음을 할 수있는 생각하지만 negativ 또는 같은 동작으로 올 수 있다는 것을 알고 있지만, 그건 내 문제 때문에 바랍니다없는 answes의 이상입니다 주로 여기에 설명의 약점에 초점을 맞 춥니 다. 이유는 약간 간소화 되었기 때문입니다. – Aeglasin

+0

** 문 **은 일반적으로 사용자의 입력이 없을 때만 사용됩니다. 그렇지 않으면 ** PreparedStatement **를 사용하십시오. 적절한 위생 설비가있는 경우에도 ** 정책 **은 안전하지 않을 것입니다. –

답변

1

당신은 SQL 주입에 사용할 수 없습니다 그래서

select * from %TABLENAME% where %ATTRIBUTENAME% = ? 

이 적어도 VALUE에 예를 변경해야합니다. 그런 다음 데이터베이스의 알려진 테이블 및 열에 대해 TABLENAMEATTRIBUTENAME의 유효성을 검사 할 수 있습니다.

런타임에 유효성 검사에 사용할 수있는 DatabaseMetaData.getColumns(...)을 참조하십시오. 또는 빌드 할 때 생성 된 정적 파일을 유효한 테이블/열로 유지할 수도 있습니다.

모든 테이블/열 조합에 대해 빌드시에 Enum을 생성 할 수 있습니까? 나는 jOOQ이 일종의 DB 스키마에서 시간을 자바 코드 생성을 할 알아요 ... 아마도 도움이 될 수 있을까요?

public enum TableColumn { 
    CUSTOMER_NAME("customer", "name"), CUSTOMER_ID("customer", "id"), 
    ORDER_ID("order", "id"), // etc etc 

    String table; 
    String column; 

    public TableColumn(String table, String column) { 
     // set values 
    } 
} 

public List<Row> doSelect(TableColumn tc, Object value) { 
    String sql = String.format("select * from %s where %s = ?", tc.table, tc.column); 
    Connection con = getConnection(); 
    try { 
     PreparedStatement ps = con.prepareStatement(sql); 
     ps.setObject(1, value); 
     ... 
+0

좋은데, 내부적으로 검토 할 필요가 있습니다. 동료를 설득 할 수 있다면 대답을 받아 들일 것입니다. – Aeglasin

+0

@Aeglasin 테이블 이름의 유효성을 검사 할 때 사용자를 시스템, 테이블이 아닌 _user_로 제한 할 수 있습니다. (사용자보기 또한 공정한 게임이 될 수 있습니다.) 유효한 테이블 이름이 있으면 테이블에 대해 열 이름의 유효성을 검사 할 수 있습니다. 여분의 계층을 추가하려면 ['sp_addextendedproperty'] (https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/)를 사용하여 적절한 표, 열 및보기에 태그를 지정할 수 있습니다. sp-addextendedproperty-transact-sql)을 사용하여 사용자가 더 제한된 데이터 하위 집합에 액세스 할 수있게합니다. – HABO