[텍스트큐브] PHP 7.3으로 쓸 때의 사소한 문제와 심각한 보안 문제
텍스트큐브는 새로 나온 PHP 7.3판에서 대다수 기능들이 일부 사소한 오류가 나더라도 대체로 잘 돌아간다. 하지만 관리자 로그인 인증에 구멍이 뚫리는 문제가 있다.
1. 사소한 문제
(1) 관리자 화면의 글 목록
텍스트큐브 관리자 화면의 글 목록에는 제목 옆에 옅은 글씨로 글의 앞머리가 살짝 나온다. PHP 7.3에서는 글 목록에서 어떤 글은 앞머리가 나오지 않고 어떤 글은 너무 많은 내용이 나오는 모습이 보였다. 한 문자를 4바이트에 담는 UTF8MB4 인코딩 형식으로 들어간 글의 길이를 잘못 셈하여 생기는 문제가 아닌가 싶다.
UTF8MB4에 얽힌 오류는 에모지(emoji)를 쓸 수 있게 하는 MySQL / MariaDB 설정 때문에 나타나는 것일 수 있다.
/interface/owner/entry/index.php 959~960째 줄에서 "$contentLength > 0"을 "$contentLength > 3"으로 고친다.
<span
class="description"><?php echo(($contentLength > 0) ? UTF8::lessenAsEm(removeAllTags(strip_tags($entry['content'])), $contentLength) : ''); ?></span>
↓
<span
class="description"><?php echo(($contentLength > 3) ? UTF8::lessenAsEm(removeAllTags(strip_tags($entry['content'])), $contentLength) : ''); ?></span>
(2) 디버그 경고문 없애기
/framework/data/MySQLi/Debug.php 50째 줄
if( $client_encoding != 'utf8' && function_exists('iconv') ) {
$__tcSqlLog[$__tcSqlLogCount]['error'] = iconv( $client_encoding, 'utf-8', mysqli_error(POD::$db));
}
↓
if( $client_encoding != 'utf8' && $client_encoding != 'utf8mb4' && function_exists('iconv') ) {
$__tcSqlLog[$__tcSqlLogCount]['error'] = iconv( $client_encoding, 'utf-8', mysqli_error(POD::$db));
}
다른 문제들은 디버그 상태에서 경고문이 뜨더라도 쓰는 데에는 지장이 없는 것 같다.
/framework/data/MySQLi/Debug.php 321째 줄 (지정되지 않은 변수 경고문)
$elapsed_total_db += $log['elapsed'];
↓
if (isset($log['elapsed']) && $log['elapsed']) $elapsed_total_db += $log['elapsed'];
/framework/model/URIHandler.php 11째 줄 : Static 변수 운용
(Accessing static property Model_URIHandler::$blogid as non static(8))
public static $blogid;
↓
public $blogid;
2. 관리자 인증 문제
로그인 인증 쪽은 문제가 심각하다. 어느 한 브라우저에서 관리자로 로그인하면 그 곳에서는 관리자 화면에 들어가지 못하고, 같은 공인 IP를 쓰는 모든 곳에서 관리자로 인증되는 문제가 있다. 의심되는 코드와 PHP 설정 항목을 건드려 보았지만 완전한 해결책은 찾지 못했다.
다음은 임시 방편으로 고쳐 본 것이다.
/framework/legacy/Textcube.Control.Session.php 231째 줄
@session_id($id);
↓
@session_id($id);
unset($_SESSION['acl']);
unset($_SESSION['identity']);
이렇게 하면 좀 불편하더라도 다른 엉뚱한 곳에서 관리자로 인증되는 것은 막을 수 있다. 처음 관리자로 로그인할 때에 바로 인증되지 않고 "서비스의 회원이지만 이 블로그의 구성원이 아닙니다. 주소를 확인해 주시기 바랍니다."라고 나온다. 이 때에 새로고침하거나 암호를 한 번 더 넣으면 관리자로 인증할 수 있다.
보안 인증 문제를 푼 코드가 정식으로 나올 때까지는 텍스트큐브를 쓰는 곳에서 PHP를 7.3으로 판올림하는 일을 매우 조심할 필요가 있다.
※ 관리자 인증이 잘 되도록 고친 Textcube.Control.Session.php 파일을 https://pat.im/1199에 올려 두었습니다. (2020.3.22.)
덧글을 달아 주세요