2014-04-15 2 views
0

수중 음파 탐지기는 방법에 대해 불평 :소나의 PreparedStatement는 SQL 주입

이해

"준비된 문이 상수가 문자열에서 생성됩니다", 문자열로 쿼리를 매개 변수화 안전하지 않다 연결,하지만 여기에 나는 테이블의 이름을 정의하고있다. 음향 기기 경고를 없애려면 어떻게해야합니까? 그리고 더 중요한 것은이 문제를 해결하는 방법, SQL 주입을 피하는 방법입니까? db 및 노드 변수에서 유효하지 않은 값을 검색해야합니까? 예 : 공백을 포함해서는 안됩니다. (보통 체크 된 입력 사항), 아니면 우아한 방법이 있습니까?

Btw,이 메서드는 매우 깊은 애플 리케이션, 나는 거기에 이러한 매개 변수에 어떤 값을 강제로 기회가 의심.

방법의 단순화 된 버전 : 어떤 도움

private PreparedStatement getPs(Connection conn, String db, String node, String ext) { 
    StringBuilder sql = new StringBuilder("select name, sum(counter) cnt"); 
    sql.append(" from ").append(db).append(".").append(node).append("_stuff"); 
    sql.append(" where something = ?"); 
    sql.append(" group by name"); 

    PreparedStatement ps; 
    try { 
     ps = conn.prepareStatement(sql.toString()); 
     ps.setString(1, ext); 
    } catch (SQLException sqle) { 
     throw new MyRuntimeException(sqle); 
    } 
    return ps; 
} 

감사합니다.

답변

2

는 수중 음파 탐지기 경고는 경고 무엇인지 정확하게 알 약 :

는 코드가 SQL 인젝션에 취약 것을 의미하지 않는다

"준비된 문은 상수가 문자열에서 생성됩니다" 공격. 즉, 이 될 수 있습니다. 사용자가 데이터베이스 스키마 또는 테이블 이름을 삽입 할 수있는 방법이 없다고 확신하는 경우 경고를 무시하십시오.