SQL인젝션공격막기-그누보드에서 바인딩쿼리쓰는 방법 > 개발자팁

개발자팁

개발과 관련된 유용한 정보를 공유하세요.
질문은 QA에서 해주시기 바랍니다.

SQL인젝션공격막기-그누보드에서 바인딩쿼리쓰는 방법 정보

PHP SQL인젝션공격막기-그누보드에서 바인딩쿼리쓰는 방법

본문

그누보드는 쿼리를 문자열로 통으로 넣는 방식이라 취약합니다.

(코어는 패치하고있지만) 그 밖에 스킨등 사용자들 코드는 위험에 빠질 수 있습니다.

코어도 계속 취약점 나오고 있고요.

 

prepared statement 쿼리 일명 바인딩쿼리는 변수자리에 ? 를 넣고

나중에 값을 채우는 방식이라 SQL 인젝션 공격을 막는 확실한 방법입니다.

 

예시)

$query = 'select wr_id, wr_num, wr_subject from

g5_write_free where wr_id =  ? ';

 

그누보드 자유게시판에서 게시글 id 가 1 인 글을 불러오는 쿼리입니다.

wr_id = ?   // <- id 1 값이 들어갈 자리에 ? 를 둡니다.

 

그누보드에서 쓰는방법

common.php 는 많은 일을 합니다.

DB 연결, 확장, 라이브러리, 게시물 처리, POST, GET 문자열을 변수화시키는 것들 등등

 

common.php 에 보면

$connect_db = sql_connect(G5_MYSQL_HOST, G5_MYSQL_USER, G5_MYSQL_PASSWORD) or die('MySQL Connect Error!!!');
$select_db  = sql_select_db(G5_MYSQL_DB, $connect_db) or die('MySQL DB Error!!!');

// mysql connect resource $g5 배열에 저장 - 명랑폐인님 제안
$g5['connect_db'] = $connect_db;

$connect_db; 변수나 $g5['connect_db'] 에 담긴 DB 커넥션을 가져와서 쓰면됩니다.

-------------------------------------------------------

이제

$connect_db->prepare(바인딩할 sql 쿼리);  또는

$GLOBALS['g5']['connect_db']->prepare(바인딩할 sql 쿼리);

 

이렇게 하면 커넥션 중복 안되고도 PHP 기본 mysqli 함수를 쓸 수 있습니다.

예시)

$query = 'select wr_id, wr_num, wr_subject 
        from g5_write_free where wr_id = ? ';

$id = 1; //불러올 게시글 번호

/**
 * @var $stmt mysqli_stmt
 */
$stmt = $connect_db->prepare($query);  
//prepare 함수에 바인딩할 쿼리담기


$stmt->bind_param('i', $id);  //  쿼리의 ? 에 넣을(바인딩) 타입과 변수를 넘깁니다.
변수의 타입을 정합니다.. i는 int, s 는 string , b는 blob 과 패킷 , d 는 double, float 입니다.
변수가 여러개면 첫번째에 붙여서 넣습니다. 예) ('iss' , $id, $문자열 , $문자열2) 

$stmt->execute();  // 실행
$result = $stmt->get_result();   // 실행후 결과
$row = $result->fetch_assoc();   // 쿼리 실행후 받을 연관배열

 

var_dump 로 $row 를 찍어보면

$row 변수에는

array(3) { ["wr_id"]=> int(1) ["wr_num"]=> int(-1) ["wr_subject"]=> string(15) "안녕하세요" }

이렇게 됩니다.

 

그누보드의 sql_fetch 함수와 같은 역할이지만 SQL 인젝션을 근본적으로 해결합니다.

 

요약.

그누보드의 DB커넥션을 가져와서 PHP 의 바인딩 쿼리 함수들을 씁시다.

기존 코드도 같이 쓸 수 있습니다. 조금씩 안전한 코드로 바꾸면됩니다.

 

mysqli_stmt 함수 중 get_result 는 PHP 5.3 부터 됩니다. -  5.3부터된다고는 하지만 기본값이 활성화된건

5.4 입니다. 웹호스팅환경에서는 mysqld 드라이버가 설치되어있지 않으면 못쓰므로

5.4 버전 이상 사용을 권장합니다.

 

PHP 5.2  ㅠ

---------------

 

점진적으로 하자고 했더니 한꺼번에 바꾸자고 하네요

그게 언제일지..

추천
14

댓글 5개

@백조사랑 우선은 스킨만이라도요 ..ㅋㅋ
PHP쪽 cms 위험하다는 편견이 없어져야죠 취약점이 하나라도 줄어들길 희망합니다~
전체 5,352
개발자팁 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT