Chillax in dev

[코드이그나이터] CI보안관련 공부 본문

PHP & MySQL

[코드이그나이터] CI보안관련 공부

Seong Story 2021. 3. 15. 21:35
728x90

[코드이그나이터] 보안관련 공부

- 코드이그나이터 줄여서 CI관련 프로그래밍을 통해 CMS 관리자 페이지를 개발하던중 알아야했던 보안에 관련된 로직의 처리를 정리해보고 내것으로만들자.

 

1. 크로스 도메인(Cross Domain) 

- 크로스 도메인은 웹 개발시 자바스크립트로 외부 서버의 경로로 ajax요청을 할때 에러가나면서 요청이 실패하는 문제이다. 이를 이해하기위해선 몇가지 개념을 알아야한다.

- SOP(Same Origin-policy) 은동일 출처 정책으로 웹어플리케이션 보안모델로 자바스크립트(XMLHttpRequest)로 다른 웹페이지에 접근할때 같은 출처(Same Origin)의 페이지에서만 접근이 가능하도록한 보안기능인데 여기서 같은 출처 즉 같은 도메인은 프로토콜,호스트명,포스트가 같은 것을 의미한다. 

정리하면 도메인 보안 정책상 웹페이지의 스크립트는 그 페이지와 같은 서버에 있는 주소로만 ajax요청을 할 수 있다는것이다.

- 허나 요즘처럼 대형프로젝트나 REST API등을 이용한 외부 호출 서비스가 많은 상황에서 타도메인에서 해당 ajax요청을 하면 오류가 나는 문제가 생겨 골치가 아프다. 따라서 나온정책이 CORS(Cross-Origin-Resource Sharing)이다.

이 정책은 서버에서 외부 요청을 허용할 경우 ajax요청이 가능하다. 응답 받는 서버쪽 요청 응답 헤더에 Access-Control-Allow-Origin으로 허용할 오리진을 지정하여 크로스 도메인을 허용하면 ajax실행 오류 의 문제를 해결할 수 있다.

 

2. XSS 필터링

- XSS(Cross Site Script)란 웹어플리케이션에서 사용자 입력 값에대한 필터링이 제개로 이루어지지않은 허점을 이용해 악의적으로 폼에 스크립트 코드를 삽입하여 희생자측에서 동작하도록하여 사용자의 개인정보, 쿠키정보, 악성코드 감염, 웹페이지를 변조하는 등의 공격, 취약점을 통해 스크립트를실행시키는 등의 방법이다.

- 간단히 종류를 살펴보면 Stored XSS, Reflected XSS,Dom based XSS 등등이 있다.

- 방안 : 철저히 사용자 입력값검증을 서버단에서 미리해둔다. 사용자 입력 문자열에 HTML코드로 인식될지 모르는  특수문자를 일반문자로 치환하여 처리힌다.

Ex) <,> 와같은 경우  &lt;, &gt; 로 치환한다.

 

-CI에선 이러한문제를 해결하기위한 방법을 잘 준비해 뒀다. 참고하여 사용하면되겠다.

ciboard.co.kr/user_guide/kr/libraries/security.html

 

Security Class ‐ 코드이그나이터 3.0 한글매뉴얼

A binary stream of random bytes or FALSE on failure

www.ciboard.co.kr

3. 크로스 사이드 요청 위조 CSRF

- CSRF(Cross-site request forgery) 사이트간 요청 위조라는 의미인데 웹 어플리케이션 취약점 중 하나로 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 해 수정,삭제등의 작업에서 보안이 취약한 부분을 공격하는 방법이다.

특히 개인정보 유출 사건에 많이 사용됬고 방법도 쉬워 널리 사용되니 주의해야할 방법이다.

- 해커가 특정 사이트의 url 패턴을 분석하고 예측해 값을 바꾸어버린다던지 악의적으로 개인정보를 유출합니다.

 

-> CI에선 따라서 입력에대해 먼저 필터링을 할 수있도록 지원합니다.

아래와 같이 사용자 입력이있을 때 검증해줍시다.

		$data = $this->security->xss_clean($_POST);
			
			if(!isset($data['csrf'])){
				$this->lib->msg("크로스 사이드 스크립팅의 접근입니다.", 2);
				exit;
			}

 

4. SQL Injection (sql 삽입 공격)

- 악의적인 사용자가 임의의 SQL문을 주입하여 말 그대로 그 SQL로 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위 입니다.

상상해보면 SELECT * FROM MEMBER WHERE id=$id; 라는 구문을 실행하는데  $id부분에  DROP TABLE MEMBER을  넣버린다면?.. 다날라가겠다..

 

-> $this->db->escape("실행할 sql문"); 과 같은 방식으로 사용하면 보호 처리됩니다.

function getBlogId($id){
	$sql = "SELECT * FROM MEMBER id=" '".$this->db->escape($id)."';";
    $query = $this->db->query($sql);
    return $query->result();

}

- preparestatement 를 활용하는것도 좋은 방지 방법이다.

 

 

 또 배우게 되면 수정하도록 하겠습니다 ^^

728x90
LIST
Comments