Q&A

CMS/프레임워크 Rhymix 2.1
개발 언어 PHP 8.4

안녕하세요. 

비개발자입니다. 

 

클로드 코드 시켜서 현재 php를 7.4 -> 8.4로 업데이트 작업을 하고 있는데요. 

작업 중 코어 파일을 수정한 부분이 있어 이거 수정해도 되는 건지 문의 드립니다. 

 

 

1. Security.php (보안 설정 페이지)

Security.php:28-31

// 28행 — 관리자 허용 IP
$allowed_ip = Config::get('admin.allow') ?: array();
// 30행 — 관리자 차단 IP
$denied_ip  = Config::get('admin.deny')  ?: array();
  • 추가한 것: 뒤의 ?: array()
  • 의미: "값이 비어있으면(null이면) 빈 배열을 대신 써라"
  • : 바로 아래에서 implode(PHP_EOL, $allowed_ip) 로 IP 목록을 줄바꿈으로 합치는데, IP를 한 번도 등록 안 한 상태면 null이라 8.4에서 즉사. (같은 파일 21·24행은 원래 가드가 있었는데 이 두 줄만 빠져 있었음)

2. Debug.php (디버그 설정 페이지)

Debug.php:27, 35

// 27행 — 디버그에 표시할 내용 종류
Context::set('debug_display_content', (array)Config::get('debug.display_content'));
// 35행 — 디버그 허용 IP
$allowed_ip = Config::get('debug.allow') ?: array();
  • 27행 추가: 앞에 (array) 캐스트 — null이든 뭐든 무조건 배열로 변환. 이 한 줄로 템플릿(config_debug.html)에서 이 값을 in_array() 로 8번 검사하는 곳이 전부 해결됨
  • 35행 추가?: array() — Security.php와 동일한 IP 목록 implode 보호

3. Advanced.php (고급 설정 페이지)

Advanced.php:32

$cache_config = array_first(Config::get('cache') ?? []);
  • 추가한 것?? []
  • 의미: 캐시 설정이 없으면(null) 빈 배열을 array_first() 에 넘김
  • : 캐시를 한 번도 설정 안 한 서버에서 고급 설정 페이지를 열면 TypeError
  • 이건 사실 2.1.32 업그레이드 때 이미 한 번 고쳤던 것입니다 (메모리 reference_rhymix_2132_advanced_php_bug 기록). 8.4 작업의 새 발견이 아니라 기존 패치가 유지되고 있다는 의미.
lucas Lv. 1

댓글 4

  • 1. https://github.com/rhymix/rhymix/blob/c90fcda947e82b87bd4ac03bc592304289e3679c/common/defaults/config.php#L95-L98 

    admin.allow와 admin.deny의 기본 설정값이 array()이므로 불필요합니다.

     

    2. https://github.com/rhymix/rhymix/blob/c90fcda947e82b87bd4ac03bc592304289e3679c/common/defaults/config.php#L113C4-L113C19

    https://github.com/rhymix/rhymix/blob/c90fcda947e82b87bd4ac03bc592304289e3679c/common/defaults/config.php#L119

    두 설정값 역시 기본값이 array입니다.

     

    3. https://github.com/rhymix/rhymix/blob/c90fcda947e82b87bd4ac03bc592304289e3679c/common/defaults/config.php#L23

    역시 cache 설정 자체가 array로 초기화되므로 불필요합니다.

     

    실제로 해당 부분에서 오류가 발생했다면 라이믹스 버그이니 고쳐야 합니다. 그게 아니라 선제적으로 수정 시도하신 것이라면 전부 불필요한 수정사항입니다.

  • @YJSoft

    사이트에서 오류가 발생해서 수정했는데, 그럼 수정한채로 놔둬도 되는 것이죠? 

     

    1) Security.php — 보안 설정 페이지

    서버 오류 TypeError #0 "implode(): If argument #1 ($separator) is of type string, argument #2 ($array) must be of type array, null given" in modules/admin/controllers/systemconfig/Security.php on line 29

    • 관리자 IP 허용/차단 목록이 비어 있어 implode()에 null이 들어가 터짐 → Security.php:28,30에 ?: array() 가드 추가.

    2) Debug.php — 디버그 설정 페이지 (정확히는 그 화면 템플릿에서 터짐)

    서버 오류 TypeError #0 "in_array(): Argument #2 ($haystack) must be of type array, null given" in modules/admin/tpl/config_debug.html on line 59

    • 오류는 템플릿(config_debug.html 59행)에서 났지만, 원인은 그 값을 넘겨주는 컨트롤러 Debug.php에서 debug.display_content가 null인 채 전달된 것.
    • 그래서 템플릿 8군데를 고치는 대신 근원인 Debug.php:26-27에 (array) 캐스트를 넣어 한 번에 해결.
    • 추가로 Debug.php:35의 debug.allow는 오류가 나기 전에 제가 먼저 발견해서 같이 막았습니다 (Security.php와 똑같은 implode(null) 패턴이라, 그 페이지 열면 똑같이 터질 게 명확했음).
  • @lucas

    오류가 났다고 말씀하시니 그 부분은 오류가 난 것이 맞겠지만, 오류가 나기 전에 먼저 발견했다는 것은 AI의 뻘짓이겠죠. 이 녀석 특징이, 문제의 원인을 고칠 생각은 안 하고 당장 에러메시지가 뜨지 않도록 땜빵만 합니다. 근원을 고쳤다고 뻥을 치는 모양인데, 그것도 그냥 땜빵해 놓은 거예요.

     

    진짜 원인은 설정에 null이 저장되어 있다는 것이거든요. 거기에 ?? [] 를 붙이든 (array)를 붙이든 설정 파일이 잘못 저장되어 있다는 점은 변하지 않습니다. 잘못 저장된 설정을 바꾸면 모든 문제가 해결될 텐데, 그걸 그냥 두고 실시간으로 치환만 하고 있는 거예요.

     

    윗분 말씀대로, 해당 설정을 저장한 적이 없더라도 처음 설치할 때부터 배열이 들어가 있었어야 합니다. 안 그러면 라이믹스 처음 설치하신 분들은 다 에러나게요? ㅎㅎ 님 사이트만 유독 설치가 잘못되었거나, 아니면 설정 파일에 엉뚱한 것을 집어넣는 자료가 있는지도 모릅니다.

     

    문제의 설정 페이지들을 한 번씩 다시 저장하셨다면 모두 제대로 기본값이 들어갔을 테니, 순정으로 돌아가도 괜찮을 겁니다. 만약 아직도 불안하다면 files/config/config.php를 열어서 확인해 보세요.

  • @기진곰

    땜빵하고 뻥치는 것이였군요 ㅎㅎㅎㅎ 

     

    코어 파일이 8.X 버전에 맞을 텐데 왜 문제가 생기는 건지 궁금했는데, 

    역시 물어보길 잘 한 것 같네요. 

     

    순정 파일로 다시 돌려보니 현재 문제 없이 잘 됩니다. 

    추가로 files/config/config.php 파일 확인해보니 테스트 서버에는 해당 내용이 누락돼서 문제가 발생한 것 같아 보이네요.