안녕하세요.

 

불과 하루 전에 질문/답변 게시판에 알지도 못하는 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 사용자 분들께 도움이 되었으면 합니다.

  • ?
    나중에 한번 해 봐야겠네요. 좋은정보 감사합니다.
  • profile
    테스트를 먼저해보고 실사용 서버에 적용해 봐야 겠습니다. 정보 감사합니다.