Codeigniter

6.1 SQL 삽입공격

SQL 삽입 공격을 이용한 여러 가지 사례가 있지만 하나의 예를 들어 CodeIgniter에서 어떻게 SQL 삽입 공격을 막을 수 있는지 알아보겠습니다.

다음과 같은 user 테이블이 있다고 가정합니다.

id

user_id

password

1

advisor

123456

 


SQL 삽입 공격에 대해 취약한 사이트에 아이디 advisor ‘ #, 비밀번호 22222 로 로그인합니다.

● 로그인 체크 쿼리

SELECT  * FROM user where id=’$id’ AND passwd =’$passwd’;

● SQL 삽입 공격에 의해 변조된 쿼리

SELECT * FROM user WHERE id =’advisor’ #’ AND passwd =’222222’;
select * from user where id =’advisor’ ; //변조된 쿼리와 동일한 쿼리


변조된 쿼리를 보면 쿼리 중간에 # 이 들어가 있습니다. MySQL에서 # 은 주석처리의 의미입니다. 그래서 AND 뒤쪽 부분의 조건은 실행되지 않습니다. 결국 비밀번호를 몰라도 사이트에 로그인이 됩니다.

CodeIgniter에서 SQL 삽입 공격을 막을 수 있는 방법에 대해 알아보겠습니다.

 

1. $sql = “SELECt * FROM user WHERE id = ‘”.$this->db->escape_str($id).“ ’ AND passwd = ‘ ”. $this->db->escape_str($passwd).“’”;

2. $sql = “SELECT * FROM user WHERE id =? AND passwd =? ”;

3. $this->db->where(array(‘id’=> $this->input->post(‘id’, TRUE),
    ‘passwd’=>$this->input->post(‘passwd’, TRUE)));
$this->db->get(‘user’);

 

1. $this->db->escape_str() 함수를 이용해 ‘(작은 따옴표)를 처리합니다. (mysql_real_escape_string() 함수와 동일 기능).

2. CodeIgniter 의 SQL 바인딩을 이용해 처리할 수 있습니다.

3. $this->input->post() 함수를 이용하는 방법입니다. CodeIgniter 에서는 $_POST 형태로 폼 데이터를 받는 것이 아니라 $this->input->post() 함수를 이용합니다. 폼 데이터를 받을 때 예제처럼 두 번째 파라미터에 TRUE를 주면 SQL 삽입 공격뿐만 아니라 다음 절에서 설명할 XSS 에 대한 처리도 한꺼번에 합니다. 폼 데이터를 $this->input->post()를 이용해 받을 때 파라미터만 하나 더 주면 되기 때문에 이 방법을 추천합니다.


3번의 방법보다 더 간단하고 강력한 설정이 있습니다. 바로 config.php 에 다음과 같이 설정하는 것입니다.

bbs/application/config/config.php

 

$config[‘global_xss_filtering’] =TRUE;

기본 설정은 FALSE 인데 TRUE 로 바꾸면 두 번째 파라미터 없이 $this->input->post(‘변수명’), $this->input->get(‘변수명’) 으로만 사용해도 자동으로 보안처리를 해 줍니다.

설정만 바꿔서 간단히 전체 프로그램에 적용되지만 한 가지 단점이 있습니다. textarea의 내용 중에 라인이 있을 경우 자동으로 으로 바꿔버립니다. 위지위그 에디터를 사용하는 사이트라면 config에서 설정하여 사용하면 안 됩니다. 제일 좋은 방법은 $this->input->post(‘변수명’, TRUE)를 사용하는 것입니다.

 


6.2 XSS

xss는 cross-site scripting 의 약어로 사이트간 스크립팅 또는 크로스 사이트 스크립팅이라 합니다. 해커가 웹 페이지에 악성 스크립트를 삽입할 수 있는 취약점입니다. 이 취약점을 이용해 다른 사람의 쿠키나 세션 정보를 가로챌 수 있어 해커가 그 사용자의 관리 페이지에 접근할 수 있습니다 게시판 라고 올리고 글을 봤을 때 경고창으로 XSS!! 라고 뜬다면 XSS 에 대비하지 않은 게시판입니다.

$write_data=array(
     ‘subject’ =>$this->input->post(‘subject’, TRUE),
     ‘contents’ =>$this->input->post(‘contents’, TRUE)
    );

 

