보안(Security Class)¶
보안클래스는 입력 값을 안전히 처리하여, 보다 안전한 프로그램을 만드는데 도움이 되는 함수들을 제공합니다.
XSS 필터링 XSS Filtering¶
CodeIgniter에서는 크로스 사이트 스크립팅 공격을 방지하는 XSS 필터는 자바스크립트실행을 시도한다거나, 쿠키를 하이재킹한다거나, 다른 해괴망측한 짓거리들을 한다거나 하는 것을 막는 기술입니다. 만약 금지된 문자나 코드(위 짓거리들을 하려는)등을 찾으면 데이터를 안전한 HTML 엔터티로 변환하여 표시합니다.
XSS필터를 이용하여 필터하려면 xss_clean() 함수를 사용하세요:
$data = $this->security->xss_clean($data);
항상 자동으로 POST 및 COOKIE 데이터를 필터링하려면 application/config/config.php 를 열고 다음과 같이 설정하십시오:
$config['global_xss_filtering'] = TRUE;
옵션으로 제공되는 두 번째 파라미터 is_image는 이미지를 검사하여 잠재적 XSS 공격을 방지합니다. 파일업로드시 유용합니다. 두 번째 파라미터가 TRUE이면 처리된 문자열을 반환하는 대신 이미지가 안전한 경우 TRUE를, 악의적인 정보가 포함된 경우 FALSE를 반환합니다.
if ($this->security->xss_clean($file, TRUE) === FALSE)
{
// file failed the XSS test
}
크로스 사이트 요청 위조 Cross-site request forgery (CSRF)¶
CSRF 보호를 활성화하려면 application/config/config.php 를 열고 다음과 같이 설정합니다:
$config['csrf_protection'] = TRUE;
폼(Form Helper)의 form_open() 함수를 사용하면 폼의 CSRF 보호를위한 hidden 필드가 자동으로 삽입됩니다. 그렇지 않으면, get_csrf_token_name() 과 get_csrf_hash()를 사용할 수 있습니다.
$csrf = array(
'name' => $this->security->get_csrf_token_name(),
'hash' => $this->security->get_csrf_hash()
);
...
<input type="hidden" name="<?=$csrf['name'];?>" value="<?=$csrf['hash'];?>" />
토근은 매 서브밋 때마다 재생성할 수 있습니다. 또는 하나의 CSRF 쿠기 값을 통해 계속 같은 값을 유지할 수 있습니다. 토큰 재생성을 기본으로 할 시 더 강력한 보안을 유지합니다. 그러나 유효하지 못한 토근값이 되버릴 수 있습니다(뒤로가기, 앞으로이동, 여러 탭/윈도우 사용, 비동기화 작업, 등).. 다음 구성 매개변수를 변경하여 동작을 변경할 수 있습니다.
$config['csrf_regeneration'] = TRUE;
URI 들을 선택하는 것은 csrf 보호에서 화이트리스트 될 수 있습니다. (예를 들면 API 의 값이 POST 값을 받는 경우입니다). 이러한 URL 들을 ‘csrf_exclude_uris’ 환경 변수에 추가할 수 있습니다:
$config['csrf_exclude_uris'] = array('api/person/add');
정규식도 지원됩니다 (대소문자 구분없음):
$config['csrf_exclude_uris'] = array(
'api/record/[0-9]+',
'api/title/[a-z]+'
);
클래스 레퍼런스 Class Reference¶
- class CI_Security¶
- xss_clean($str[, $is_image = FALSE])¶
인수: - $str (mixed) – 입력 문자열 or an array of strings
반환값: XSS-clean data
반환형: mixed
입력데이터로부터 XSS 를 제거하려고 하고, 깨끗한 문자열을 반환합니다. 만약 두 번째 파라미터가 TRUE 로 설정되어 있으면, 그리고 image 가 사용하기에 안전하면 TRUE 를 리턴하고 악성 데이터가 발견되면 FALSE 를 리턴합니다.
- sanitize_filename($str[, $relative_path = FALSE])¶
인수: - $str (string) – File name/path
- $relative_path (bool) – Whether to preserve any directories in the file path
반환값: Sanitized file name/path
반환형: 문자열
디렉토리 탐색 시도 및 다른 보안 위협을 방지하기 위해 사용자 입력을 통해 공급된 파일에 파일명을 깨끗하게 처리합니다.
$filename = $this->security->sanitize_filename($this->input->post('filename'));
상대 경로를 포함하는 경우, 사용자 입력을 혀용하는 경우, 예를 들어 file/in/some/approved/folder.txt, 두 번째 파라미터 $relative_path 를 TRUE 로 설정할 수 있습니다.
$filename = $this->security->sanitize_filename($this->input->post('filename'), TRUE);
- get_csrf_token_name()¶
반환값: CSRF token name 반환형: string CSRF 토근명 반환 ($config['csrf_token_name'] 값).
- get_csrf_hash()¶
반환값: CSRF hash 반환형: string CSRF 해쉬값 반환. 수동으로 폼을 생성하거나 유효한 AJAX POST 요청을 할 때에 get_csrf_token_name() 과 함께 사용하세요.
- entity_decode($str[, $charset = NULL])¶
인수: - $str (string) – 입력 문자열
- $charset (string) – Character set of the input string
반환값: Entity-decoded string
반환형: 문자열
이 함수는 ENT_COMPAT 모드에서 PHP 내장함수인 html_entity_decode() 함수와 같은 역할을 할려고 합니다, 단지 일부 브라우저가 가능하기 때문에 세미콜론으로 끝나지 않는 HTML 엔티티를 감지하려고 합니다.
$charset 파라미터가 비어있다면, 환경설정 $config['charset'] 값이 사용됩니다.
- get_random_bytes($length)¶
인수: - $length (int) – Output length
반환값: A binary stream of random bytes or FALSE on failure
반환형: 문자열
mcrypt_create_iv(), /dev/urandom 또는 openssl_random_pseudo_bytes() 를 통해 적절한 난수를 취하기 좋은 방법, 만약 저 중에 하나가 가능하다면.
CSRF 와 XSS 토근을 생성하기 위해 사용.
Note
출력은 암호 보안이 보장되지 않습니다, 단지 그 순간 가장 좋을 시도일 뿐입니다.