[FINDBUGS] SQL 삽입 | SQL_INJECTION

2022. 11. 18. 11:05
728x90
반응형

SQL 삽입

- DB와 연동된 웹 애플리케이션에서 입력된 데이터에 대한 유효성 검증을 하지 않을 경우, 공격자가 입력 폼 및 URL입력란에 SQL문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있는 보안약점을 말한다.

 

예시 1)

// 안전하지 않은 코드 예시
try {
    String  tableName = props.getProperty("jdbc.tableName");
    String  name = props.getProperty("jdbc.name");
    String  query = "SELECT  *  FROM  "  + tableName  + "  WHERE  Name  ="  +  name;
    stmt  = con.prepareStatement(query);
    rs  = stmt.executeQuery();
} catch  (SQLException e) {	}
finally {	}
- tableName, name 값을 받아서 SQL 쿼리를 생성
- Name값으로 name OR ‘1’=‘1’를 입력 시 조작된 쿼리 생성하는 문자열 전달이 가능

 

// 안전한 코드예시
try {
    String  tableName  = props.getProperty("jdbc.tableName");
    String  name  = props.getProperty("jdbc.name");
    String  query = "SELECT	*  FROM    ?  WHERE  Name  =  ? ";
    stmt  = con.prepareStatement(query);
    stmt.setString(1,  tableName);
    stmt.setString(2,  name);
    rs  = stmt.executeQuery();
    ... ...
}
catch  (SQLException sqle) {	}
finally {	}
- 인자를 받는 preparedStatement객체를 상수 스트링으로 생성, 인자 부분을 set메소드로 설정
 

예시 2)

// 안전하지 않은 코드 예시(myBatis)
<select id=”TbSearch” parameterType=”map” resultType=”tbDto”> 
select * from table where title like ‘%${keyword}%’
</select>
- 외부 입력값을 MyBatis쿼리맵에 바인딩 할 경우 $를 사용하면  입력값을 문자열에 결합하는 형태로 쿼리에 반영
 
<select id=”TbSearch” parameterType=”map” resultType=”TbDto”> 
select * from table where title like ‘%’||#{keyword}||’%’
</select>
- 외부의 입력값을 MyBatis 쿼리맵에 바인딩 할 경우 $기호가 아닌 #기호를 사용해야 한다.
728x90
반응형

BELATED ARTICLES

more