그누보드는 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 |