보안(Security)

본 페이지에서는 웹 보안에 대한 실용적기법들(best practices) 과 CodeIgniter 의 보안 항목에 관한 상세 설명을 제공합니다.

Note

안전한 연락처를 찾기위해 여기 오셨다면, Contribution Guide <../contributing/index>를 참조해주세요.

URI 보안 URI Security

CodeIgniter 는 악의있는 데이터가 프로그램으로 전달되는 것을 방지하기 위하여 URI 에 쓰는 문자를 상당히 제한하고 있습니다. URL 은 아래 사항들만 포함해야 합니다:

  • Alpha-numeric text (알파벳과 숫자))
  • Tilde: ~
  • Percent sign: %
  • Period: .
  • Colon: :
  • Underscore: _
  • Dash: -
  • Space

Register_globals

시스템 초기화과정에서 모든 글로벌 변수(global variables)들은 해제( unset ) 됩니다. 단, $_GET, $_POST, $_REQUEST 그리고 $_COOKIE 배열은 예외입니다.

해제 루틴은 register_globals = off 와 동일한 동작을 합니다.

display_errors

실제 서비스에서는 PHP의 에러표시기능을 꺼두는 것이 좋습니다(internal error_reporting 플레그를 0 으로). 그렇게 함으로써 민감한 정보가 포함될 수 있는 PHP 에러가 사용자에게 보이지 않도록 합니다.

index.php에 포함된 CodeIgniter 상수 ENVIRONMENT 값을 ‘production’ 으로 설정하면 오류메세지는 표시되지않습니다.개발 모드에서는 ‘development’ 를 사용하는 것을 추천합니다. 환경별 처리 (Handling Environments) 에서 환경별로 달리 처리할 수 있는 사항들을 확인하세요.

magic_quotes_runtime

magic_quotes_runtime 지시자는 시스템 초기화과정에서 off 되므로 데이터베이스에서 데이터를 조회할 때 슬래쉬를 제거할 필요가 없습니다.

실용적 기법들 Best Practices

서버로부터 전달된데이터(사용자가 입력한 POST 데이터, COOKIE 데이터, URI 데이터, XML-RPC 데이터, SERVER 배열에 있는데이터 등)들을 처리하기 전에 아래의 3단계를 거치는 것이 좋습니다:

  1. 올바른 타입,크기,길이 등의 사항들을 검증합니다.
  2. 오염된 데이터를 필터합니다.
  3. 데이터베이스에 입력하기 전에 이스케이프(Escape) 합니다.

CodeIgniter 는 이러한 단계를 지원하기 위하여 다음 함수들을 지원합니다:

XSS 필터링 XSS Filtering

CodeIgniter 는 크로스 사이트 스크립팅(Cross Site Scripting) 필터를 제공합니다. 이 필터는 악의적인 자바스크립트를 데이터에 포함하는 것이라든지, 쿠키등을 가로채려는 것을 찾아냅니다. XSS 필터는 여기 에 상세한 설명이 있습니다.

Note

XSS 필터링은 단지 출력 부분을 수행하여야 합니다. 입력 데이터를 필터링하는 것은 바람직하지 못한 방법으로 데이터가 수정될 수 있습니다., 패스워드로부터 특수문자를 제거한다든지, 이런 것은 보안을 강화하는 것보다는 약하게 합니다.

CSRF 보호 CSRF protection

CSRF stands for Cross-Site Request Forgery, which is the process of an attacker tricking their victim into unknowingly submitting a request.

CodeIgniter provides CSRF protection out of the box, which will get automatically triggered for every non-GET HTTP request, but also needs you to create your submit forms in a certain way. This is explained in the Security Library documentation.

암호 처리 Password handling

당신의 어플리케이션을 잘 작동하게 하기 위해서 암호를 다루는 것은 매우 중요합니다.

불행하게도, 많은 개발자들은 어떻게 해야할지 잘 모릅니다, 그리고 웹은 오래되었거나 도움이 되지 않은 잘못된 방법으로 가득차 있습니다.

