CI 묻고 답하기

제목 $this->db->query() 질문입니다.
카테고리 CI 2, 3
글쓴이 엘제이 작성시각 2019/08/21 17:16:15
댓글 : 1 추천 : 0 스크랩 : 0 조회수 : 12668   RSS

$id = "test234';

$sQuery="select a_id, a_name, a_pwd from T_ADMIN where a_id ='".$id. "'";

$sQuery = $this->db->escape($sQuery);

echo $squery // 아래 찍힌 쿼리요

$this->db->query($sQuery); 이렇게 하면 오류가 납니다. 찍어보니깐 escape된건지 ' 앞에 \가 붙어있네요

 

escape 한 이유가 

일반적으로 쿼리빌더(액티브레코드) $this->db->insert(), update(), set(), where() 등등을 이용하면

메뉴얼에도 나와았는거 같은데 escape 가 자동으로 설정된다고 하였고

 

$this->db->query() 는 안붙기 때문에 escape를 하거나  쿼리에 ? 를 붙이고 $this->db->뭐였더라 (array($id, .... )) 식으로 하라고 했던거 

같은데요 

 

그렇다면 $this->db->escape는 안써도 되는 것인지요? 아니면 2번째 ? , array() 방식으로 해야 하는 것인지요?

'select a_id, a_name, a_pwd from T_ADMIN where a_id =\'ljstyles\''

 다음글 [Session] 일정시간마다 새로고침하는 페이지인데 ... (1)
 이전글 페이지 번호 처리를 하기 위해서는 좀 쉬운 방법이 없을... (4)

댓글

kaido / 2019/08/21 18:27:38 / 추천 0

1. escape 는 액티브레코드 쿼리 빌더를 사용하여도 선택에 따라서 false로 놓고 사용합니다.

이유는 보시는 바와같이 특정 조건은 백틱이 붙으면 오류가 나기때문에. 혹은 알맞게 붙지 않아서.

[예 : $this->db->select('a_id', false);  뒤에 false가 붙으면 escape 하지 않음. ]

 

2. 조건에  ? 가 붙는걸 [쿼리 바인딩] 라고 부릅니다. 

다만 원리는 escape와 같습니다.

? 가 붙는것에 대해서만 백틱이 붙어서 오류가 날 가능성이 적습니다.

코어를 보시면 ? 순서 대로 들어오는 배열 인덱스별로 매칭한후에 escape 합니다. 

[정확한 명칭은 쿼리 바인딩 ... 혹은 바인드 쿼리라고 지칭되어있지만, 실제는 리터럴 쿼리입니다. 단지 CI 에서는 바인딩 한다고 부릅니다.]

 

결론적으로 처음부터 쿼리빌더를 사용하면 이러한 문제에 대한 고민이 적어집니다.

$this->db->query(); 는 있는 그대로 쿼리 사용이 가능한 만큼 사용자가 잘 판단해서 사용해야만 합니다.

 

마지막으로 쿼리 보호의 핵심은 파라미터 값에 산술오류를 넣어도 방어 하게끔 한다는 점입니다.

$id 가 1234가 들어올거라고 생각 하고 쿼리를 짯다면 해커는 1234가 아니라 고의적으로 1=1; select * from member; 이러한 문자를 삽입 하고는 맴버 테이블이 있다면 모든 정보를 긁어 오는 가장 기초적인 해킹 방법을 시도합니다.

escape 는 앞뒤로 백틱을 감싸기 때문에 저러한 문자열이 들어와도 실행되지 않고 오류가 납니다.

 

이 부분만 잘 판단 하시면  escape를 하시든, bind 하시든 어떻게 방어해야 하는지 감이 오실거라 생각 됩니다.