4.36.02 (2012.06.27) : 플래시의 액션스크립트와 자바스크립트의 연동을 차단하여 악의적인 사이트로의 이동을 막는다. (i2sec 김준규님께서 알려 주셨습니다.) value="always" 를 value="never" 로, allowScriptaccess="always" 를 allowScriptaccess="never" 로 변환하는데 목적이 있다. : 4.36.01 의 코드에 오류가 있어 수정했습니다. lib/common.lib.php 의 아래 코드를 수정 및 추가하십시오. $content = preg_replace_callback("#<([^>]+)#", create_function('$m', 'return "<".str_replace("<", "<", $m[1]);'), $content); $content = preg_replace("/\<(\w|\s|\?)*(xml)/i", "", $content); // 플래시의 액션스크립트와 자바스크립트의 연동을 차단하여 악의적인 사이트로의 이동을 막는다. // value="always" 를 value="never" 로, allowScriptaccess="always" 를 allowScriptaccess="never" 로 변환하는데 목적이 있다. $content = preg_replace("/((?<=\]+)(\s*=\s*[\'\"]?)always([\'\"]?)([^>]+(?=\>))/i", "$1$2never$3$4", $content); 4.36.01 (2012.06.26) : XSS 취약점 수정 보완 (i2sec 강우석님께서 원인과 해결책을 모두 알려 주셨습니다.) 기존코드에 헛점이 있어 코드를 수정 보완 하였습니다. lib/common.lib.php 의 conv_content() 함수에 아래와 같이 한줄 추가 하였습니다. $content = preg_replace_callback("#<([^>]+)#", create_function('$m', 'return "<".htmlspecialchars($m[1], ENT_NOQUOTES);'), $content); 4.36.00 (2012.06.21) : DB SESSION 의 MySQL 과부하로 인하여 기존의 FILE SESSION 으로 되돌림 data/session 디렉토리를 생성하신 후 chmod 777 data/session 명령으로 세션데이터 쓰기가 가능하도록 퍼미션을 변경하시기 바랍니다. data/session 디렉토리에 deny from all 과 같은 내용으로 .htaccess 파일을 생성하십시오. common.php 를 아래와 같이 수정하십시오. //------------------------------------------- // SESSION 설정 //------------------------------------------- ini_set("session.use_trans_sid", 0); // PHPSESSID를 자동으로 넘기지 않음 ini_set("url_rewriter.tags",""); // 링크에 PHPSESSID가 따라다니는것을 무력화함 (해뜰녘님께서 알려주셨습니다.) session_save_path("{$g4['path']}/data/session"); if (isset($SESSION_CACHE_LIMITER)) @session_cache_limiter($SESSION_CACHE_LIMITER); else @session_cache_limiter("no-cache, must-revalidate"); //============================================================================== // 공용 변수 //============================================================================== // 기본환경설정 // 기본적으로 사용하는 필드만 얻은 후 상황에 따라 필드를 추가로 얻음 $config = sql_fetch(" select * from $g4[config_table] "); ini_set("session.cache_expire", 180); // 세션 캐쉬 보관시간 (분) ini_set("session.gc_maxlifetime", 10800); // session data의 garbage collection 존재 기간을 지정 (초) ini_set("session.gc_probability", 1); // session.gc_probability는 session.gc_divisor와 연계하여 gc(쓰레기 수거) 루틴의 시작 확률을 관리합니다. 기본값은 1입니다. 자세한 내용은 session.gc_divisor를 참고하십시오. ini_set("session.gc_divisor", 100); // session.gc_divisor는 session.gc_probability와 결합하여 각 세션 초기화 시에 gc(쓰레기 수거) 프로세스를 시작할 확률을 정의합니다. 확률은 gc_probability/gc_divisor를 사용하여 계산합니다. 즉, 1/100은 각 요청시에 GC 프로세스를 시작할 확률이 1%입니다. session.gc_divisor의 기본값은 100입니다. session_set_cookie_params(0, "/"); ini_set("session.cookie_domain", $g4['cookie_domain']); @session_start(); 4.35.02 (2012.06.15) : 4.35.01 의 세션테이블 생성할때 utf-8 사용시 세션테이블을 utf8 로 생성 (내일을위하여 님이 알려주시고 모바일님이 해결해 주셨습니다.) lib/dbsession.lib.php 에 추가하세요. if (strtolower($g4['charset']) == 'utf-8') { $sql .= " DEFAULT CHARSET=utf8 "; } 4.35.01 (2012.06.13) : 4.35.00 에서 cookie_domain 의 설정등이 누락되어 서브도메인간의 세션 공유가 되지 않던 오류를 수정 (cosy님께서 알려주셨습니다.) : 세션 데이터의 유지시간이 기본 1440초(24분)으로 짧아 10800초(3시간) 동안 유지되도록 수정 : 세션 테이블 생성시 날짜시간에 인덱스를 추가 common.php 를 아래와 같이 수정하세요. //------------------------------------------- // SESSION 설정 //------------------------------------------- include_once("$g4[path]/lib/dbsession.lib.php"); $session = new g4_dbsession(); session_set_save_handler(array($session, 'open'), array($session, 'close'), array($session, 'read'), array($session, 'write'), array($session, 'destroy'), array($session, 'gc')); session_set_cookie_params(0, "/"); ini_set("session.cookie_domain", $g4['cookie_domain']); ini_set("session.cache_expire", 180); // 세션 캐쉬 보관시간 (분) 180분 == 3시간 ini_set("session.gc_maxlifetime", 10800); // session data의 garbage collection 존재 기간을 지정 (초) 10800초 == 3시간 ini_set("session.use_trans_sid", 0); // PHPSESSID를 자동으로 넘기지 않음 ini_set("url_rewriter.tags",""); // 링크에 PHPSESSID가 따라다니는것을 무력화함 (해뜰녘님께서 알려주셨습니다.) if (isset($SESSION_CACHE_LIMITER)) @session_cache_limiter($SESSION_CACHE_LIMITER); else @session_cache_limiter("no-cache, must-revalidate"); @session_start(); //------------------------------------------- lib/dbsession.lib.php 를 아래와 같이 수정하세요. $sql = " CREATE TABLE `$g4[session_table]` (`ss_id` CHAR(32) NOT NULL, `ss_data` TEXT NOT NULL, `ss_datetime` DATETIME NOT NULL, PRIMARY KEY (`ss_id`), KEY `ss_datetime` (`ss_datetime`)) ENGINE = MYISAM "; 4.35.00 (2012.06.12) : SESSION Data 가 노출되지 않도록 DB SESSION 사용 (HSEngine 님께서 알려 주셨습니다.) : $_SERVER['PHP_SELF'] 변수를 사용한 XSS 취약점 수정 lib/dbsession.lib.php 파일 추가 config.php 파일에 추가하세요. $g4['session_table'] = $g4['table_prefix'] . "session"; // 세션 테이블 common.php 파일에서 SESSION 관련 코드를 모두 삭제하신 후 아래 코드로 대체하세요. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> $_SERVER['PHP_SELF'] = htmlentities($_SERVER['PHP_SELF']); //------------------------------------------- // SESSION 설정 //------------------------------------------- include_once("$g4[path]/lib/dbsession.lib.php"); $session = new g4_dbsession(); session_set_save_handler(array($session, 'open'), array($session, 'close'), array($session, 'read'), array($session, 'write'), array($session, 'destroy'), array($session, 'gc')); ini_set("session.use_trans_sid", 0); // PHPSESSID를 자동으로 넘기지 않음 ini_set("url_rewriter.tags",""); // 링크에 PHPSESSID가 따라다니는것을 무력화함 (해뜰녘님께서 알려주셨습니다.) if (isset($SESSION_CACHE_LIMITER)) @session_cache_limiter($SESSION_CACHE_LIMITER); else @session_cache_limiter("no-cache, must-revalidate"); @session_start(); //------------------------------------------- //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 4.34.30 (2012.05.29) : 4.34.28 의 검색 구문 수정후 게시판에서 분류 검색이 되지 않는것을 수정 lib/common.lib.php 의 get_sql_search() 함수가 수정 되었습니다. 4.34.29 (2012.05.27) : 4.34.28 패치에서 embed 태그중 allowscriptaccess 코드를 script 로 인식하여 동영상 작동이 안되는것을 수정 lib/common.lib.php 의 bad120422() 함수가 수정 되었습니다. function bad120422($matches) { $tag = $matches[1]; $code = $matches[2]; if (preg_match("#\bscript\b#i", $code)) { return "$tag 태그에 스크립트는 사용 불가합니다."; } else if (preg_match("#\bbase64\b#i", $code)) { return "$tag 태그에 BASE64는 사용 불가합니다."; } return $matches[0]; } 4.34.28 (2012.05.24) : 게시판 검색시 검색어에 태그가 들어가는 경우 쿼리 에러가 나는것을 수정 (곱슬최씨님께서 알려 주셨습니다.) get_sql_search() 함수 수정 : [보안패치] XSS 취약점 오류 수정 (i2sec 하동민님께서 알려 주셨습니다.) conv_content(), bad120422() 함수 수정 lib/common.lib.php 4.34.27 (2012.05.22) : [보안패치] SQL Injection 공격 취약점을, 김동현(BlackFalcon)님께서 한국인터넷진흥원을 통하여 알려 주셨습니다. bbs/download.php 에 아래 코드를 한줄 추가해 주시기 바랍니다. $no = (int)$no; 4.34.26 (2012.05.03) : 4.34.23 에서 이상 없는 OBJECT 태그의 반환이 제대로 되지 않던 오류 수정 (곱슬최씨님께서 고쳐 주셨습니다.) lib/common.lib.php 의 function bad120422($matches) { $code = $matches[1]; if (preg_match("#script#i", $code)) { return "OBJECT 태그에 스크립트는 사용 불가합니다."; } else if (preg_match("#base64#i", $code)) { return "OBJECT 태그에 BASE64는 사용 불가합니다."; } return $matches[0]; // 이 코드가 추가 되었습니다. } 4.34.25 (2012.04.30) : [보안강화] 설치시 data 디렉토리에 .htaccess 파일을 생성하여 data 디렉토리 및 하위 디렉토리에서는 .htaccess .htpasswd .php .phtml .html .htm .inc .cgi .pl 파일을 실행 할 수 없습니다. 기존에 운영중인 사이트에서는 data 디렉토리에 .htaccess 파일을 아래와 같은 내용으로 작성하십시오. Order allow,deny Deny from all 4.34.24 (2012.04.23) : 4.34.23의 conv_content() 함수내에 함수가 선언되어 그누보드외 프로그램에서 오류가 발생했습니다. bad120422() 함수를 conv_content() 바깥으로 이동시켜 해결하였습니다. (지니아빠님께서 알려 주셨습니다.) lib/common.lib.php 4.34.23 (2012.04.22) : [XSS] OBJECT 태그에서 javascript를 실행할수 있는 버그를 수정 (i2Sec 8기 하동민님께서 알려 주셨습니다.) : [XSS] 글쓰기시 이름에 HTML 태그가 입력되지 못하도록 수정 (i2Sec 8기 강우창님께서 알려 주셨습니다.) : login, logout시 외부로 리다이렉트 할 우려가 있어 url에 도메인을 지정하지 못하도록 수정 (i2Sec 8기 조민기님께서 알려 주셨습니다.) : cheditor4의 삭제 코드에 문제가 있어 이번 버전부터는 cheditor4는 제외하고 배포합니다. (i2Sec 8기 조민기님께서 알려 주셨습니다.) : 이외에도 i2Sec 8기 여러분들께서 SQL Injection 등의 오류를 알려 주셨으나 그누보드4가 소스코드를 오픈하고 있으므로 해당 오류는 SQL Injection으로 보기 어렵습니다. 도움주신 i2Sec 8기 여러분들께 감사의 말씀을 전합니다. lib/common.lib.php 의 function bad120422($matches) { $code = $matches[1]; if (preg_match("#script#i", $code)) { return "OBJECT 태그에 스크립트는 사용 불가합니다."; } else if (preg_match("#base64#i", $code)) { return "OBJECT 태그에 BASE64는 사용 불가합니다."; } } // object 태그에서 javascript 코드 막기 $content = preg_replace_callback("#]+)>#i", "bad120422", $content); bbs/write_update.php 의 $wr_name = strip_tags(mysql_escape_string($_POST['wr_name'])); bbs/login.php bbs/logout.php 의 $p = parse_url($url); if ($p['scheme'] || $p['host']) { alert("url에 도메인을 지정할 수 없습니다."); } 4.34.22 (2012.03.30) : 2012년 3월 30일 부터 시행되는 개인정보보호법으로 인해 회원가입시 주민등록번호를 입력 받지 못하도록 수정 adm/config_form.php bbs/register_form.php skin/member/basic/register.skin.php 4.34.21 (2012.03.09) : [보안패치] 파일명을 이용한 XSS 취약점 수정 (wh1ant님께서 도움 주셨습니다.) : UTF-8 사용시 링크에서 한글이 깨지던 오류 수정 (forever님, NaviGator님께서 도움 주셨습니다.) skin/board/basic/view.skin.php 을 아래와 같이 수정하세요. echo ""; ... if (confirm("'"+decodeURIComponent(file)+"' 파일을 다운로드 하시면 포인트가 차감(점)됩니다.\n\n포인트는 게시물당 한번만 차감되며 다음에 다시 다운로드 하셔도 중복하여 차감하지 않습니다.\n\n그래도 다운로드 하시겠습니까?")) lib/common.lib.php 의 function url_auto_link($str) 에서 $str = preg_replace("/([^(HREF=\"?'?)|(SRC=\"?'?)]|\(|^)((http|https|ftp|telnet|news|mms):\/\/[a-zA-Z0-9\.-]+\.[\xA1-\xFEa-zA-Z0-9\.:&#=_\?\/~\+%@;\-\|\,\(\)]+)/i", "\\1\\2", $str); 를 global $g4; ... if (strtoupper($g4['charset']) == 'UTF-8') { $str = preg_replace("/([^(HREF=\"?'?)|(SRC=\"?'?)]|\(|^)((http|https|ftp|telnet|news|mms):\/\/[a-zA-Z0-9\.-]+\.[가-힣\xA1-\xFEa-zA-Z0-9\.:&#=_\?\/~\+%@;\-\|\,\(\)]+)/i", "\\1\\2", $str); } else { $str = preg_replace("/([^(HREF=\"?'?)|(SRC=\"?'?)]|\(|^)((http|https|ftp|telnet|news|mms):\/\/[a-zA-Z0-9\.-]+\.[\xA1-\xFEa-zA-Z0-9\.:&#=_\?\/~\+%@;\-\|\,\(\)]+)/i", "\\1\\2", $str); } 로 수정하세요. 4.34.20 (2012.03.02) : UTF-8 사용시 cut_str 함수가 제대로 작동되지 않던 부분을 수정 (곱슬최씨님께서 도움 주셨습니다.) 거친마루님의 팁이 적용 되었습니다. http://www.sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=1328#c_1355 : 우편번호 2012.01.26.자 반영 51,898건 (FM2fmedia님께서 도움 주셨습니다.) lib/common.lib.php 의 cut_str() 함수 수정 bbs/zip.db 4.34.19 (2012.01.17) : 특정 서버에 따라 캡챠이미지의 결과를 인식하지 못하는 오류를 수정 (해외 서버에서 euc-kr 을 사용하는 경우에 오류가 보고된바 있습니다.) bbs/kcaptcha_result.php 에 아래 코드가 한줄 추가 되었습니다. header("Content-Type: text/html; charset=$g4[charset]"); 4.34.18 (2012.01.03) : PHP 버전에 따른 basic 회원 스킨 사용시 euc-kr 버전에서 ajax 가 제대로 작동되도록 수정 (konahn님) skin/member/basic/_common.php 를 아래와 같이 수정하십시오. $g4_path = "../../.."; // common.php 의 상대 경로 include_once("$g4_path/common.php"); header("Content-Type: text/html; charset=$g4[charset]"); // 추가된 코드 4.34.17 (11.12.09) : [보안패치] 게시물 검색시 $sfl 변수를 이용하여 패스워드 유추가 가능한 부분을 수정 (i2Sec-김세연[kaist]님) bbs/search.php 의 switch ($field[$k]) { case "mb_id" : case "mb_name" : $str .= "$field[$k] = '$s[$i]'"; break; default : if (preg_match("/[a-zA-Z]/", $search_str)) $str .= "INSTR(LOWER($field[$k]), LOWER('$search_str'))"; else $str .= "INSTR($field[$k], '$search_str')"; break; } 위 코드를 switch ($field[$k]) { case "mb_id" : case "wr_name" : $str .= "$field[$k] = '$s[$i]'"; break; case "wr_subject" : case "wr_content" : if (preg_match("/[a-zA-Z]/", $search_str)) $str .= "INSTR(LOWER($field[$k]), LOWER('$search_str'))"; else $str .= "INSTR($field[$k], '$search_str')"; break; default : $str .= "1=0"; // 항상 거짓 break; } 위와 같이 수정하여 주십시오. lib/common.lib.php 의 switch ($field[$k]) { case "mb_id" : case "wr_name" : $str .= " $field[$k] = '$s[$i]' "; break; case "wr_hit" : case "wr_good" : case "wr_nogood" : $str .= " $field[$k] >= '$s[$i]' "; break; // 번호는 해당 검색어에 -1 을 곱함 case "wr_num" : $str .= "$field[$k] = ".((-1)*$s[$i]); break; // LIKE 보다 INSTR 속도가 빠름 default : if (preg_match("/[a-zA-Z]/", $search_str)) $str .= "INSTR(LOWER($field[$k]), LOWER('$search_str'))"; else $str .= "INSTR($field[$k], '$search_str')"; break; } 위 코드를 switch ($field[$k]) { case "mb_id" : case "wr_name" : $str .= " $field[$k] = '$s[$i]' "; break; case "wr_hit" : case "wr_good" : case "wr_nogood" : $str .= " $field[$k] >= '$s[$i]' "; break; // 번호는 해당 검색어에 -1 을 곱함 case "wr_num" : $str .= "$field[$k] = ".((-1)*$s[$i]); break; case "wr_ip" : case "wr_password" : $str .= "1=0"; // 항상 거짓 break; // LIKE 보다 INSTR 속도가 빠름 default : if (preg_match("/[a-zA-Z]/", $search_str)) $str .= "INSTR(LOWER($field[$k]), LOWER('$search_str'))"; else $str .= "INSTR($field[$k], '$search_str')"; break; } 위와 같이 수정하여 주십시오. 4.34.16 (11.11.15) : [보안패치] XSS 취약점 권고에 대한 수정 (i2Sec-김태형님) lib/common.lib.php 의 function conv_content() 에서 $content = preg_replace("#\/\*.*\*\/#iU", "", $content); 이 코드의 위치를 바꿔 해결함 4.34.15 (11.10.24) : [보안패치] SQL Injection 공격이 가능한 취약점 코드 조치 요청으로 인한 수정 (packet storm -> 한국인터넷진흥원) bbs/tb.php 의 아래 코드가 수정 되었습니다. // 영문자 숫자 _ 과 일치하지 않는 문자는 삭제한다. (최대 20자) $bo_table = preg_replace("/\W/", "", substr($arr[1],0,20)); // 정수형으로 변환 $wr_id = (int)$arr[2]; // 영소문자 숫자 와 일치하지 않는 문자는 삭제한다. (최대 32자) $to_token = preg_replace("/[^a-z0-9]/", "", substr($arr[3],0,32)); 추신) 트랙백은 거의 사용하지 않는 기능으로 차기 버전에서는 기능 자체가 사라질수 있습니다. 4.34.14 (11.10.04) : [보안패치] 회원가입시 홈페이지 필드를 통한 SQL Injection 공격 예방 : [보안패치] 글수정, 답변시 링크 필드를 통한 XSS 공격 예방 (팔팔이님께서 알려 주셨습니다.) bbs/register_form_update.php 에 추가 되었습니다. $mb_homepage = trim(strip_tags(mysql_escape_string($_POST[mb_homepage]))); bbs/write_update.php 에 추가 되었습니다. $wr_link1 = mysql_real_escape_string($_POST['wr_link1']); $wr_link2 = mysql_real_escape_string($_POST['wr_link2']); bbs/write.php 에 추가 되었습니다. else if ($w == "u") { ... for ($i=1; $i<=$g4[link_count]; $i++) { $write["wr_link".$i] = get_text($write["wr_link".$i]); $link[$i] = $write["wr_link".$i]; } ... } else if ($w == "r") { ... for ($i=1; $i<=$g4[link_count]; $i++) { $write["wr_link".$i] = get_text($write["wr_link".$i]); } 4.34.13 (11.10.01) : [보안패치] 회원가입 및 수정시 회원테이블 필드에 올바르지 않은 값이 포함될 수 있는 오류가 발견 되었습니다. (팔팔이님께서 알려 주셨습니다.) bbs/register_form.php $member[mb_email] = get_text($member[mb_email]); ... 생략 ... $member[mb_10] = get_text($member[mb_10]); adm/member_form.php $mb[mb_email] = get_text($mb[mb_email]); ... 생략 ... $mb[mb_10] = get_text($mb[mb_10]); lib/common.lib.php function get_sideview($mb_id, $name="", $email="", $homepage="") 함수에 아래 코드가 추가 되었습니다. $name = get_text($name); $email = get_text($email); $homepage = get_text($homepage); 4.34.12 (11.09.22) : 글 또는 코멘트를 쓴 후 메일 발송을 하는 경우에 전체 회원에게 메일이 발송되지 않던 오류를 수정 (개미인간님께서 알려 주셨습니다.) bbs/write_update.php bbs/write_comment_update.php 두개의 파일 모두 아래 코드만 추가 되었습니다. $unique_email = array_values($unique_email); 4.34.11 (11.09.20) : 우편번호 2011.08.30.자 반영 (곱슬최씨님께서 도움 주셨습니다.) bbs/zip.db 4.34.10 (11.08.10) : [보안패치] $_SERVER 배열변수 값의 변조를 이용한 SQL Injection 공격을 막는 코드입니다. (SK Infosec 장경칩님께서 알려 주셨습니다.) bbs/visit_insert.inc.php 의 $sql = " insert $g4[visit_table] ( vi_id, vi_ip, vi_date, vi_time, vi_referer, vi_agent ) values ( '$vi_id', '$_SERVER[REMOTE_ADDR]', '$g4[time_ymd]', '$g4[time_his]', '$_SERVER[HTTP_REFERER]', '$_SERVER[HTTP_USER_AGENT]' ) "; 를 아래 코드로 대체합니다. $remote_addr = mysql_real_escape_string($_SERVER['REMOTE_ADDR']); $referer = mysql_real_escape_string($_SERVER['HTTP_REFERER']); $user_agent = mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']); $sql = " insert $g4[visit_table] ( vi_id, vi_ip, vi_date, vi_time, vi_referer, vi_agent ) values ( '$vi_id', '$remote_addr', '$g4[time_ymd]', '$g4[time_his]', '$referer', '$user_agent' ) "; 4.34.09 (11.07.26) : 우편번호 파일 업데이트 2011.07.21 조정내역 http://zipfinder.co.kr/zipcode/modi_list.htm : admin.menu300.php.bak 파일은 메뉴로 불러 들이지 않기 ( pogusm 님께서 도움 주셨습니다. ) bbs/zip.db adm/admin.lib.php if (!preg_match("/^admin.menu([0-9]{3}).*\.php$/", $entry, $m)) 4.34.08 (11.07.22) : 접속자현황에서 한글 깨지는 오류 수정 : 관리자 > 게시판관리 > 인기검색어 관리, 인기검색어 순위 추가 lib/common.lib.php : is_utf8() 함수 추가 visit_list.php adm/admin.menu300.php adm/popular_list.php adm/popular_rank.php 4.34.07 (11.07.01) : [보안패치] 파일업로드의 오류를 이용한 XSS 공격 취약점을 수정 ( wh1ant님께서 도움 주셨습니다. ) php.ini 의 magic_quotes_gpc = Off 로 사용하는 경우에만 오류가 발생합니다. : [보안패치] CHEDITOR5 에서 허가받지 않은 파일 삭제 버그가 발견 되었습니다. ( letsgolee님께서 도움 주셨습니다. ) : 우편번호 파일 업데이트 (잉크님께서 도움 주셨습니다.) 리 다음에 공란이 없어 "계곡리" 같은 주소가 표시되지 않던 버그를 수정 bbs/write_update.php 에 아래 코드를 추가하세요. if (!get_magic_quotes_gpc()) { $upload[$i]['source'] = addslashes($upload[$i]['source']); } 아래 3개 파일을 교체해 주시기 바랍니다. cheditor5/imageUpload/upload.php cheditor5/imageUpload/delete.php bbs/zip.db 4.34.06 (11.06.21) : [추가보안패치] CHSOFT 대표 나창호님께서 도움 주셨습니다. ( CHEDITOR 제작자 ) 4.34.05 에서 보완된 패치입니다. 플래시에서 이미지 파일이 아닌 경우에는 업로드 하지 않습니다. 아래 3개 파일을 교체해 주시기 바랍니다. cheditor5/imageUpload/upload.php cheditor5/popup/js/image.js cheditor5/popup/flash/CHXImage.swf 4.34.05 (11.06.18) : [보안패치] CHSOFT 대표 나창호님께서 도움 주셨습니다. ( CHEDITOR 제작자 ) GIF Exploit 이라고 불리우는 이 공격은 이미지 파일에 PHP 코드를 심어 서버에 업로드 합니다. CHEDITOR5 버전에만 해당됩니다. 참고) 심각한 사안이므로 되도록 빨리 패치해 주시는 것이 좋습니다. 아래 2개 파일을 교체해 주시기 바랍니다. cheditor5/imageUpload/upload.php cheditor5/popup/js/image.js 추가사항) data 폴더에서 php 나 html 파일을 실행하지 못하게 하려면 아래의 파일을 data 폴더에 만들어 놓으시기 바랍니다. data 폴더에 하나만 만들어 놓으시면 됩니다. 파일명 : .htaccess (파일명 앞에 점이 붙습니다. 숨김 기능을 합니다.) 내용 : Order allow,deny Deny from all 4.34.04 (11.05.27) : 글복사, 이동시 코멘트 삭제, 추가가 있었다면 코멘트가 제대로 복사, 이동되지 않는 버그를 수정하였습니다. ( 진서기님께서 이미 2009년에 알려주신 버그인데 패치가 늦었습니다. http://sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=18926 ) bbs/move_update.php 에서 $sql2 = " select * from $write_table where wr_num = '$wr_num' order by wr_parent, wr_comment desc, wr_id "; 를 $sql2 = " select * from $write_table where wr_num = '$wr_num' order by wr_parent, wr_is_comment, wr_comment desc, wr_id "; 이렇게 수정하시면 됩니다. 4.34.03 (11.05.17) : [보안패치] SQL Injection 취약점에 대비한 코드 수정 (한국인터넷진흥원을 통하여 과천고등학교 권혁님께서 취약점과 해결방안을 자세하게 알려주셨습니다.) : [보안패치] 이미지 태그의 src 속성에 download.php 링크가 있는 경우 게시물을 확인하는 것만으로도 파일의 다운로드가 가능한 취약점 수정 (국제정보보안센터[i2Sec]의 최종훈님께서 알려주셨습니다.) lib/common.lib.php 의 get_sql_search() 함수에 추가 $field[$k] = preg_match("/^[\w\,\|]+$/", $field[$k]) ? $field[$k] : "wr_subject"; lib/common.lib.php 의 conv_content() 함수 추가 $content = preg_replace("/<(img[^>]+download\.php[^>]+bo_table[^>]+)/i", "*** CSRF 감지 : <$1", $content); 4.34.02 (11.05.13) : [보안패치] 이미지 태그의 src 속성에 삭제등의 링크가 있는 경우 게시물을 확인하는 것만으로도 데이터의 위변조가 가능하므로 이것을 막음 (국제정보보안센터[i2Sec]의 최종훈님께서 알려주셨습니다.) : 캡챠 코드 변경 (비회원이 코멘트 댓글을 다른 경우 캡챠이미지를 변경할 수 있도록 수정) (letsgolee 님께서 알려주셨습니다.) [보안패치] lib/common.lib.php 의 conv_content() 함수에 아래 코드를 추가합니다. $content = preg_replace("/<(img[^>]+delete\.php[^>]+bo_table[^>]+)/i", "*** CSRF 감지 : <$1", $content); $content = preg_replace("/<(img[^>]+delete_comment\.php[^>]+bo_table[^>]+)/i", "*** CSRF 감지 : <$1", $content); $content = preg_replace("/<(img[^>]+logout\.php[^>]+)/i", "*** CSRF 감지 : <$1", $content); bbs/delete.php 와 bbs/delete_comment.php 에 아래 코드를 추가합니다. if ($is_admin) { if (!($token && get_session("ss_delete_token") == $token)) alert("토큰 에러로 삭제 불가합니다."); } bbs/view.php 에 아래 코드를 추가합니다. if ($is_admin) { set_session("ss_delete_token", $token = uniqid(time())); $delete_href = "javascript:del('./delete.php?bo_table=$bo_table&wr_id=$wr_id&token=$token&page=$page".urldecode($qstr)."');"; } bbs/view_comment.php 에 추가 또는 수정합니다. 추가 // 코멘트를 새창으로 여는 경우 세션값이 없으므로 생성한다. if ($is_admin && !$token) { set_session("ss_delete_token", $token = uniqid(time())); } ... 수정 $list[$i][del_link] = "./delete_comment.php?bo_table=$bo_table&comment_id=$row[wr_id]&token=$token&cwin=$cwin&page=$page".$qstr; [캡챠코드변경] js/jquery.kcaptcha.js 전체 skin/board/basic/view_comment.skin.php 를 아래와 같이 변경합니다. jQuery.fn.extend({...}); 를 삭제하시고 //jQuery(this).kcaptcha_load(); 이 코드를 아래 코드로 수정합니다. if (comment_id && work == 'c') $.kcaptcha_run(); 4.34.01 (11.05.11) : 비회원의 답변 코멘트 쓰기에서 캡챠가 뜨지 않는 오류를 수정 (휴온님이 알려주셨습니다.) 4.33.00 에 있던 코드를 적용하였습니다. 단점) 캡챠이미지를 클릭하여 새로운 이미지로 변경할수 없음 skin/board/basic/view_comment.skin.php 를 아래와 같이 수정합니다. jQuery.fn.extend({ kcaptcha_load: function() { $.ajax({ type: 'POST', url: g4_path+'/'+g4_bbs+'/kcaptcha_session.php', cache: false, async: false, success: function(text) { $('#kcaptcha_image') .attr('src', g4_path+'/'+g4_bbs+'/kcaptcha_image.php?t=' + (new Date).getTime()) .css('cursor', '') .attr('title', ''); md5_norobot_key = text; } }); } }); function comment_box(comment_id, work) { ... if (typeof(wrestInitialized) != 'undefined') wrestInitialized(); jQuery(this).kcaptcha_load(); 4.34.00 (11.04.29) : cheditor v5.04 탑재 (그누보드에서 사용할 수 있게 허락해주신 CHSOFT 나창호 대표님께 감사드립니다. www.chcode.com) 최신 버전(v5.06)은 약간의 문제가 있어 버전이 약간 낮은것으로 탑재합니다. 이미지 업로드시 플래시를 사용하는데 .htaccess 에 패스워드를 걸었다던지 하는 경우에는 이미지 업로드가 안됩니다. 플래시동영상은 코드롤 넣으셔야 합니다. 유튜브의 경우 > 소스코드 > 이전 소스코드 사용으로 나온 코드 : [보안패치] 4.33.10 의 코드를 보완 하였습니다. (letsgolee 님께서 알려주셨습니다.) ======================================================= cheditor5 적용 방법 (참! 쉽죠! 잉!) ======================================================= cheditor5 폴더 전체 업로드 lib/cheditor4.lib.php 교체 config.php 에 $g4['is_cheditor5'] = true; 추가 skin/board/?????/write.skin.php 의 if (document.getElementById('tx_wr_content')) { if (!ed_wr_content.outputBodyText()) { alert('내용을 입력하십시오.'); ed_wr_content.returnFalse(); return false; } } 를 if (document.getElementById('tx_wr_content')) { if (!ed_wr_content.outputBodyText()) { alert('내용을 입력하십시오.'); ed_wr_content.returnFalse(); return false; } } 이렇게 순서만 바꿔 주세요. ======================================================= bbs/register_form.php /* if (!($member[mb_password] == sql_password($_POST[mb_password]) && $_POST[mb_password])) alert("패스워드가 틀립니다."); // 수정 후 다시 이 폼으로 돌아오기 위해 임시로 저장해 놓음 set_session("ss_tmp_password", $_POST[mb_password]); */ if ($_POST['mb_password']) { // 수정된 정보를 업데이트후 되돌아 온것이라면 패스워드가 암호화 된채로 넘어온것임 if ($_POST['is_update']) $tmp_password = $_POST['mb_password']; else $tmp_password = sql_password($_POST['mb_password']); if ($member['mb_password'] != $tmp_password) alert("패스워드가 틀립니다."); } bbs/register_form_update.php /* 삭제 // 패스워드를 암호화하여 넘김 if ($mb_password) $tmp_password = sql_password($mb_password); else $tmp_password = get_session("ss_tmp_password"); */ $row = sql_fetch(" select mb_password from $g4[member_table] where mb_id = '$member[mb_id]' "); $tmp_password = $row['mb_password']; ... 추가 4.33.11 (11.04.28) : [보안패치] 4.33.10 의 보안패치에 문제가 있어 다시 패치합니다. (한국인터넷진흥원을 통하여 Null@Root 소속의 Hacker@n 님께서 다시 알려주셨습니다.) * 배포된 소스파일을 열어 사용중인 코드와 비교하여 패치해 주시기 바랍니다. bbs/register_form.php /* if (!($member[mb_password] == sql_password($_POST[mb_password]) && $_POST[mb_password])) alert("패스워드가 틀립니다."); // 수정 후 다시 이 폼으로 돌아오기 위해 임시로 저장해 놓음 set_session("ss_tmp_password", $_POST[mb_password]); */ if ($_POST['mb_password']) { // 수정된 정보를 업데이트후 되돌아 온것이라면 패스워드가 암호화 된채로 넘어온것임 if ($_POST['is_update']) $tmp_password = $_POST['mb_password']; else $tmp_password = sql_password($_POST['mb_password']); if ($member['mb_password'] != $tmp_password) alert("패스워드가 틀립니다."); } bbs/register_form_update.php // 패스워드를 암호화하여 넘김 if ($mb_password) $tmp_password = sql_password($mb_password); else $tmp_password = get_session("ss_tmp_password"); ... 추가 4.33.10 (11.04.27) : [보안패치] 회원정보수정시 세션에 기록된 패스워드를 알아낼 수 있는 취약점이 발견되었습니다. (한국인터넷진흥원을 통하여 Null@Root 소속의 Hacker@n 님께서 알려주셨습니다.) : 게시판복사시 복사되는 게시판 테이블의 CHARSET 이 제대로 생성되지 않는 오류를 수정하였습니다. ( 밀로즈님께서 알려주셨습니다. ) bbs/register_form.php // 패스워드를 알아볼 수 없도록 회원가입일시를 넣어서 암호화 함 set_session("ss_tmp_password", base64_encode($member[mb_datetime].$_POST[mb_password])); bbs/register_form_update.php // 복호화를 한 후 회원가입일시를 없애주면 원래 패스워드가 나옴 $tmp_password = preg_replace("/^".$member[mb_datetime]."/", "", base64_decode(get_session("ss_tmp_password"))); lib/common.lib.php function get_table_define($table, $crlf="\n") { global $g4; ... if (strtolower($g4['charset']) == "utf-8") $schema_create .= $crlf . ') DEFAULT CHARSET=utf8'; else $schema_create .= $crlf . ')'; 4.33.09 (11.04.15) : 아래 두개의 취약점은 한국인터넷진흥원(KISA)을 통하여 선린인터넷고등학교 1학년에 재학중인 강인욱님께서 알려 주셨습니다. XSS 취약점 embed, object 태그를 막지 않는 경우의 우회적인 공격에 대한 취약점 lib/common.lib.php 의 두개 함수가 수정 되었습니다. function conv_content($content, $html) ... //$content = preg_replace("/(ex)(pression)/i", "ex$2", $content); ... // 이런 경우를 방지함 $content = preg_replace("#\/\*.*\*\/#iU", "", $content); $pattern = ""; $pattern .= "(e|&#(x65|101);?)"; $pattern .= "(x|&#(x78|120);?)"; $pattern .= "(p|&#(x70|112);?)"; $pattern .= "(r|&#(x72|114);?)"; $pattern .= "(e|&#(x65|101);?)"; $pattern .= "(s|&#(x73|115);?)"; $pattern .= "(s|&#(x73|115);?)"; $pattern .= "(i|&#(x6a|105);?)"; $pattern .= "(o|&#(x6f|111);?)"; $pattern .= "(n|&#(x6e|110);?)"; $content = preg_replace("/".$pattern."/i", "__EXPRESSION__", $content); ... function bad_tag_convert($code) ... if ($is_admin && $member[mb_id] != $view[mb_id]) { //$code = preg_replace_callback("#(\<(embed|object)[^\>]*)\>(\<\/(embed|object)\>)?#i", // embed 또는 object 태그를 막지 않는 경우 필터링이 되도록 수정 $code = preg_replace_callback("#(\<(embed|object)[^\>]*)\>?(\<\/(embed|object)\>)?#i", create_function('$matches', 'return "
보안문제로 인하여 관리자 아이디로는 embed 또는 object 태그를 볼 수 없습니다. 확인하시려면 관리권한이 없는 다른 아이디로 접속하세요.
";'), $code); } //return preg_replace("/\<([\/]?)(script|iframe)([^\>]*)\>/i", "<$1$2$3>", $code); // script 나 iframe 태그를 막지 않는 경우 필터링이 되도록 수정 return preg_replace("/\<([\/]?)(script|iframe)([^\>]*)\>?/i", "<$1$2$3>", $code); 4.33.08 (11.04.01) : 아래 두개의 취약점은 한국인터넷진흥원(KISA)을 통하여 선린인터넷고등학교 1학년에 재학중인 강인욱님께서 알려 주셨습니다. : [보안패치] XSS(Cross Site Scripting) 취약점 보완 이 취약점은 XML의 namespace를 이용하여 공격하는 방식입니다. 게시판에서 DHTML 에디터를 사용하지 않는 경우에만 취약한 것으로 확인 되었습니다. : [보안패치] RFI(Remote File Inclusion) 원격파일유입 취약점 보완 이 취약점은 관리자 권한을 취득한 후에 게시판 관리의 상단, 하단파일경로에 Data URI scheme (http://en.wikipedia.org/wiki/Data_URI_scheme) 를 이용하여 서버에 remote 파일을 생성하고 해당 remote 파일을 이용하여 해당 서버를 공격하는 방식입니다. PHP 5.x 이상 그리고 allow_url_fopen 이 On 인 경우에만 발생합니다. lib/common.lib.php $content = preg_replace("/\<(\w|\s|\?)*(xml)/i", "", $content); adm/board_form.php 관리자 패스워드 adm/board_form_update.php if ($member[mb_password] != sql_password($_POST['admin_password'])) { alert("패스워드가 다릅니다."); } 4.33.07 (11.03.22) : 트랙백 테이블 누락되어 있던것 추가 (웹스타일 님께서 알려 주셨습니다.) (거의 사용하지 않는 기능이므로 패치하지 않으셔도 무방합니다.) : 트랙백 메세지 출력시 한글 깨지던것 수정 bbs/write_update.php if ($msg) { echo "\n"; echo ""; } 4.33.06 (11.02.22) : [보안패치] 스팸글 등록으로 인한 자동등록방지 캡챠이미지 관련 코드 보완 기존에 PHPSESSID를 사용하였으나 사용자가 PHPSESSID 값을 쉽게 확인할수 있으므로 이것을 유추하여 자동등록방지 코드를 알아낼 수 있는 버그가 있었습니다. (jacobswell 님께서 알려 주셨습니다.) 사용자가 확인할수 없도록 코드를 수정하였으며 입력값이 5회이상 틀리면 다시 입력을 하도록 하였습니다. 참고) 스팸으로 인하여 피해를 입고 계시다면 회원제로 글쓰기 해주실것을 권해 드립니다. 비회원 글쓰기의 경우 프로그램 보다는 사람이 글을 올리는 것으로 확인 되었습니다. js/jquery.kcaptcha.js bbs/kcaptcha_session.php bbs/kcaptcha_result.php 4.33.05 의 이것(↓↓↓)은 적용하셔야 합니다. ------------------------------------------------------------------------- 기타) 기존 스킨에 대한 패치방법 ------------------------------------------------------------------------- if (typeof(f.wr_key) != 'undefined') { if (hex_md5(f.wr_key.value) != md5_norobot_key) { alert('자동등록방지용 글자가 제대로 입력되지 않았습니다.'); f.wr_key.select(); f.wr_key.focus(); return false; } } 위와 같은 코드를 if (!check_kcaptcha(f.wr_key)) { return false; } 이렇게 바꾸시면 됩니다. ------------------------------------------------------------------------- 4.33.05 (11.02.20) : [보안패치] 스팸글 등록으로 인한 자동등록방지 캡챠이미지 관련 코드 변경 요즈음의 그누보드 스팸등록기는 캡챠이미지 생성시 나오는 md5 값을 유추하여 원래 데이터(숫자)값을 알아내는 방법을 사용합니다. 쉽게 말씀드리자면 다음과 같습니다. md5 DB를 아래와 같이 구축해 놓습니다. 왼쪽은 md5 해시키이며 오른쪽은 원래 데이터 입니다. c4ca4238a0b923820dcc509a6f75849b = 1 c81e728d9d4c2f636f067f89cc14862c = 2 eccbc87e4b5ce2fe28308fd9f2a7baf3 = 3 ... 52c69e3a57331081823331c4e69d3f2e = 999999 가령 js/jquery.kcaptcha.js 의 md5_norobot_key 값이 52c69e3a57331081823331c4e69d3f2e 라면 md5 DB에서 52c69e3a57331081823331c4e69d3f2e 값을 찾아내어 원 데이터 999999 값을 알아낸다는 것이죠. (이것은 복호화가 아닙니다. 편법이죠. 어쨌든 뚫렸기 때문에 패치는 해야겠죠?) 그래서 이번 패치는 원래 데이터에 추가로 PHPSESSID 값을 넣어서 md5 DB 에서 값을 찾아낼 수 없도록 만들었습니다. js/jquery.kcaptcha.js bbs/kcaptcha_session.php skin/board/basic/write.skin.php skin/board/basic/view_comment.skin.php skin/member/basic/formmail.skin.php skin/member/basic/memo_form.skin.php skin/member/basic/password_lost.skin.php skin/member/basic/register_form.skin.php ------------------------------------------------------------------------- 기타) 기존 스킨에 대한 패치방법 ------------------------------------------------------------------------- if (typeof(f.wr_key) != 'undefined') { if (hex_md5(f.wr_key.value) != md5_norobot_key) { alert('자동등록방지용 글자가 제대로 입력되지 않았습니다.'); f.wr_key.select(); f.wr_key.focus(); return false; } } 위와 같은 코드를 if (!check_kcaptcha(f.wr_key)) { return false; } 이렇게 바꾸시면 됩니다. ------------------------------------------------------------------------- 4.33.04 (11.02.12) : 4.33.03 에서 common.php 에 보안패치한 코드는 오류가 많아 4.33.02 로 되돌립니다. : 4.33.03 의 adm/member_form.php 에 패치한 코드에 오류가 있었습니다. common.php if (isset($sca)) { $sca = mysql_real_escape_string($sca); $qstr .= '&sca=' . urlencode($sca); } if (isset($sfl)) { $sfl = mysql_real_escape_string($sfl); $qstr .= '&sfl=' . urlencode($sfl); // search field (검색 필드) } if (isset($stx)) { // search text (검색어) $stx = mysql_real_escape_string($stx); $qstr .= '&stx=' . urlencode($stx); } if (isset($sst)) { $sst = mysql_real_escape_string($sst); $qstr .= '&sst=' . urlencode($sst); // search sort (검색 정렬 필드) } adm/member_form.php 4.33.03 (11.02.10) : 회원권한 코드 수정 (코타군님) : 글읽기 포인트가 설정되어 있을때 글읽기 레벨이 1로 설정되어 있으면 포인트 차감이 제대로 되지 않던 오류 수정 (forever님, 진서기님) : [보안패치] SQL INJECTION 공격에 대비한 코드 수정 (개미인간님) adm/member_form.php bbs/board.php if (!get_session($ss_name)) { sql_query(" update $write_table set wr_hit = wr_hit + 1 where wr_id = '$wr_id' "); // 자신의 글이면 통과 if ($write[mb_id] && $write[mb_id] == $member[mb_id]) { ; } else if ($is_guest && $board[bo_read_level] == 1 && $write[wr_ip] == $_SERVER['REMOTE_ADDR']) { // 비회원이면서 읽기레벨이 1이고 등록된 아이피가 같다면 자신의 글이므로 통과 ; } else { /* // 회원이상 글읽기가 가능하다면 if ($board[bo_read_level] > 1) { if ($member[mb_point] + $board[bo_read_point] < 0) alert("보유하신 포인트(".number_format($member[mb_point]).")가 없거나 모자라서 글읽기(".number_format($board[bo_read_point]).")가 불가합니다.\\n\\n포인트를 모으신 후 다시 글읽기 해 주십시오."); insert_point($member[mb_id], $board[bo_read_point], "$board[bo_subject] $wr_id 글읽기", $bo_table, $wr_id, '읽기'); } */ // 글읽기 포인트가 설정되어 있다면 if ($board[bo_read_point] && $member[mb_point] + $board[bo_read_point] < 0) alert("보유하신 포인트(".number_format($member[mb_point]).")가 없거나 모자라서 글읽기(".number_format($board[bo_read_point]).")가 불가합니다.\\n\\n포인트를 모으신 후 다시 글읽기 해 주십시오."); insert_point($member[mb_id], $board[bo_read_point], "$board[bo_subject] $wr_id 글읽기", $bo_table, $wr_id, '읽기'); } set_session($ss_name, TRUE); } common.php if (isset($sca)) { $sca = preg_replace("/([\'\"\`\<\>\(\)\;\/~@?=%&!]+)/", "", $sca); $qstr .= '&sca=' . urlencode($sca); } if (isset($sfl)) { $sfl = preg_replace("/([\'\"\`\<\>\(\)\;\/~@?=%&!]+)/", "", $sfl); $qstr .= '&sfl=' . urlencode($sfl); // search field (검색 필드) } if (isset($stx)) { // search text (검색어) $stx = preg_replace("/([\'\"\`\<\>\(\)\;\/~@?=%&!]+)/", "", $stx); $qstr .= '&stx=' . urlencode($stx); } if (isset($sst)) { $sst = preg_replace("/([\'\"\`\<\>\(\)\;\/~@?=%&!]+)/", "", $sst); $qstr .= '&sst=' . urlencode($sst); // search sort (검색 정렬 필드) } 4.33.02 (11.01.24) : [보안패치] LFI(Local File Include ) LFI 취약점이 발견되어 수정한 코드입니다. (SK인포섹 장경칩님) common.php if ($_GET['g4_path'] || $_POST['g4_path'] || $_COOKIE['g4_path']) { ... } 위 코드만 수정 되었습니다. 4.33.01 (11.01.10) : [보안패치] XSS / CSRF 4.33.00 에 object 태그로도 플래시를 실행할 수 없도록 수정한 코드입니다. (아갈갤러리님) lib/common.lib.php 의 bad_tag_convert() 함수 코드만 수정 4.33.00 (11.01.06) : [보안패치] XSS / CSRF FLASH 파일의 ACTION SCRIPT로 관리자의 세션값을 알아내고 공유하여 결국에는 관리자권한을 모두 갖게 되는 치명적인 오류가 발견 되었습니다. (간단하게 말해서 플래시를 보는것만으로 세션값이 노출됩니다.) 이것은 해커가 관리권한을 공유하는 것으로 관리자의 패스워드가 노출된것은 아닙니다. 패치의 주된 내용은 게시판의 다른 회원이 올린 embed 태그는 관리자에게 보여지지 않게 하는 것입니다. 또한, 세션키가 공개되더라도 관리자 페이지에서 직접 로그인한 관리자인지를 이중으로 체크합니다. 기본환경설정, 관리권한설정, 회원관리, 포인트관리에는 관리자 패스워드를 다시 물어서 관리권한을 완전히 넘겨주지 않도록 하였습니다. 이것과 관련된 자세한 내용은 보안뉴스의 내용을 참고하십시오. http://www.boannews.com/media/view.asp?idx=24280&kind=1 (i2Sec 교육팀 강성호님께서 알려주신 내용입니다.) 아래 패치를 모두 적용하기 힘든 사이트는 중요라고 되어 있는 파일만 수정해 주시기 바랍니다. === 중요 === lib/common.lib.php 의 bad_tag_convert(), view_file_link() 함수 코드 수정 skin/board/basic/view_comment.skin.php 의 $str = preg_replace("/\[\\]/i", "", $str); 위 코드 제거 또는 주석처리 bbs/login_check.php 에 ss_mb_key 세션키 추가 adm/admin.lib.php 에서 ss_mb_key 비교 === /중요 === adm/config_form.php adm/config_form_update.php adm/auth_list.php adm/auth_update.php adm/member_form.php adm/member_form_update.php adm/point_list.php adm/point_update.php 4.32.15 (10.12.28) : [보안패치] $write_table 변수값 초기화 (몽구스님) common.php 4.32.14 (10.12.07) : 글쓰기, 코멘트쓰기 메일 발송 코드 수정 : 코멘트쓰기 포인트설정시 회원의 포인트가 음수인 경우 코멘트를 쓰지 못하던 버그를 수정 (곱슬최씨님) : 우편번호 파일 변경 (2010년 11월 19일자) - 배추빌더의 우편번호 파일을 적용 (곱슬최씨님) bbs/write_update.php bbs/write_comment_update.php bbs/zip.db 4.32.13 (10.11.02) : [보안패치] 비밀글을 무조건 사용으로 설정한 경우 관리자 이외에는 비밀글을 해제하지 못하도록 수정 (난폭탄님께서 알려 주셨습니다.) : [보안패치] 다른사람의 글을 수정할 수 있는 버그 수정 (난폭탄님께서 알려 주셨습니다.) : 회원정보수정시 정보공개 설정 문구 변경 (곱슬최씨님께서 요청해 주셨습니다.) bbs/write_update.php skin/member/basic/register_form.skin.php 4.32.12 (10.10.21) : [보안패치] 특정 회원에게 동일한 내용의 스팸 쪽지가 온다면 패치하시기 바랍니다. : 쪽지의 전송방식을 POST 로만 전송하도록 수정 : 쪽지전송시 자동등록방지 코드를 적용하여 CSRF를 방지하였습니다. bbs/memo_form_update.php skin/member/basic/memo_form.skin.php 4.32.11 (10.09.11) : [보안패치] 반드시 패치하시기 바랍니다. 자동로그인 기능에 심각한 버그가 존재합니다. common.php 의 코드를 아래와 같이 수정해 주십시오. if ($tmp_mb_id = get_cookie("ck_mb_id")) { $tmp_mb_id = substr(preg_replace("/[^a-zA-Z0-9_]*/", "", $tmp_mb_id), 0, 20); // 최고관리자는 자동로그인 금지 if ($tmp_mb_id != $config['cf_admin']) { $sql = " select mb_password, mb_intercept_date, mb_leave_date, mb_email_certify from {$g4['member_table']} where mb_id = '{$tmp_mb_id}' "; common.php 4.32.10 (10.09.07) : 아이디/패스워드 찾기 코드 보완 (보안서버 적용 등) 기존에 사용하던 password_forget 을 더 이상 사용하지 않으며 password_lost 로 대체합니다. 회원가입시 패스워드 분실시 질문, 답변을 더 이상 입력 받지 않습니다. bbs/password_lost.php bbs/password_lost2.php bbs/password_lost_certify.php skin/member/basic/password_lost.skin.php skin/member/basic/register_form.skin.php skin/member/basic/login.skin.php : win_password_forget() -> win_password_lost() 로 대체 skin/outlogin/basic/outlogin.skin.1.php : win_password_forget() -> win_password_lost() 로 대체 js/common.js : function win_password_lost() 추가 // 위의 패치를 적용하신 후 아래 3개의 파일은 반드시 삭제하시기 바랍니다. bbs/password_forget.php bbs/password_forget2.php bbs/password_forget3.php 4.32.09 (10.09.07) : 게시판에서 \ 를 검색할 수 있도록 수정 (애나양님께서 알려주셨습니다.) lib/common.lib.php : $search_text = trim(stripslashes($search_text)); 로 변경 skin/board/basic/list.skin.php : value='' 로 변경 4.32.08 (10.08.25) : url_auto_link() 함수 코드 보완 lib/common.lib.php 4.32.07 (10.08.23) : [보안] XSS(Cross Site Scripting) 공격에 의한 데이터 검증 및 차단 기능을 보완하였습니다. (sjsjin 님께서 알려주셨습니다.) : 회원의 포인트가 0 미만일 경우 게시판의 글쓰기 포인트가 설정된 경우에 나오던 오류를 수정 (곱슬최씨님께서 다시 알려 주셨습니다.) : 회원가입의 약관선택시 checkbox 에서 radio 선택으로 변경하였습니다. (한국인터넷진흥원 권고) : 회원가입의 생일 날짜선택시 달력을 jquery datepicker로 사용하도록 수정 common.php bbs/write.php skin/member/basic/register.skin.php skin/member/basic/register_form.skin.php 4.32.06 (10.08.09) : [보안] XSS(Cross Site Scripting) 공격에 의한 데이터 검증 및 차단 (sjsjin 님께서 알려주셨습니다.) : 글쓰기, 코멘트쓰기시 욕 단어 필터링 버그 수정 (유창화님, 불당님께서 알려주셨습니다.) common.php skin/board/basic/ajax.filter.php 4.32.05 (10.07.26) : 우편번호 2010년 7월 22일자 반영 (51,031건) : 글쓰기, 코멘트쓰기시 욕 단어 필터링이 외부에서 보이지 않도록 AJAX 처리함 : 게시판관리에서 게시판복사시 서브디렉토리도 복사가 가능하도록 수정 (김선용님께서 코드를 알려 주셨습니다.) : 받은쪽지를 타인이 읽은 상태로 변경할 수 있는 오류 수정 (유아원님께서 알려주셨습니다.) adm/board_copy_update.php bbs/memo_view.php bbs/view_comment.php bbs/write.php bbs/zip.db skin/board/basic/ajax.filter.php skin/board/basic/view_comment.skin.php skin/board/basic/write.skin.php 4.32.04 (10.07.02) : 게시판 이전, 다음 검색시 1페이지로 이동하도록 수정 (intel님께서 알려주셨습니다.) : 파일명에 특수문자가 들어간 경우 다운로드 되지 않던 오류 수정 (곱슬최씨님께서 알려주셨습니다.) : 게시판에서 두단어 이상 검색 후 검색된 게시물에 코멘트를 남기면 나오던 오류 수정 (곱슬최씨님께서 알려주셨습니다.) : $g4[https_url] 을 지정한 경우 도메인 이외의 추가 경로를 사용하면 로그인시 나던 오류를 수정 bbs/view.php bbs/list.php lib/common.lib.php skin/member/basic/login.skin.php skin/outlogin/basic/outlogin.skin.1.php 4.32.03 (10.04.30) : 코멘트 답변시 캡챠이미지, 입력박스 체크가 제대로 표시되지 않던 오류 수정 : 회원의 포인트가 0 미만일 경우 게시판의 글쓰기 포인트가 설정된 경우에 나오던 오류를 수정 (곱슬최씨님께서 알려 주셨습니다.) : 회원메일발송에서 게시판그룹선택시 해당 게시판그룹에 속한 회원이 한명도 없는 경우 나오던 SQL 오류 수정 (웹스타일님께서 알려주셨습니다.) adm/mail_select_list.php bbs/write.php skin/board/basic/view_comment.skin.php 4.32.02 (10.03.16) : 로그인 중인 관리자 레벨 수정시 버그 수정 : 회원가입시 별명에서 한글을 제대로 인식하지 못하는 버그 수정 adm/member_form_update.php skin/member/basic/ajax_mb_nick_check.php skin/member/basic/ajax_register_form.jquery.js 4.32.01 (10.03.12) : 다양한 플러그인을 사용할 수 있도록 prototype.js 에서 jquery.js 로 대체합니다. 기존 코드를 유지하기 위하여 js/prototype.js 는 삭제하지 않습니다. : 2010년 2월 25일자 우편번호로 변경 (곱슬최씨님께서 올려주신 자료입니다.) : 게시판관리에 cheditor 기능 추가 head.sub.php adm/board_form.php adm/config_form.php bbs/zip.db js/jquery-1.4.2.min.js js/jquery.kcaptcha.js skin/board/basic/view_comment.skin.php skin/board/basic/write.skin.php skin/member/basic/ajax_register_form.jquery.js skin/member/basic/formmail.skin.php skin/member/basic/password_forget2.skin.php skin/member/basic/register_form.skin.php 4.31.15 (10.02.08) : 회원삭제시 주민등록번호도 공란으로 수정 function member_delete($mb_id) { ... mb_jumin = '', ... : 접속자현황 OS에 Windows7 추가 (Justin님께서 알려주셨습니다.) : POSIX Regex 함수 제거 ( ereg_replace, ereg, eregi_replace, eregi, split, spliti, sql_regcase ) 이 기능은 PHP 5.3.0 부터 배제되고 PHP 6.0.0 부터 제거됩니다. 이 기능에 의존하지 않기를 권합니다. : 기본시간대를 설정 PHP 5.1 부터 가능 date_default_timezone_set() : 2009년 제4차 우편번호 변경내역 (2009.12.16.자 : 50,742건) http://www.zipfinder.co.kr : password_check.php 의 $qstr 에 $sop 추가 : js/common.js 의 del() 함수에 charset 별로 처리되도록 수정 adm/admin.lib.php adm/board_copy_update.php adm/board_form_update.php adm/boardgroup_form_update.php adm/mail_select_update.php bbs/download.php bbs/list.php bbs/password_check.php bbs/zip.db cheditor4/imageupload-class.php config.php js/common.js lib/common.lib.php lib/mailer.lib.php lib/visit.lib.php 4.31.14 (09.10.15) : 관리자 게시판 등록시 상,하단 이미지, 상, 하단 파일 경로를 통한 보안 취약점 수정 (로빈아빠 님 091015) adm/board_form_update.php 4.31.13 (09.10.14) : utf-8 버전에서 게시판분류 선택시 제대로 검색되지 않는 오류 수정 skin/board/basic/list.skin.php 의 ;"> 와 같이 수정하십시오. : 한글로 검색후 검색된 글을 삭제하고 다시 목록으로 돌아올때 한글이 깨지는 오류를 수정 (진념님 090930) bbs/view.php 의 $delete_href = "javascript:del('./delete.php?bo_table=$bo_table&wr_id=$wr_id&page=$page".$qstr."');"; 를 $delete_href = "javascript:del('./delete.php?bo_table=$bo_table&wr_id=$wr_id&page=$page".urldecode($qstr)."');"; 로 수정하십시오. : 2009년 제3차 우편번호 변경내역 (2009.09.29.자 : 50,554건) http://www.zipfinder.co.kr skin/board/basic/list.skin.php bbs/view.php bbs/zip.db 4.31.12 (09.09.25) : 접속자현황 접속경로에 게시판스킨의 write.skin.php : 게시판설정 > 수정시 공지사항 없어지던 오류를 수정 adm/board_form_update.php : 투표리스트에서 링크 수정 박규석(nosty)님께서 알려 주셨습니다. adm/poll_list.php : 게시판설정 > 수정시 가로이미지수 필드 오류 수정 강남호(namo)님께서 알려 주셨습니다. adm/board_form_update.php : 게시판설정에서 HTML 쓰기 권한 수정 바리미(koxel)님께서 알려 주셨습니다. adm/board_form.php : 게시판설정에서 스킨 디렉토리 반드시 설정하도록 수정 adm/board_form.php : allow_url_fopen = Off 일 경우 트랙백 오류나던 부분을 수정 (소켓 사용) lib/trackback.lib.php 05.04.28 : 포인트 변환시 오류 수정 convert/g3_member.php 05.04.28 : 정식버전 배포 (안정버전 아님) 05.04.28 : 불여우에서 회원정보수정 후 정지하던것을 수정 : 그누보드3 게시판자료 변환 프로그램 추가 convert/g3_board.php : MySQL 관리툴 phpMyAdmin 2.6.2 탑재 05.04.27 : 설치시 implode() 인수 갯수 오류 수정 : 그누보드3 회원자료 변환 프로그램 추가 convert/g3_member.php 05.04.26 : 코멘트 몇건 이상 등록시 원글 수정, 삭제 불가 기능 추가 : 게시판 생성 기능 추가 : 게시판에 상, 하단 이미지 업로드 기능 추가 : 별명 변경 후 설정일 동안 별명 변경하지 못하는 기능 추가 : 새글 리스트에 분류검색 기능 추가 : 전체검색에 분류검색 기능 추가 05.04.25 : bbs/zip2.php 삭제 (새창에서 상세주소를 입력받지 않음) 05.04.24 : 카페24 에서 설치 되지 않던 문제와 설치시 Unknown table 'g4_board' 오류 수정 05.04.22 : 그룹접근 사용에 따른 글목록 보기 차단 기능 추가 : 그룹접근 사용에 따른 검색 차단 기능 추가 : 최고관리자는 포인트 추가 내역 남기지 않음 05.04.21 : 게시판 테이블의 wr_option 에서 set(html, htmlbr) 을 set(html1, html2) 로 변경 : 관리자 > 회원정보 수정시 오류 수정 : 회원가입시 추천인 아이디 입력 부분 수정 : common.lib.php 의 insert_point() 함수에서 회원아이디를 찾아 없으면 return 함 : 전체 검색 수정 : 게시판 검색에서 검색어에 색상 출력 : common.lib.php 의 search_font() 함수에서 검색어가 없는 경우 return 함 05.04.21 오픈 베타 2 배포 05.03.29 베타 1 배포 그누보드4 이력 ↑ ================================================================================ 그누보드4 주요기능 -------------------------------------------------------------------------------- 1. 가변 파일 업로드 지원 2. 관리자 페이지에 가변적으로 메뉴 추가 가능 3. 관리자 메뉴별 접근 기능 4. 트랙백 기능 5. 최근게시물 지원으로 게시판이 많아도 새글을 확인할 수 있음 6. 로봇에 의한 글쓰기 차단 기능 7. RSS 8. 게시판별로 포인트 점수를 다르게 부여할 수 있음 9. 회원가입시 이메일 본인인증 가능 10. 그외 다수 -------------------------------------------------------------------------------- 알려진 버그 -------------------------------------------------------------------------------- 1. 코멘트가 검색에 포함된 경우 목록에서 정렬(조회순 등등)이 제대로 되지 않습니다. ================================================================================