1. 파라미터 변조 대응
ATLAS에서 사용하는 웹 메소드에 대한 웹 보안 처리 방법을 기술한다.
댓글 등록 메소드와 삭제 메소드를 통해 어떻게 처리하는지 알아본다.
1.1. 댓글 등록
Insert 같은 작업은 프록시 툴이나 해킹 프로그램을 이용하여 등록 자체를 막을 수 있는 방법은 없어 보인다. 왜냐하면 모든 사용자는 포스트의 댓글 권한을 가지고 있기 때문이다.
Insert 같은 작업의 보안은 타인의 ID를 도용하여 등록하는 작업을 막는 것이다.
아래 코드는 클라이언트(javascript)에서 댓글 등록하는 로직이다.
서버(웹 메소드)에서 자바스크립트에서 넘겨준 회원번호 값과 인증세션 값을 비교하여 일치 여부로 타인의 ID로 도용하는 것을 막을 수 있다.
아래 코드는 AjaxService.OnInsertComment 웹 메소드가 서버에서 처리하는 로직이다.
코드에서 보듯이 client에서 유효성 체크하였지만 서버에서도 체크하고 있는 것을 알 수 있다.
위 코드에서 체크한 부분은 client에서 받은 회원번호가 변조되었는지를 검사하는 로직이다.
1.2. 댓글 삭제
Delete, Update 같은 작업은 해당 작업을 등록한 사람이거나 admin권한을 부여받은 사람만 권한을 가진다.
그러므로 작업 번호와 회원 번호를 확인하여 권한을 줄 지 여부를 결정해야 하는 로직이 필요하다.
아래 코드는 댓글 삭제시 웹 메소드 소스코드이다.
댓글 삭제시 댓글 번호를 파라미터로 받는다.
웹 메소드 내에서 회원 번호를 얻어 비즈니스 로직에 댓글 번호와 회원 번호를 넘겨준다.
결국 프로시저에서 회원 번호와 댓글 번호를 입력 받아 권한이 있는지 여부를 체크해야 한다.
아래 코드는 삭제 프로시저 코드 일부를 발췌하였다.
파라미터로 회원 번호가 추가되었다.
아래 인증쿼리 부분이 삭제 권한을 체크하는 부분이다.
실제 이 댓글을 삭제할 권한이 있는 사람은 포스트 작성자와 댓글을 작성한 회원이 가능하다.
그렇기 때문에 TB_Posts 테이블과 TB_Comment 테이블을 조인하여 권한 여부를 체크한다.
참고로 비회원이 등록한 댓글을 삭제할 경우는 웹 메소드에서 처리하지 않고 팝업 형태로 서버단에서 처리하고 있다. 그와 같은 경우는 결국 memberGuid 가 null이기 때문에 인증 쿼리 내부에서 보듯이 @memberGuid 가 NOT NULL인 경우에만 체크하게 된다.
결국 권한이 없다면 -9를 리턴하게 되고 웹 메소드에서 NOAUTH를 반환하게 된다.
스크립트에서 NOAUTH를 받게 된다면 권한이 없다는 에러를 내려주게 된다.
2. 쿠키 암호화
웹사이트에서 사용되는 쿠키 값의 암호화하는 방식에 대해 알아보자.
아직 웹사이트는 회원정책이 정해지지 않았지만 현재 웹사이트에서 개인 정보를 쿠키로 저장하는 정보는 회원ID, 회원이름, 닉네임, 이메일 정보이다.
이들 정보는 쿠키로 저장하므로 암호화하여 정보를 보호해야 한다.
이 외에 락커룸 번호, 락커룸 Url, 방문자 수(락커룸, 포스트, 강좌) 등이 쿠키로 저장하는 정보이다.
이들 정보들을 암호화 함으로써 악의적인 공격을 방어할 수 있다.
간단히 회원 정보를 암호화하는 과정만 살펴보도록 하겠다.
회원 정보를 암호화하기 위한 포맷은 아래와 같다.
|| 문자열은 회원 정보 단위이고 == 문자열은 회원 정보의 키와 값을 나타낸다.
위 문자열을 Base64String으로 암호화한 값은 아래와 같다.
Base64String은 'A'에서 'Z'까지의 대문자, 'a'에서 'z'까지의 소문자, '0'에서 '9'까지의 숫자, 그리고 '+' 및 '/' 기호이다. 값이 없는 '=' 문자는 뒤쪽 여백에 사용된다.
3. Session 공격 대응
3.1. 스크립트 보안
포스트 쓰기 페이지에서는 HTML 코드를 지원한다.
HTML 코드를 지원한다는 말은 스크립트 코드를 삽입하여 웹 서버에 악의적인 공격이 가능한 것을 의미한다.
이런 경우에는 HTML 코드는 지원하되 스크립트 코드는 막아야 한다.
그리고 댓글을 작성하는 경우나 사용자가 입력하는 값에는 HTML 코드를 막아야 한다.
이러한 XSS 공격을 대응하기 위해 스크립트 코드를 막는 메소드와 HTML 코드를 막는 메소드를 개발하였다.
HTML 태그의 경우 < 문자와 > 문자가 태그의 시작과 끝을 의미한다.
사용자가 이 문자를 입력하여 서버에서 처리할 경우 그대로 저장을 하게 되면 HTML 태그로 인식하게 된다.
서버에서 저장할 때 <와 > 각각을 < 과 > 로 변환하여 저장하면 사용자가 입력한 값을 그대로 출력할 수 있다.
아래 코드는 HTML 태그를 변환 처리하는 메소드이다.
스크립트 코드를 막는 경우엔 “<script”로 시작하는 문자열을 검사한다.
만약 이 문자열이 존재한다면 </script> 문자열을 찾아 “<script~~>” 와 “</script>” 문자들을 제거함으로써 스크립트 코드를 제거할 수 있다.
아래 코드는 스크립트 코드를 삭제 처리하는 메소드이다.
3.2. 파일 업로드 보안
웹 사이트에서의 파일 업로드는 이미지 파일을 포함하여 원하는 파일을 업로드할 수 있다.
서버에서 처리 가능한 확장자를 가진 파일을 업로드할 경우 서버에 치명적인 오류와 보안상 문제가 발생하게 된다.
그렇기 때문에 파일 업로드 시 보안상 문제가 되는 확장자들을 차단하는 작업이 필요하다.
IIS에서 인식하는 확장자들을 IIS ? 홈디렉토리 ? 구성 ? 매핑 탭을 보면 알 수 있다.
이 확장명들을 가진 파일을 업로드하여 실행시 실행파일 경로에 있는 실행파일로 처리하게 되므로 보안에 문제가 생기게 된다.
파일 업로드시 확장명을 막는 메소드 코드는 아래와 같다.
4. 그 외 보안 사항
- Client에서의 유효성 체크를 서버에서도 유효성 검사하도록 한다.
- 보안상 중요한 정보들은 히든 필드를 사용하지 않도록 한다.
- 웹 사이트 방문 중 타인의 회원 번호를 노출시키지 않도록 한다.
- 사용자 입력 컨트롤(textbox, textarea, etc)에 스크립트 코드를 인식하지 못하게 한다.
- 입력컨트롤 문자열 길이 체크한다.