본문 바로가기
네이버클라우드/JAVA 웹 프로그래밍

JAVA 44일차 (2023-07-24) 자바 프로그래밍_47. SQL 삽입 공격 차단하기_개인프로젝트 - 마트 관리 시스템

by prometedor 2023. 7. 24.
## 47. SQL 삽입 공격 차단하기

- SQL 삽입 공격의 원리 이해
- PreparedStatement 사용법
- 테이블에 암호를 저장하는 방법: SHA1() 함수 사용법

 

PreparedStatement 사용법

MySQLMemberDao.java

ㄴ PreparedStatement 이용하기

ㄴ SQL 문을 prepareStatement 에 넣어줌

 

MySQLMemberDao.java

ㄴ setXxx() 할 때 번호는 0부터가 아닌 1부터 시작임

=>

ㄴ executeUpdate() 안에는 이제 아무것도 안 넣어도 됨

 

MySQLMemberDao.java

ㄴ list 메서드도 insert 메서드와 동일하게 작업해주기

=> 입력은 받지 않으므로 in-parameter 인 ? 와 executeUpdate 메서드는 사용되지 않음

 

MySQLMemberDao.java

ㄴ in-parameter 인 ? 를 사용하고 setInt 에 no 를 넣어줌

 

** 궁금했던 점

1. try 문을 왜 2개로 쪼개는가?

ㄴ 한 번에 자원 해제를 자동으로 하도록 하고 싶은데 아래처럼 선언할 수 없기 때문

ㄴ 이렇게는 불가능하므로,,

 

2. 두 번째 try 블록은 왜 catch 블록이 없는가?

ㄴ 두 번째 try 블록은 ResultSet 객체 rs의 자원 해제를 담당함
ㄴ ResultSet의 close() 메서드가 호출되는 시점에서 발생할 수 있는 예외는 ResultSet 객체를 닫는 과정에서 발생하는 예외임
ㄴ 이 예외는 주로 자원이 이미 닫혀있는 상태에서 다시 닫으려 할 때 발생함
ㄴ 하지만 두 번째 try 블록에서는 단순히 ResultSet 객체를 닫기만 하고, 해당 부분에서 발생하는 예외에 대한 추가적인 예외 처리가 필요하지 않음!
ㄴ 이미 첫 번째 try 블록에서 PreparedStatement 객체 stmt를 사용하여 SQL 쿼리를 실행하고, 해당 블록에서 발생하는 예외를 catch하여 처리하고 있기 때문

 

MySQLMemberDao.java

ㄴ PreparedStatement 이용하기

ㄴ in-parameter 인 ? 이용하기

ㄴ executeUpdate 메서드 이용하기

 

MySQLMemberDao.java

ㄴ PreparedStatement 이용하기

ㄴ in-parameter 인 ? 이용하기

ㄴ executeUpdate 메서드 이용하기

 

=> clientApp.java 실행하여 테스트하면 모든 기능 제대로 작동됨을 확인할 수 있음

=> Board 도 동일하게 적용해주기

 

 

테이블에 암호를 저장하는 방법: SHA1() 함수 사용법

study 계정으로 MySQL 접속 후 studydb 를 기본으로 설정

 

sha1() 함수 사용

 

문자열 '0000'의 SHA-1 해시 값을 16진수 표현으로 나타내보기

 

'0000'의 SHA-1 해시 값을 계산하여 다시 한 번 SHA-1으로 해싱 가능

 

concat 을 이용하여 문자를 덧붙일 수 있음

ㄴ 문자열을 연결하여 하나의 문자열로 만들어줌

 

 

MySQLMemberDao.java

ㄴ sha1 함수 사용

 

MySQLBoardDao.java

ㄴ sha1 함수 사용

 

 

ㄴ report_member 테이블에 있는 password 를 모두 sha1('1111') 로 변경해주기

 

ㄴ report_member 테이블에 있는 password 를 모두 sha1('1111') 로 변경해주기

 

ㄴ 변경된 테이블(report_member, report_board) 데이터 확인