codeigniter
웹 애플리케이션 보안
수색…
소개
CodeIgniter는 개발 프레임 워크임을 기억하십시오. 그것은 당신이 응용 프로그램을 안전하게 만들려고 노력하지 않습니다. 그것은 단지 당신에게 스스로 할 수있는 도구를 제공합니다. CI의 보안 페이지를 보면 개발자가 응용 프로그램 보안을 이해하고 응용 프로그램에 빌드 할 것을 기대하고 있습니다.
웹 애플리케이션 보안이 비교적 새로운 것이라면 OWASP부터 시작하겠습니다. Zend 나 Cake와 같은 다른 프레임 워크를 살펴 보는 것이 더 유익 할 것입니다.
통사론
- $ freshdata = $ this-> security-> xss_clean ($ user_input_data);
매개 변수
사용자 입력 배열 | 공백 |
---|---|
xss_filter($array of user input) 삽입 | 공백 |
XSS 예방
XSS는 사이트 간 스크립팅을 의미합니다. CodeIgniter는 XSS 필터링 보안과 함께 제공됩니다. 이 필터는 악의적 인 JavaScript 코드 또는 쿠키를 도용하여 악의적 인 활동을 시도하는 다른 코드를 차단합니다. XSS 필터를 통해 데이터를 필터링하려면 아래와 같이 xss_clean () 메서드를 사용하십시오.
$data = $this->security->xss_clean($data);
데이터를 제출할 때만이 기능을 사용해야합니다. 선택적인 두 번째 부울 매개 변수는 XSS 공격에 대한 이미지 파일을 확인하는 데 사용될 수도 있습니다. 이것은 파일 업로드 기능에 유용합니다. 값이 true이면 이미지가 안전하고 그렇지 않은 경우를 의미합니다.
SQL 인젝션 방지
SQL 주입은 데이터베이스 쿼리에 대한 공격입니다. PHP에서는 mysql_real_escape_string () 함수를 사용하여 다른 기법과 함께 사용하지 못하게하지만 CodeIgniter는이를 방지하기 위해 inbuilt 함수와 라이브러리를 제공합니다.
CodeIgniter에서 SQL 삽입을 방지 할 수있는 방법은 다음 세 가지입니다.
- 이스케이프 쿼리
- 검색어 중첩
- 액티브 레코드 클래스
이스케이프 쿼리
<?php
$username = $this->input->post('username');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.
$this->db->escape($email);
$this->db->query($query);
?>
$this->db->escape()
함수는 자동으로 데이터 주위에 작은 따옴표를 추가하고 문자열 데이터 만 이스케이프 할 수 있도록 데이터 유형을 결정합니다.
검색어 중첩
<?php
$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));
?>
위의 예에서 물음표 (?)는 query()
함수의 두 번째 매개 변수에있는 배열로 대체됩니다. 이 방법으로 쿼리를 작성하면 쿼리가 자동으로 이스케이프되므로 안전한 쿼리가 생성된다는 이점이 있습니다. CodeIgniter 엔진이 자동으로 처리하므로 기억하지 않아도됩니다.
액티브 레코드 클래스
<?php
$this->db->get_where('subscribers_tbl',array('status'=> active','email' => '[email protected]'));
?>
활성 레코드를 사용하여 각 데이터베이스 어댑터에서 쿼리 구문을 생성합니다. 또한 값이 자동으로 이스케이프되므로 안전한 쿼리가 가능합니다.
PHP 오류 숨기기
프로덕션 환경에서는 종종 사용자에게 오류 메시지를 표시하고 싶지 않습니다. 디버깅 목적으로 개발 환경에서 활성화 된 경우 유용합니다. 이러한 오류 메시지에는 보안상의 이유로 사이트 사용자에게 표시해서는 안되는 정보가 포함되어있을 수 있습니다.
오류와 관련된 세 가지 CodeIgniter 파일이 있습니다. PHP 오류보고 수준
환경이 다르면 다양한 수준의 오류보고가 필요합니다. 기본적으로 개발은 오류를 표시하지만 테스트 및 실행은 오류를 표시합니다. 이 목적으로 사용되는 CodeIgniter의 루트 디렉토리에 index.php라는 파일이 있습니다. error_reporting () 함수에 인수로 0을 전달하면 모든 오류가 숨겨집니다.
CSRF 예방
CSRF는 사이트 간 요청 위조의 약자입니다. 아래와 같이 application / config / config.php 파일에서 옵션을 활성화하면이 공격을 막을 수 있습니다.
$config['csrf_protection'] = TRUE;
form_open()
함수를 사용하여 양식을 만들면 숨겨진 필드에 CSRF 토큰이 자동으로 삽입됩니다. get_csrf_token_name()
및 get_csrf_hash()
함수를 사용하여 CSRF 토큰을 수동으로 추가 할 수도 있습니다. 이름에서 알 수 있듯이 get_csrf_token_name()
함수는 CSRF 토큰의 이름을 반환하고 get_csrf_hash()
는 해시를 반환합니다.
CSRF 토큰은 제출할 때마다 다시 생성하거나 CSRF 쿠키의 수명 내내 동일하게 유지할 수 있습니다. 구성 옵션 'csrf_regenerate'를 설정하면 아래와 같이 토큰을 강제로 재생성합니다.
$config['csrf_regenerate'] = TRUE;
아래에 표시된 것처럼 'csrf_exclude_uris'키를 사용하여 구성 배열에서 일치 항목을 설정하여 CSRF 보호에서 URL을 허용 목록에 추가 할 수 있습니다. 정규 표현식을 사용할 수도 있습니다.
$config['csrf_exclude_uris'] = array('api/person/add');
사용자 입력에서 악용 사례 데이터 삭제
// XSS Filtering
$data = array(
'name'=> '<script>Abuse Data</script>'
);
$data = $this->security->xss_clean($data); // Clean Data
// Escaping Queries
<?php $username = $this->input->post('username'); $query = 'SELECT * FROM subscribers_tbl WHERE user_name = '. $this->db->escape($email); $this->db->query($query); ?>
사용자 입력에 대한 XSS 예방
사용자 입력에 의존하지 마십시오. <script>
태그 또는 자바 스크립트 alert();
그래서 우리는 모든 데이터가 우리 브라우저에서 실행되지 않도록 방지해야합니다. 그래서 우리는 xss 예방 방법을 사용하여 보안 데이터를 해커의 손에 쥐기를 제한해야하며 또한 사용자의 입력 검증에 대한 개발자의 책임과 프로그래밍 방식으로 오류를 해결해야합니다.
그래서, 이것이 CodeIgniter에서의 xss 예방의 예입니다.
$data = array(
'name' => "<script>alert('abc')</script>",
'email' => "[email protected]"
);
var_dump($data);
// Print array without xss cleaning/xss filtering
array(2) { ["name"]=> string(29) "" ["email"]=> string(19) "[email protected]" } // Result with alert
// now print data after xss filtering
$data = $this->security->xss_clean($data);
var_dump($data);
//Print array without xss cleaning/xss filtering
array(2) { ["name"]=> string(38) "[removed]alert('abc')[removed]" ["email"]=> string(19) "[email protected]" } // Result Without alert
xss_filtering을 추가 한 후에는 사용자가 입력 한 악용 코드를 실행하는 데 아무런 문제가 없습니다. CodeIgniter는이 악용 태그를 [removed]
키워드로 대체합니다.