기존 코드는 SQL 인젝션에 취약했다. 따라서 PreparedStatement를 적용해 SQL 인젝션을 방어한다. CRUD를 하는 모든 코드에 적용하려 했으나 공부 목적이므로 로그인 부분에만 PreparedStatement를 적용한다.
DB에서 해석이 가능한 상태로 미리 컴파일한 다음에 입력한 값을 대입하는 방식으로 쿼리 구문 조작이 성립되지 않는 가장 안전한 방식이다.
public int UserInsert(UserDTO dto) {
String query = "INSERT INTO users(user_id, name, password, address) VALUES(?, ?, ?, ?)";
int cnt = -1;
conn = driver.getConnect();
try {
psmt = conn.prepareStatement(query);
psmt.setString(1, dto.getUser_id());
psmt.setString(2, dto.getName());
psmt.setString(3, dto.getPassword());
psmt.setString(4, dto.getAddress());
cnt = psmt.executeUpdate();
}
public UserDTO UserSelect(UserDTO dto) {
UserDTO result = new UserDTO();
String query = "SELECT * FROM users WHERE user_id=? AND password=?";
conn = driver.getConnect();
try {
psmt = conn.prepareStatement(query);
psmt.setString(1, dto.getUser_id());
psmt.setString(2, dto.getPassword());
rs = psmt.executeQuery();
if (rs.next()) {
result.setUser_id(rs.getString("user_id"));
result.setName(rs.getString("name"));
}
}
코드는 수정해놓고 바쁘단 핑계로 깃허브에도 안 올려놓고 블로그 정리도 안해놨다.. 정리 좀 해놓자,,ㅎㅎ
개발자로서 배울 점이 많은 글이었습니다. 감사합니다.