SQL 쿼리에 사용자 입력을 직접 삽입할 경우, 악의적인 SQL 명령어가 실행될 수 있는 보안 취약점
SQL 인젝션을 방어하기 위해서 사용자 입력값 검증, SpringSercurity를 사용하여 입력값 필터링,
최소 권한 원칙(Least Privilege)을 적용하여 DB 계정 권한을 축소
SQL 인젝션의 예를 들어보자
공격자가
"admin' --" 같은 입력한다면?
-- (주석)으로 인해 AND password = '...' 등의 나머지 조건이 무시되므로,
비밀번호 검증 없이 admin 계정으로 로그인 가능해진다
SELECT * FROM users WHERE username = 'admin' --'
@Repository
public class UserRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
public User findUserByUsername(String username) {
String query = "SELECT * FROM users WHERE username = '" + username + "'";
return jdbcTemplate.queryForObject(query, new UserRowMapper()); //문제발생
}
}
요즘은 JPA를 많이 사용하기 때문에 안전하지만
SPA를 사용하지 않는다면?
반드시 SQL 바인딩을 사용하여 안전하게 처리해야 한다
바인딩 변수(? 부분)를 사용하여 SQL과 사용자 입력 분리함으로 입력값이 문자열 그대로 처리되기 때문에 SQL 문법에 영향을 줄 수 없다
(JPA도 동일하게 PreparedStatement를 내부적으로 사용하기 때문에 동일함)
public User findUserByUsername(String username) {
String query = "SELECT * FROM users WHERE username = ?";
return jdbcTemplate.queryForObject(query, new Object[]{username}, new UserRowMapper());
}
//JPA인 경우는 안전
@Query("SELECT u FROM User u WHERE u.username = :username")
User findByUsername(@Param("username") String username);
'Etc' 카테고리의 다른 글
BE개발자가 모르면 안되는 것 - 기능 이상 (Malfunction) (0) | 2025.03.30 |
---|---|
인터페이스가 필요한가? (0) | 2025.03.30 |
[DB]파티션테이블 DELETE (0) | 2025.03.23 |
[DB]파티션테이블 분할기준 (0) | 2025.03.16 |
[DB]파티션 테이블이란? (0) | 2025.03.09 |