[텍스트큐브] 스킨 미리보기 화면이 텅 비어 나오는 문제 풀기
텍스트큐브의 관리 기능 가운데 스킨 미리보기 기능이 있다. 스킨의 자료방(디렉토리) 이름에 빼기(-) 기호가 들어가면, 텍스트큐브의 스킨 미리보기 화면이 텅 비어 나오는 일이 쭉 있었다.
이 문제는 [텍스트큐브] 몇몇 스킨들이 미리보기가 안 되는 까닭에서 이야기한 적이 있다. 더 깊이 살피면, 스킨 미리보기 화면이 텅 비어 나오는 것은 /interface/owner/skin/preview/index.php에서 Validator 클래스의 filename 함수로 스킨 이름을 검사하는 것에 따르는 문제이다.
if(!Validator::filename($_GET['skin']) && $_GET['skin'] != "customize/$blogid")
Respond::NotFoundPage();
/framework/boot/10-CoreClasses.php 파일을 보면, Validator 클래스 안에 아래와 같이 filename 함수가 있다.
static function filename($value) {
return preg_match('/^\w+(\.\w+)*$/', $value);
}
preg_match 함수에 들어간 정규 표현식에서 \w는 영문자와 숫자와 밑줄을 아우르는 [A-Za-z0-9_]와 같다. 빼기(-)는 \w에 걸리지 않는다.
그 아래에 있는 directory 함수와 path 함수에 빼기(-) 기호까지 다룰 방법을 볼 수 있다.
static function directory($value) {
return preg_match('/^[\-\w]+( [\-\w]+)*$/', $value);
}
static function path($value) {
return preg_match('/^[\-\w]+( [\-\w]+)*(\/[\-\w]+( [\-\w]+)*)*$/', $value);
}
directory 함수와 path 함수에서는 이름값에 빼기(-) 기호가 들어가는 것까지 헤아리고 있다. 이를 참고하여 filename 함수의 \w를 [\-\w]+로 바꾸면 밑줄이 들어간 파일 이름까지 받아들이도록 처리할 수 있다.
static function filename($value) {
return preg_match('/^[\-\w]+(\.[\-\w]+)*$/', $value);
}
$_GET['skin']은 파일 이름이 아닌 디렉토리 이름으로서 스킨 이름과 스킨 경로에 쓰이므로 Validator 클래스의 filname 함수가 아니라 directory 함수로 검사해야 옳다고 볼 수도 있다. 하지만 directory 함수나 path 함수를 그대로 쓰면 스킨 경로 이름에 마침표(.)가 들어갈 때에 미리보기 화면이 나오지 않는 문제가 또 생긴다.
아무튼 빼기(-) 기호가 스킨의 경로 이름이나 파일 이름에 언제든지 쓰일 수 있으므로, 꼭 위와 같지 않더라도 filename 함수를 빼기(-) 기호를 받아들일 수 있게 고쳐 둘 필요는 있다.
덧글을 달아 주세요