PHP

그누보드 보안 SQL 인젝션 방어하기

마리오64 2022. 3. 30. 11:59

그누보드는 sql 쿼리를 문자열 그대로 취급하기에 sql 인젝션 공격 문제가 있습니다.

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 기본 함수를 쓸 수있습니다.

예시)

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

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

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


$stmt->('i', $id);  //  쿼리의 ? 에 넣을(바인딩) 타입과 변수를 넘깁니다.
$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 함수와 역할은 동일 하지만 안전한 방법입니다.

 

요약.

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

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

'PHP' 카테고리의 다른 글

php 개발자 한테 도움되는 사이트  (0) 2022.11.20
코드이그나이터 4 REST API 주의점  (0) 2022.04.14
PHP 동작방식 - 생명주기  (0) 2022.03.27
PHP if문 정리  (0) 2022.03.05
PHP 8.1 의 변경점: 클래스 로딩 최적화  (0) 2021.12.05