Security 클래스

Security 클래스에는 보안을 위해 입력 데이터를 처리하여 안전한 애플리케이션을 만드는 데 도움이 되는 메소드가 포함되어 있습니다.

XSS 필터링

CodeIgniter는 쿠키를 하이재킹하거나 다른 악의적인 작업을 시도하는 JavaScript 또는 다른 유형의 코드를 트리거하는 데 일반적으로 사용되는 기술을 찾는 사이트 간 스크립팅 방지 필터를 제공합니다. 허용되지 않는 것이 발견되면 데이터를 문자 엔티티로 변환하여 안전하게 렌더링됩니다.

XSS 필터를 통해 데이터를 필터링하려면 xss_clean() 메소드를 사용합니다:

$data = $this->security->xss_clean($data);

선택적 두 번째 매개변수 is_image를 사용하면 이 함수를 이미지에서 잠재적인 XSS 공격을 테스트하는 데 사용할 수 있어 파일 업로드 보안에 유용합니다. 이 두 번째 매개변수가 TRUE로 설정되면 변경된 문자열을 반환하는 대신 이미지가 안전하면 TRUE를, 브라우저가 실행하려고 할 수 있는 잠재적으로 악의적인 정보가 포함된 경우 FALSE를 반환합니다:

if ($this->security->xss_clean($file, TRUE) === FALSE)
{
        // 파일이 XSS 테스트에 실패함
}

중요

HTML 속성 값을 필터링하려면 html_escape()를 대신 사용하세요!

사이트 간 요청 위조 (CSRF)

application/config/config.php 파일을 다음과 같이 수정하여 CSRF 보호를 활성화할 수 있습니다:

$config['csrf_protection'] = TRUE;

폼 헬퍼를 사용하는 경우 form_open()이 자동으로 폼에 숨겨진 csrf 필드를 삽입합니다. 그렇지 않으면 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_regenerate'] = TRUE;

특정 URI는 CSRF 보호에서 허용 목록에 추가할 수 있습니다(예: 외부적으로 POST된 내용을 예상하는 API 엔드포인트). ‘csrf_exclude_uris’ 설정 매개변수를 편집하여 이러한 URI를 추가할 수 있습니다:

$config['csrf_exclude_uris'] = array('api/person/add');

정규식도 지원됩니다(대소문자 구분 없음):

$config['csrf_exclude_uris'] = array(
        'api/record/[0-9]+',
        'api/title/[a-z]+'
);

클래스 레퍼런스

class CI_Security
xss_clean($str[, $is_image = FALSE])
매개변수:
  • $str (mixed) – 입력 문자열 또는 문자열 배열

반환:

XSS 정리된 데이터

반환 형식:

mixed

입력 데이터에서 XSS 악용을 제거하고 정리된 문자열을 반환합니다. 선택적 두 번째 매개변수가 true로 설정된 경우 이미지가 사용하기 안전하면 boolean TRUE를, 악의적인 데이터가 감지되면 FALSE를 반환합니다.

중요

이 메소드는 HTML 속성 값 필터링에 적합하지 않습니다! 대신 html_escape()를 사용하세요.

sanitize_filename($str[, $relative_path = FALSE])
매개변수:
  • $str (string) – 파일 이름/경로

  • $relative_path (bool) – 파일 경로의 디렉터리를 보존할지 여부

반환:

정제된 파일 이름/경로

반환 형식:

string

특히 사용자 입력을 통해 제공된 파일에 유용한 디렉터리 탐색 시도 및 기타 보안 위협을 방지하기 위해 파일 이름을 정제하려고 합니다:

$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 토큰 이름

반환 형식:

string

CSRF 토큰 이름($config['csrf_token_name'] 값)을 반환합니다.

get_csrf_hash()
반환:

CSRF 해시

반환 형식:

string

CSRF 해시 값을 반환합니다. 폼을 수동으로 만들거나 유효한 AJAX POST 요청을 전송하기 위해 get_csrf_token_name()과 함께 사용할 때 유용합니다.

entity_decode($str[, $charset = NULL])
매개변수:
  • $str (string) – 입력 문자열

  • $charset (string) – 입력 문자열의 문자 집합

반환:

엔티티 디코딩된 문자열

반환 형식:

string

이 메소드는 ENT_COMPAT 모드의 PHP 기본 html_entity_decode() 함수와 매우 유사하게 작동하지만 일부 브라우저에서 허용하기 때문에 세미콜론으로 끝나지 않는 HTML 엔티티를 감지하려고 합니다.

$charset 매개변수가 비어 있으면 설정된 $config['charset'] 값이 사용됩니다.

get_random_bytes($length)
매개변수:
  • $length (int) – 출력 길이

반환:

임의의 바이트 이진 스트림 또는 실패 시 FALSE

반환 형식:

string

mcrypt_create_iv(), /dev/urandom 또는 openssl_random_pseudo_bytes() (이 순서로) 중 하나가 사용 가능한 경우 적절한 임의 바이트를 얻기 위한 편의 메소드입니다.

CSRF 및 XSS 토큰 생성에 사용됩니다.

참고

출력이 암호학적으로 안전하다는 보장은 없으며, 최선의 시도일 뿐입니다.