6.1절에서도 강조했던 $this->input->post(‘변수명’, TRUE) 가 나옵니다. 두 번째 파라미터가 TRUE 이면 POST 전송받은 변수의 값을 자동으로 XSS 필터링합니다.

다시 한 번 강조하지만 절대로 $_POST[‘변수명’] 형태로 사용하지 말고, $this->input->post(‘변수명’, TRUE) 로 사용하세요.

 

 


6.3 CSRF


CSRT 는 크로스 사이트 요청 위조의 약어이며, 사이트의 인증된 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정 사이트에 요청합니다. 예를 들어 공격자가 A사이트의 게시판에 피해자 B가 접속하는 은행 사이트를 공격할 수 있는 조작된 이미지 태그를 남깁니다. 피해자 B가 은행 사이트에 로그인한 상태에서 A 사이트 게시판을 읽게 되면 조작된 이미지 태그 안의 링크가 실행되면서 은행 사이트를 공격하게 됩니다. 공격자가 직접 은행 사이트를 공격하는 것이 아니라 피해자 B를 이용해 우회 공격하는 것입니다.

이를 막기 위해서는 서버의 상태를 변경하는 요청은 GET을 사용하지 않고 POST 전송의 경우에도 hidden 필드에 임의의 값을 전달하고 컨트롤러에서 그 킷값이 맞는지 확인해야 합니다.

CodeIgniter 에서는 다음과 같은 방법은 CSRF 공격을 막을 수 있습니다.

$config[‘csrf_protection’]=FALSE;
$config[‘csrf_token_name’] =’csrf_test_name’;
$config[‘csrf_cookie_name’]=’csrf_cookie_name’;
$config[‘csrf_expire’] =7200;

 

$config[‘csrf_protection’] 의 값을 TRUE 로 변경합니다.
그리고 폼 전송 부분의

 

선언 부분을 form helper 의 form_open() 함수로 바꿔주면 CSRF 방지를 위한 hidden 필드를 자동으로 삽입해줍니다. 컨트롤러에서의 체크 부분은 코어에서 자동으로 처리합니다. 컨트롤러에서 폼 헬퍼를 로딩합니다.

 

 

 

class Board extends CI_Controller {

	function __construct()
	{
		parent::__construct();
		//$this->load->database();
		$this->load->model('board_m');
		$this->load->helper(array('url', 'date', 'form'));

	}

 

<!-- 	<form class="form-horizontal" method="post" action="" id="write_action">
 -->
	<?php
		$attributes =array('class' => 'form-horizontal', 'id' =>'write_action');
		echo form_open('board/write/ci_board', $attributes);

	?>

 

 

1. 기존 폼 태그는 주석 처리합니다.

 

2. 추가해야 할 속성 값을 배열로 작성하여 form_open() 함수의 두 번째 파라미터로 전달합니다.

 

3. form_oepn() 함수를 출력합니다.

 

실행해서 소스를 보면 다음과 같이 출력 됩니다.

 

form action="http://127.0.0.1/todo/board/write/ci_board" class="form-horizontal" id="write_action" method="post" accept-charset="utf-8">
<input type="hidden" name="csrf_test_name" value="66e9e276428d7d512a2d3dfa76248eba">                                                                                                                            

		<fieldset>
			<legend>게시물 쓰기</legend>		



hidden 필드의 value 는 계속 바뀌고 폼을 전송했을 경우 CodeIgniter 에서 자동으로 값이 맞는지 체크하여 CSRF 방지를 합니다.

개발하면서 보안에 신경을 많이 써야 하는데 CodeIgniter 는 간단하게 보안처리를 할 수 있습니다.

$this->input->post('변수명', TRUE ) 이것 하나만 적용해도 SQL 삽입 공격과 XSS 두가지를 대비할 수 있습니다.

 

 

 

미리보기

만들면서 배우는 CodeIgniter 프레임워크

 

한빛미디어

 

집필서

 

판매중

페이스북 퍼가기 구글+ 퍼가기 트위터 퍼가기

  • 저자 :변종원
  • 출간 :2013-07-16
  • 페이지 :432 쪽
  • ISBN :9788968480263

 

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

내가 아버지께 효도하면 자식이 또한 나에게 효도한다. 내가 어버이께 효도하지 않는데, 자식이 어찌 나에게 효도하겠는가. -강태공

댓글 ( 4)

댓글 남기기

작성