CI 묻고 답하기

제목 pdo 쿼리빌더를 사용해야 할지 고민입니다.
카테고리 CI 2, 3
글쓴이 엘제이 작성시각 2019/08/12 22:44:52
댓글 : 6 추천 : 0 스크랩 : 0 조회수 : 16779   RSS

회사에서 pdo를 이용하여 db를 셋팅해서 CI로 제작하려고 하는데요

database.php인가 config.php 에서 $db  pdo로 셋팅했고요

기존에는

$result = $this->db->query('쿼리문');

$row = $result->row();

등으로  사용했는데 그글링 등으로 검색해보니깐 여기서 질문했던 pdo 얘기가 나오더군요

그런데 난독증인지 pdo 를 사용하면 $this->pdo 로 해야 한다고 그러는건지?

$this->db 로 해도 인젝션 막아준다고 하는 것인지 헷갈리네요

$this->db 로 해도 인젝션을 막을 수 있는지

pdo로 구성해서 $this->db 를 사용이 가능한지 

알고 싶습니다.

 다음글 CI table insert. update 성공 후 데... (7)
 이전글 captcha 이미지를 음성으로 듣기 (1)

댓글

kaido / 2019/08/13 09:40:50 / 추천 0

pdo 이라는 것은 무엇일까?

pdo 이라는 것은 php 에서 만들어진 db 관련 공통 모듈로 php database object 입니다.

여기까지는 아실거라 사료됩니다.

즉 각종 db 모듈을 공통되게 쓰려고 만든것 입니다.

 

ci 에서 database 모듈 로드는 $this->db 로 합니다.

pdo는 pdo 어댑터를 사용해서 각종 db 모듈에 접속해서 사용하는 것이고, ci 에서의 database 라이브러리는 $this->db 을합니다.

 

결론적으로 database.php 파일에 pdo를 설정하고 $this->db 를 사용하면 pdo 형태로 접속하여 사용할수 있습니다.

 

인젝션 방지는  pdo 내에서도 있긴하지만 ci 자체에서도 쿼리빌더 형태로 사용하시면 자동으로 인젝션 방지 코드가 붙습니다.

이건 pdo만 아니라 쿼리빌더를 사용하면 공통적으로 인젝션 방지 코드가 붙습니다.

 

다만 사용하기에 앞서 깊게 들어가면 pdo 와 정식 db 모듈(가령 mysqli , oci8) 들하고는 버전 차이가 조금 날수 있어, 사용 가능한 기능의 차이가 조금 있습니다.

 

참고로 $this->db->query() 형태로 넣는다고 해도 쿼리를 한번 감싸서 방지해 주는 기능이 있습니다.

$this->db->escapte() 를 하시면 쿼리를 한번 감싸줍니다.

$this->db->protect_identifiers() 으로 식별자 보호도 가능합니다.

http://www.ciboard.co.kr/user_guide/kr/database/queries.html

실제 쿼리빌더의 인잭션방지는 쿼리 이스케이프 하고 동일 합니다.

엘제이 / 2019/08/13 10:15:01 / 추천 0
그럼 $this->db->query() 를 할땐 인젝션방지를 위해 무조건 $this->db_>escape() 를 해야 하는것인가요?
kaido / 2019/08/13 10:59:36 / 추천 0

무조건은 아니지만 escape 하면 편리하게 방지가 됩니다.

xss  방지의 기본은 밴틱으로 감싸주는것입니다.

그리고 몇가지 코드에 대한 치환처리 입니다.

 

다만 쿼리빌더의 장점은 db driver가 변경되어도 크게 손대지 않아도 그대로 사용 가능한 이식성에 있습니다.

 

오직 xss 보안 관련이 문제이고, $this->db->query 형태로만 되어 있어 변경에 시간이 오래 걸린다면 

query 앞에 escape() 처리만 하시면 적은 코스트로 처리가 가능 합니다.

다만 이런 형태의 표준화 작업은 면밀히 테스트와 검토를 하셔야 합니다.

한대승(불의회상) / 2019/08/13 11:41:46 / 추천 0

CI의 쿼리빌더를 사용하시면 기본적인 SQL 인젝션은 방어가 가능합니다.

$this->db->query() 도 아래와 같이 사용하면 방어가 가능합니다.

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));

 

엘제이 / 2019/08/13 15:59:40 / 추천 0

그러니깐 

$sql "SELECT * FROM some_table WHERE id = '".$var. "' AND status = j'".$var1."' AND author = '".$var2. "'";
$this->db->query($sql);
은 인젝션이 안되는 거였군요. ㅠㅠ
kaido / 2019/08/13 17:15:38 / 추천 0


$sql = $this->db->escape($sql);
$this->db->query($sql);

echo $sql;

 

우선 해보시면 알게됩니다.