안녕하세요.
불과 하루 전에 질문/답변 게시판에 알지도 못하는 PHP 코드를 조금 수정해서 제대로 되었는지 확인 부탁드린다는 질문글을 남겼던 사람입니다.
그 내용이 XE에서 MariaDB(MySQL)에 SSL을 사용해 연결하는 방법에 관한 것이었는데요.
그 뒤로 처음의 엉터리 코드를 조금씩 바꿔 보다가 WordPress 소스를 참고로 그나마 낫게 바꾼 것 같습니다.
관련 자료가 전무한지라 나중에 DB 연결 보안에 관심은 있는데 웹 코딩은 잘 모르는 저와 같은 분들께서 참고하실 수 있도록 부족한 자료를 남겨봅니다.
참고로 당연한 사실이지만 XE 설정과는 별도로 MariaDB(MySQL) 쪽에 SSL 적용이 되어있어야 합니다.
수정한 소스는 다음의 ./classes/db/DBMysqli_innodb.class.php 뿐이지만 ./classes/db/DBMysqli.class.php도 적용 방식은 동일하며 mysql, mysql_innodb 연결 방식은 제외했습니다.
강조된 줄들이 추가된 부분이고 DBMysqli_innodb::__connect($connection) 함수 내의 주석 부분은 지워진 원본 코드입니다.
주석에 적힌 대로 5번째 줄을 주석 처리, 해제 함으로써 간단하게 SSL 사용 설정을 변경할 수 있습니다.
<?php /* Copyright (C) NAVER <http://www.navercorp.com> */ // SSL 사용시 주석 해제, 미사용시 주석 처리 define('MYSQL_CLIENT_FLAGS', MYSQL_CLIENT_SSL); require_once('DBMysql.class.php'); /** * Class to use MySQLi innoDB DBMS as mysqli_* * mysql innodb handling class * * Does not use prepared statements, since mysql driver does not support them * * @author NAVER ([email protected]) * @package /classes/db * @version 0.1 */ class DBMysqli_innodb extends DBMysql { // 생략 /** * DB Connect * this method is private * @param array $connection connection's value is db_hostname, db_port, db_database, db_userid, db_password * @return resource */ function __connect($connection) { // Attempt to connect $result = mysqli_init(); if ($result) { $client_flags = defined( 'MYSQL_CLIENT_FLAGS' ) ? MYSQL_CLIENT_FLAGS : 0; if($connection["db_port"]) { @mysqli_real_connect($result , $connection["db_hostname"] , $connection["db_userid"] , $connection["db_password"] , $connection["db_database"] , $connection["db_port"] , null , $client_flags); } else { @mysqli_real_connect($result , $connection["db_hostname"] , $connection["db_userid"] , $connection["db_password"] , $connection["db_database"] , null , null , $client_flags); } } /* if($connection["db_port"]) { $result = @mysqli_connect($connection["db_hostname"] , $connection["db_userid"] , $connection["db_password"] , $connection["db_database"] , $connection["db_port"]); } else { $result = @mysqli_connect($connection["db_hostname"] , $connection["db_userid"] , $connection["db_password"] , $connection["db_database"]); } */ $error = mysqli_connect_errno(); if($error) { $this->setError($error, mysqli_connect_error()); return; } mysqli_set_charset($result, 'utf8'); return $result; } // 생략 }
전에 남긴 질문글에서는
'MySQL 5.7 미만에서는 SSL 접속이 정상적으로 이루어지지 않더라도 오류가 발생하지 않기 때문에, 실제로 SSL 접속이 되고 있는지 확인이 필요합니다.'
라고 말씀해주신 분이 계셨는데 일단 위의 방식대로 가상 머신에 설정한 후 패킷 캡쳐를 해보면 SSL 보안이 적용된 패킷이 캡쳐되네요.
이 자료에 문제가 있다면 언제든지 말씀해주시기 바랍니다.
그런데 문제를 알려주신다 해도 저는 더이상 고칠 만한 실력이 못 되는 것 같네요.
아무튼 이 자료가 조금이나마 XE 사용자 분들께 도움이 되었으면 합니다.