[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
반응형