우리는 당신을 도울 해야할 것과 하지 말아야할 것 목록을 주고 싶습니다. 아래를 읽어봐주세요

  • 일반 텍스트 형식으로 암호를 저장하지 마십시오

    항상 암호를 hash 하세요 .

  • Base64 나 그와 비슷한 방법으로 인코딩하여 저장하지 마세요

    이것은 일반 텍스트 형식으로 하는 것과 비슷합니다. 진짜로. hash 하세요, encoding 하지 마시구요.

    인코딩(encoding), 그리고 인크립션(encryption) 도, 양방향 프로세스입니다. 패스워드는 그 소유주에게만 알려져야 하는 비밀입니다. 그러므로 한방향으로만 변환되어야 합니다. Hashing 은 그렇게 한방향입니다. hashing 을 해제할 방법이 없습니다. 그러나 디코딩, 디크립션 (decryption) 은 가능합니다.

  • MD5 나 SHA1 같은 약한 알고리즘을 사용하지 말아주세요.

    이 알고리즘은 오래된 것이고, 결합이 입증되었고, 맨 처음에 패스워드를 hash 하는 것에 목적을 두고 설계되지 않았습니다.

    또한, 여러분 고유의 알고리즘을 개발하지 마세요.

    BCrypt 같은 강한 패스워드 해싱 알고리즘을 사용하세요 다음을 참조하세요 : 패스워드 해싱 (Password Hashing) 함수.

    당신은 PHP는 5.5 이상을 실행하지 않을 경우에도 이를 사용하십시오, CodeIgniter는 적어도 PHP 버전 5.3.7을 실행하는 만큼 당신을 위해 그들을 제공합니다 (- 요구 사항을 충족하지 않는 경우 업그레이드하십시오).

    만약에 PHP 최근 버전으로 업그레이드할 수 없는 불운한 사람이라면, hash_pbkdf() <http://php.net/hash_pbkdf2> 를 사용해보세요.

  • 일반 텍스트 형식으로 암호를 표시하거나 보내지 마십시오!

    패스워드의 소유자라할지라도, 만약에 패스워드 분실을 한 경우, 새로운 랜덤 일회용 패스워드를 생성하여 주세요.

  • 사용자의 암호에 대해 부자연스러운 제약을 두지 마십시오.

    패스워드에 글자수라던지, 특수문자를 포함해야 한다던지의 강제하는 것은 아무 소용이 없습니다.

    이것은 보안을 강화하기는 커녕 보안을 줄여줍니다. 그래서 그것을 할 이유가 아무 것도 없습니다. 기술적으로 제한하거나 저장 제약은 실제로 적용되지 않습니다. 절대로!

입력데이터의 유효성 Validate input data

CodeIgniter 는 데이터의 유효성검증, 필터링, 준비를 돕는 폼검증라이브러리 (Form Validation Library) 를 가지고 있습니다. .

당신의 사용 사례에 해당하지 않는 경우에도, 항상 확인해야하고 모든 입력 데이터를 검증하고 살균해야 합니다. 예를 들면, 입력 값으로 숫자가 와야 한다면, is_numeric() 또는 ctype_digit() 으로 체크할 수 있습니다. 항상 어떤 패턴을 체크하는 것을 범위를 줄일려고 노력하세요.

이것은 $_POST$_GET 변수 뿐만이 아니라, 쿠키나 user-agent 문자열 그리고 기본적으로 여러분 자신에 의해 생성되지 않은 모든 데이터를 포함한다는 것을 기억해주세요.

데이터베이스에 입력전 모든 데이터를 이스케이프하기 Escape all data before database insertion

이스케이프 하지 않고 절대로 정보를 데이터베이스에 넣지 말아주세요. 더 많은 정보를 위해 데이터베이스 쿼리 (database queries) 를 참조하세요.

파일 숨기기 Hide your files

다른 좋은 보안 방법은 index.php 와 “assets”(e.g. .js, css and image 파일들) 만 서버의 webroot 디렉토리에 남기는 것입니다. (일반적으로 “htdocs/” 라 불리우는). 이것들이 웹에서 접근할 수 있는 유일한 파일들입니다.

방문자로 하여금 다른 파일을 보게 한다는 것은 스크립트를 실행하는 등, 민감한 데이터에 접근하도록 허락하는 것입니다.

만약에 이것을 할 수 없다면, 위 리소스들을 접근하는 것을 방지하기 위해 .htaccess 파일을 이용해볼 수 있습니다.

CodeIgniter 는 이러한 데이터를 숨기기 위해 index.html 파일을 모든 디렉토리에 가질 것입니다. 그러나 이것이 심각한 공격을 막는 충분한 방법은 아니라는 것을 기억하세요.