http://www.codeigniter-kr.org/lecture/view/247/page/1/
최근에 제가 운영하는 사이트에서 보안 문제로 말썽이 많았습니다.
CodeIgniter 개발자분들은 한번씩은 꼭 생각해 주셔야 하는데요, 보안이 약한경우: 개인정보 유출이나 (SQL Injection), 악성코드 투입 (XSS), 세션 하이재킹 (MITM Attack), 등등…
CodeIgniter 2.1.0에서 보안쪽으로 많이 좋아졋는데요, 만약 1.7 쓰시는 분들은 업그레이드 하시는게 좋을듯 합니다.
CodeIgniter 해킹 당하는법은 여러가지 인데요, 제일 중요한것들은: SQL Injection, XSS, 하고 Session Hijacking 입니다.
1. SQL Injection – 데이터베이스 해킹
요즘들어서 뉴스에 많이 나옵니다. 미국 해커그룹 “ANONYMOUS”가 자주 사용하는 해킹 방법인데요, SQL Injection을 사용해 데이터를 빼오거나, 파괴할수 있습니다.
예를 들자면:
1.
function
getBlogById(
$id
) {
2.
$sql
=
"SELECT * FROM blogs WHERE id=$id;"
;
3.
$query
=
$this
->db->query(
$sql
);
4.
return
$query
->result();
5.
}
만약 제가 id 대신, “‘ ‘; DROP TABLE blogs;’ 이런 코드를 사용한다면, 결과적으로:
1.
SELECT
*
FROM
blogs
WHERE
id=$id
2.
3.
SELECT
*
FROM
blogs
WHERE
id=
''
;
DROP
TABLE
blogs;
이런 query가 실행됀다고 생각하시면 됍니다. example이 조금 간단한데요 ㅡㅡ;; 예를 들자면 이렇습니다. 여기에 조금더 자세하게 나오네요: http://blog.naver.com/ubera5?Redirect=Log&logNo=10118490999
해결법:
1. ActiveRecord를 사용하기.
CodeIgniter에서 ActiveRecord에선 저절로 Sql Injection 보호가 처리됍니다. 하지만, ActiveRecord를 사용하실수 없을 경우, $this->db->escape을 사용하시면 됍니다.
2. $this->db->escape($data);
사용법:
1.
function
getBlogById(
$id
) {
2.
$sql
=
"SELECT * FROM blogs WHERE id='"
.
$this
->db->escape(
$id
).
"';"
;
3.
$query
=
$this
->db->query(
$sql
);
4.
return
$query
->result();
5.
}
이걸 사용하시면 악성 코드를 String으로 바꿔서 넣습니다. 예를 들자면, ‘ 를 /’ 로 바꾸는거죠. 그럼 간단한 보안처리가 됍니다.
3. $this->db->query($sql, array());
CodeIgniter에서 사용할수 있는, Parameterized 옵션도 있습니다. 이걸 사용하셔도 괜찬은데요, 사용법을 볼까요?
1.
function
getBlogById(
$id
) {
2.
$sql
=
"SELECT * FROM blogs WHERE id='?';"
;
3.
$query
=
$this
->db->query(
$sql
,
array
(
$id
));
4.
return
$query
->result();
5.
}
이렇게 하시면, ? 물음표가 저절로 $id로 바뀝니다.
2. XSS Attack – 악성 코드 투입
XSS란, “Cross Site Scripting” 이란 것인데요, 쉽게 말하자면… 해커가 정보를 남길때, 그냥 정보만 남기는게 아니라, 악성 Javascript나, ActiveX 스크립트를 남길수 있다는거죠. 그렇게 됀다면, 다음 유져가 들어왔을때, 공격에 당하는것 입니다.
누구나 한번쯤은 공격을 당하셧을겁니다. 가장 흔하게 사용돼는 방법이니까요.
예를 들자면, 그냥 HTML Form Input에 스크립트를 넣으면 됍니다.
1.
<script>
//악성코드 투입.. </script>
그럼 그게 데이터베이스에 저장이 돼고, 다른 유져가 불러올때, 실행이 됀다는거죠. 한국에서 Internet Explorer 많이 쓰는데요, 이런 문제로 심각합니다.
해결법:
1. config.php에서 설정하기.
application/config/config.php 에서 $config[‘global_xss_filtering’] 있는데요, 이걸 TRUE 하시면 됍니다. 그리고 꼭!! $_POST 대신, $this->input->post()를 사용하세요.
1.
$config
[
'global_xss_filtering'
] = TRUE;
하지만, Ajax Post 사용하시는분들은, 문제점이 있을겁니다. 만약 Ajax Post 사용하신다면, 이걸 사용하시 마세요.
2. $this->security->xss_clean($data);
먼저 $this->load->library(‘security’)를 해주셔야 사용할수 있는데요, autoload 해주셔도 괜찮습니다.
1.
function
addBlog(
$content
) {
2.
$insert_content
=
$this
->security->xss_clean(
$content
);
3.
$query
=
$this
->db->insert(
'blog'
,
$insert_content
);
4.
}
이렇게 하시면 안전합니다. ^^
3. Session Hijacking – 세션 보안
Session Hijacking은 주로 보기 드문데요, 하지만 이걸로 사용해서 큰 문제를 이르킬수 있습니다.
만약에 유져가 사이트에 가입이 돼있는 상태인데, 해커가 Session을 훔칠수 있다고 생각하시면 됍니다. Session을 훔친다는것은, 그 유져가 로그인 상태를 말하는데요, 그 유져에 정보들을 빼오거나 변경할수 있죠.
하는 방법은.. Cookie를 훔치는건데요, XSS 사용해서 Cookie를 빼온다음, 그 안에 Session ID를 도용해서, 브라우져 Cookie를 만든 다음 Session ID를 바꾸면 끝입니다.
다른 방법도 있습니다. 하지만, 제가 말했듯이 보기 드문데요. 만약 중요한 유저 정보를 가지고 계신분들은 한번 생각해보시는게 좋을듯 합니다.
CodeIgniter에선 Session Hijacking에 대한 보안이 잘돼어 있습니다.
해결법:
1. config.php에서 설정하기.
여기에서 고칠것들이 여러가지 있습니다. 중요한건 sess_match_useragent 하고 sess_match_ip 인데요, 이것들은 둘다 TRUE로 바꿔주시면 좋습니다.
useragent란, 브라우져, OS등을 말하는데요, 하지만 쉽게 바꿀수 있는건데요, sess_match_ip 해주시면, IP는 바꾸기 힘드니까, 둘다 하시면 안전합니다.
물론.. sess_expiration을 낮추는게 보안적으로 좋습니다.
1.
$config
[
'sess_expiration'
] = 7200;
2.
$config
[
'sess_match_ip'
] = TRUE;
3.
$config
[
'sess_match_useragent'
] = TRUE;
2. CSRF Protection
CSRF란, “Cross-site request forgery” 라고 하는데요, 이걸 이용해서 Session을 훔칠수 있습니다. CodeIgniter에서 이것도 보안이 돼는데요, application/config/config.php에서
1.
$config
[
'csrf_protection'
] = TRUE;
이렇게 새팅 해주시면 괜찮습니다.