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 ㅠ
---------------
점진적으로 하자고 했더니 한꺼번에 바꾸자고 하네요
그게 언제일지..
13
댓글 5개


PHP쪽 cms 위험하다는 편견이 없어져야죠 취약점이 하나라도 줄어들길 희망합니다~
