From 5924798d87ad0544c39facba66995902b3e03162 Mon Sep 17 00:00:00 2001 From: "Namhyeon, Go" Date: Wed, 11 Apr 2018 02:32:22 +0900 Subject: [PATCH] Delete gnuboard.lib.php --- helper/gnuboard.lib.php | 1613 --------------------------------------- 1 file changed, 1613 deletions(-) delete mode 100644 helper/gnuboard.lib.php diff --git a/helper/gnuboard.lib.php b/helper/gnuboard.lib.php deleted file mode 100644 index 6d9563f..0000000 --- a/helper/gnuboard.lib.php +++ /dev/null @@ -1,1613 +0,0 @@ - - * @brief Helper Library for Gnuboard CMS (4/5), Content Driver for VerySimplePHPFramework - */ - -/************************************************************************* -** -** 일반 함수 모음 -** -*************************************************************************/ - -// 마이크로 타임을 얻어 계산 형식으로 만듦 -function gb_get_microtime() -{ - list($usec, $sec) = explode(" ",microtime()); - return ((float)$usec + (float)$sec); -} - -// 현재페이지, 총페이지수, 한페이지에 보여줄 행, URL -function gb_get_paging($write_pages, $cur_page, $total_page, $url, $add="") -{ - $str = ""; - if ($cur_page > 1) { - $str .= "처음"; - //$str .= "[이전]"; - } - - $start_page = ( ( (int)( ($cur_page - 1 ) / $write_pages ) ) * $write_pages ) + 1; - $end_page = $start_page + $write_pages - 1; - - if ($end_page >= $total_page) $end_page = $total_page; - - if ($start_page > 1) $str .= "  이전"; - - if ($total_page > 1) { - for ($k=$start_page;$k<=$end_page;$k++) { - if ($cur_page != $k) - $str .= "  $k"; - else - $str .= "  $k "; - } - } - - if ($total_page > $end_page) $str .= "  다음"; - - if ($cur_page < $total_page) { - //$str .= "[다음]"; - $str .= "  맨끝"; - } - $str .= ""; - - return $str; -} - - -// 변수 또는 배열의 이름과 값을 얻어냄. print_r() 함수의 변형 -function gb_print_r2($var) -{ - ob_start(); - print_r($var); - $str = ob_get_contents(); - ob_end_clean(); - $str = preg_replace("/ /", " ", $str); - echo nl2br("$str"); -} - - -// 메타태그를 이용한 URL 이동 -// header("location:URL") 을 대체 -function gb_goto_url($url) -{ - echo ""; - exit; -} - - -// 세션변수 생성 -function gb_set_session($session_name, $value) -{ - if (PHP_VERSION < '5.3.0') - session_register($session_name); - // PHP 버전별 차이를 없애기 위한 방법 - $$session_name = $_SESSION["$session_name"] = $value; -} - - -// 세션변수값 얻음 -function gb_get_session($session_name) -{ - return $_SESSION[$session_name]; -} - - -// 쿠키변수 생성 -function gb_set_cookie($cookie_name, $value, $expire) -{ - global $g4; - - setcookie(md5($cookie_name), base64_encode($value), $g4[server_time] + $expire, '/', $g4[cookie_domain]); -} - - -// 쿠키변수값 얻음 -function gb_get_cookie($cookie_name) -{ - return base64_decode($_COOKIE[md5($cookie_name)]); -} - - -// 경고메세지를 경고창으로 -function gb_alert($msg='', $url='') -{ - global $g4; - - if (!$msg) $msg = '올바른 방법으로 이용해 주십시오.'; - - //header("Content-Type: text/html; charset=$g4[charset]"); - echo ""; - echo ""; - if ($url) - // 4.06.00 : 불여우의 경우 아래의 코드를 제대로 인식하지 못함 - //echo ""; - goto_url($url); - exit; -} - - -// 경고메세지 출력후 창을 닫음 -function gb_alert_close($msg) -{ - global $g4; - - echo ""; - echo ""; - exit; -} - - -// way.co.kr 의 wayboard 참고 -function gb_url_auto_link($str) -{ - global $g4; - global $gb_config; - - // 속도 향상 031011 - $str = preg_replace("/</", "\t_lt_\t", $str); - $str = preg_replace("/>/", "\t_gt_\t", $str); - $str = preg_replace("/&/", "&", $str); - $str = preg_replace("/"/", "\"", $str); - $str = preg_replace("/ /", "\t_nbsp_\t", $str); - $str = preg_replace("/([^(http:\/\/)]|\(|^)(www\.[^[:space:]]+)/i", "\\1\\2", $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); - // 100825 : () 추가 - // 120315 : CHARSET 에 따라 링크시 글자 잘림 현상이 있어 수정 - 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); - } - // 이메일 정규표현식 수정 061004 - //$str = preg_replace("/(([a-z0-9_]|\-|\.)+@([^[:space:]]*)([[:alnum:]-]))/i", "\\1", $str); - $str = preg_replace("/([0-9a-z]([-_\.]?[0-9a-z])*@[0-9a-z]([-_\.]?[0-9a-z])*\.[a-z]{2,4})/i", "\\1", $str); - $str = preg_replace("/\t_nbsp_\t/", " " , $str); - $str = preg_replace("/\t_lt_\t/", "<", $str); - $str = preg_replace("/\t_gt_\t/", ">", $str); - - return $str; -} - - -// url에 http:// 를 붙인다 -function gb_set_http($url) -{ - if (!trim($url)) return; - - if (!preg_match("/^(http|https|ftp|telnet|news|mms)\:\/\//i", $url)) - $url = "http://" . $url; - - return $url; -} - - -// 파일의 용량을 구한다. -//function gb_get_filesize($file) -function gb_get_filesize($size) -{ - //$size = @filesize(addslashes($file)); - if ($size >= 1048576) { - $size = number_format($size/1048576, 1) . "M"; - } else if ($size >= 1024) { - $size = number_format($size/1024, 1) . "K"; - } else { - $size = number_format($size, 0) . "byte"; - } - return $size; -} - - -// 게시글에 첨부된 파일을 얻는다. (배열로 반환) -function gb_get_file($bo_table, $wr_id) -{ - global $g4, $qstr; - - $file["count"] = 0; - $sql = " select * from $g4[board_file_table] where bo_table = '$bo_table' and wr_id = '$wr_id' order by bf_no "; - $result = sql_query($sql); - while ($row = gb_sql_fetch_array($result)) - { - $no = $row[bf_no]; - $file[$no][href] = "./download.php?bo_table=$bo_table&wr_id=$wr_id&no=$no" . $qstr; - $file[$no][download] = $row[bf_download]; - // 4.00.11 - 파일 path 추가 - $file[$no][path] = "$g4[path]/data/file/$bo_table"; - //$file[$no][size] = get_filesize("{$file[$no][path]}/$row[bf_file]"); - $file[$no][size] = get_filesize($row[bf_filesize]); - //$file[$no][datetime] = date("Y-m-d H:i:s", @filemtime("$g4[path]/data/file/$bo_table/$row[bf_file]")); - $file[$no][datetime] = $row[bf_datetime]; - $file[$no][source] = addslashes($row[bf_source]); - $file[$no][bf_content] = $row[bf_content]; - $file[$no][content] = get_text($row[bf_content]); - //$file[$no][view] = view_file_link($row[bf_file], $file[$no][content]); - $file[$no][view] = view_file_link($row[bf_file], $row[bf_width], $row[bf_height], $file[$no][content]); - $file[$no][file] = $row[bf_file]; - // prosper 님 제안 - //$file[$no][imgsize] = @getimagesize("{$file[$no][path]}/$row[bf_file]"); - $file[$no][image_width] = $row[bf_width] ? $row[bf_width] : 640; - $file[$no][image_height] = $row[bf_height] ? $row[bf_height] : 480; - $file[$no][image_type] = $row[bf_type]; - $file["count"]++; - } - - return $file; -} - - -// 폴더의 용량 ($dir는 / 없이 넘기세요) -function gb_get_dirsize($dir) -{ - $size = 0; - $d = dir($dir); - while ($entry = $d->read()) { - if ($entry != "." && $entry != "..") { - $size += filesize("$dir/$entry"); - } - } - $d->close(); - return $size; -} - - -/************************************************************************* -** -** 그누보드 관련 함수 모음 -** -*************************************************************************/ - - -// 게시물 정보($write_row)를 출력하기 위하여 $list로 가공된 정보를 복사 및 가공 -function gb_get_list($write_row, $board, $skin_path, $subject_len=40) -{ - global $g4, $gb_config; - global $qstr, $page; - - //$t = get_microtime(); - - // 배열전체를 복사 - $list = $write_row; - unset($write_row); - - $list['is_notice'] = preg_match("/[^0-9]{0,1}{$list['wr_id']}[\r]{0,1}/",$board['bo_notice']); - - if ($subject_len) - $list['subject'] = conv_subject($list['wr_subject'], $subject_len, "…"); - else - $list['subject'] = conv_subject($list['wr_subject'], $board['bo_subject_len'], "…"); - - // 목록에서 내용 미리보기 사용한 게시판만 내용을 변환함 (속도 향상) : kkal3(커피)님께서 알려주셨습니다. - if ($board['bo_use_list_content']) - { - $html = 0; - if (strstr($list['wr_option'], "html1")) - $html = 1; - else if (strstr($list['wr_option'], "html2")) - $html = 2; - - $list['content'] = conv_content($list['wr_content'], $html); - } - - $list['comment_cnt'] = ""; - if ($list['wr_comment']) - $list['comment_cnt'] = "($list[wr_comment])"; - - // 당일인 경우 시간으로 표시함 - $list['datetime'] = substr($list['wr_datetime'],0,10); - $list['datetime2'] = $list['wr_datetime']; - if ($list['datetime'] == $g4['time_ymd']) - $list['datetime2'] = substr($list['datetime2'],11,5); - else - $list['datetime2'] = substr($list['datetime2'],5,5); - // 4.1 - $list['last'] = substr($list['wr_last'],0,10); - $list['last2'] = $list['wr_last']; - if ($list['last'] == $g4['time_ymd']) - $list['last2'] = substr($list['last2'],11,5); - else - $list['last2'] = substr($list['last2'],5,5); - - $list['wr_homepage'] = get_text(addslashes($list['wr_homepage'])); - - $tmp_name = get_text(cut_str($list['wr_name'], $gb_config['cf_cut_name'])); // 설정된 자리수 만큼만 이름 출력 - if ($board['bo_use_sideview']) - $list['name'] = get_sideview($list['mb_id'], $tmp_name, $list['wr_email'], $list['wr_homepage']); - else - $list['name'] = "$tmp_name"; - - $reply = $list['wr_reply']; - - $list['reply'] = ""; - if (strlen($reply) > 0) - { - for ($k=0; $k= date("Y-m-d H:i:s", $g4['server_time'] - ($board['bo_new'] * 3600))) - $list['icon_new'] = ""; - - $list['icon_hot'] = ""; - if ($list['wr_hit'] >= $board['bo_hot']) - $list['icon_hot'] = ""; - - $list['icon_secret'] = ""; - if (strstr($list['wr_option'], "secret")) - $list['icon_secret'] = ""; - - // 링크 - for ($i=1; $i<=$g4['link_count']; $i++) - { - $list['link'][$i] = set_http(get_text($list["wr_link{$i}"])); - $list['link_href'][$i] = "$g4[bbs_path]/link.php?bo_table=$board[bo_table]&wr_id=$list[wr_id]&no=$i" . $qstr; - $list['link_hit'][$i] = (int)$list["wr_link{$i}_hit"]; - } - - // 가변 파일 - $list['file'] = get_file($board['bo_table'], $list['wr_id']); - - if ($list['file']['count']) - $list['icon_file'] = ""; - - return $list; -} - -// get_list 의 alias -function gb_get_view($write_row, $board, $skin_path, $subject_len=125) -{ - return get_list($write_row, $board, $skin_path, $subject_len); -} - - -// set_search_font(), get_search_font() 함수를 search_font() 함수로 대체 -function gb_search_font($stx, $str) -{ - global $gb_config; - - // 문자앞에 \ 를 붙입니다. - $src = array("/", "|"); - $dst = array("\/", "\|"); - - if (!trim($stx)) return $str; - - // 검색어 전체를 공란으로 나눈다 - $s = explode(" ", $stx); - - // "/(검색1|검색2)/i" 와 같은 패턴을 만듬 - $pattern = ""; - $bar = ""; - for ($m=0; $m)"; - $bar = "|"; - } - - // 지정된 검색 폰트의 색상, 배경색상으로 대체 - $replace = "\\1"; - - return preg_replace("/($pattern)/i", $replace, $str); -} - - -// 제목을 변환 -function gb_conv_subject($subject, $len, $suffix="") -{ - return cut_str(get_text($subject), $len, $suffix); -} - -// OBJECT 태그의 XSS 막기 -function gb_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]; -} - -// tag 내의 주석문 무효화 하기 -function gb_bad130128($matches) -{ - $str = $matches[2]; - return '<'.$matches[1].preg_replace('#(\/\*|\*\/)#', '', $str).'>'; -} - -// 내용을 변환 -function gb_conv_content($content, $html) -{ - global $gb_config, $board; - - if ($html) - { - $source = array(); - $target = array(); - - $source[] = "//"; - $target[] = ""; - - if ($html == 2) { // 자동 줄바꿈 - $source[] = "/\n/"; - $target[] = "
"; - } - - // 테이블 태그의 갯수를 세어 테이블이 깨지지 않도록 한다. - $table_begin_count = substr_count(strtolower($content), "]+)>/s", 'bad130128', $content); - - $content = preg_replace($source, $target, $content); - - // XSS (Cross Site Script) 막기 - // 완벽한 XSS 방지는 없다. - - // 이런 경우를 방지함 - //$content = preg_replace("#\/\*.*\*\/#iU", "", $content); - // 위의 정규식이 아래와 같은 내용을 통과시키므로 not greedy(비탐욕수량자?) 옵션을 제거함. ignore case 옵션도 필요 없으므로 제거 - // - $content = preg_replace("#\/\*.*\*\/#", "", $content); - - // object, embed 태그에서 javascript 코드 막기 - $content = preg_replace_callback("#<(object|embed)([^>]+)>#i", "bad120422", $content); - - $content = preg_replace("/(on)([a-z]+)([^a-z]*)(\=)/i", "on$2$3$4", $content); - $content = preg_replace("/(dy)(nsrc)/i", "dy$2", $content); - $content = preg_replace("/(lo)(wsrc)/i", "lo$2", $content); - //$content = preg_replace("/(sc)(ript)/i", "sc$2", $content); - $content = preg_replace_callback("#<([^>]+)#", create_function('$m', 'return "<".str_replace("<", "<", $m[1]);'), $content); - //$content = preg_replace("/\<(\w|\s|\?)*(xml)/i", "", $content); - $content = preg_replace("/\<(\w|\s|\?)*(xml)/i", "_$1$2_", $content); - - // 플래시의 액션스크립트와 자바스크립트의 연동을 차단하여 악의적인 사이트로의 이동을 막는다. - // value="always" 를 value="never" 로, allowScriptaccess="always" 를 allowScriptaccess="never" 로 변환하는데 목적이 있다. - //$content = preg_replace("/((?<=\]+)(\s*=\s*[\'\"]?)always([\'\"]?)([^>]+(?=\>))/i", "$1$2never$3$4", $content); - // allowscript 속성의 param 태그를 삭제한다. - //$content = preg_replace("#(]+>)(<\/param>)?#i", "", $content); - $content = preg_replace("#]+AllowScriptAccess[^>]+>(<\/param>)?#i", "", $content); - // embed 태그의 allowscript 속성을 삭제한다. - //$content = preg_replace("#(]+)#i", "$1", $content); - $content = preg_replace("#(]+)(allowscriptaccess[^\s\>]+)#i", "$1", $content); - // object 태그에 allowscript 의 값을 never 로 하여 태그를 추가한다. - $content = preg_replace("#(]+>)#i", "$1", $content); - // embed 태그에 allowscrpt 값을 never 로 하여 속성을 추가한다. - $content = preg_replace("#(]+)#i", "$1 allowscriptaccess=\"never\"", $content); - - // 이미지 태그의 src 속성에 삭제등의 링크가 있는 경우 게시물을 확인하는 것만으로도 데이터의 위변조가 가능하므로 이것을 막음 - $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); - $content = preg_replace("/<(img[^>]+download\.php[^>]+bo_table[^>]+)/i", "*** CSRF 감지 : <$1", $content); - - $content = preg_replace_callback("#style\s*=\s*[\"\']?[^\"\']+[\"\']?#i", - create_function('$matches', 'return str_replace("\\\\", "", stripslashes($matches[0]));'), $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 .= "(i|&#(x69|105);?)"; - $pattern .= "(o|&#(x6f|111);?)"; - $pattern .= "(n|&#(x6e|110);?)"; - //$content = preg_replace("/".$pattern."/i", "__EXPRESSION__", $content); - $content = preg_replace("/<[^>]*".$pattern."/i", "__EXPRESSION__", $content); - // 와 같은 코드에 취약점이 있어 수정함. 121213 - $content = preg_replace("/(?<=style)(\s*=\s*[\"\']?xss\:)/i", '="__XSS__', $content); - $content = bad_tag_convert($content); - } - else // text 이면 - { - // & 처리 : &   등의 코드를 정상 출력함 - $content = html_symbol($content); - - // 공백 처리 - //$content = preg_replace("/ /", "  ", $content); - $content = str_replace(" ", "  ", $content); - $content = str_replace("\n ", "\n ", $content); - - $content = get_text($content, 1); - - $content = url_auto_link($content); - } - - return $content; -} - - -// 검색 구문을 얻는다. -function gb_get_sql_search($search_ca_name, $search_field, $search_text, $search_operator='and') -{ - global $g4; - - $str = ""; -/* 멀티카테고리를 위한 원본 주석 또는 삭제 - if ($search_ca_name) - $str = " ca_name = '$search_ca_name' "; -*/ - - //멀티카테고리를 위한 추가 - if ($search_ca_name) { - if ($GLOBALS['board']['bo_use_category']) { - $selects = explode(" ", $GLOBALS['board']['bo_category_list']); - if ($selects[0] == "sql2mc") { - $str = " ca_name like '%\"{$search_ca_name}\"%' "; - } else { - $str = " ca_name='{$search_ca_name}' "; - } - } - } - // end : 멀티카테고리 - - $search_text = strip_tags(($search_text)); - $search_text = trim(stripslashes($search_text)); - - if (!$search_text) { - if ($search_ca_name) { - return $str; - } else { - return '0'; - } - } - - if ($str) - $str .= " and "; - - // 쿼리의 속도를 높이기 위하여 ( ) 는 최소화 한다. - $op1 = ""; - - // 검색어를 구분자로 나눈다. 여기서는 공백 - $s = array(); - $s = explode(" ", $search_text); - - // 검색필드를 구분자로 나눈다. 여기서는 + - $tmp = array(); - $tmp = explode(",", trim($search_field)); - $field = explode("||", $tmp[0]); - $not_comment = $tmp[1]; - - $str .= "("; - for ($i=0; $i"; -} - - -// 관리자 정보를 얻음 -function gb_get_admin($admin='super') -{ - global $gb_config, $group, $board; - global $g4; - - $is = false; - if ($admin == 'board') { - $mb = sql_fetch("select * from $g4[member_table] where mb_id in ('$board[bo_admin]') limit 1 "); - $is = true; - } - - if (($is && !$mb[mb_id]) || $admin == 'group') { - $mb = sql_fetch("select * from $g4[member_table] where mb_id in ('$group[gr_admin]') limit 1 "); - $is = true; - } - - if (($is && !$mb[mb_id]) || $admin == 'super') { - $mb = sql_fetch("select * from $g4[member_table] where mb_id in ('$gb_config[cf_admin]') limit 1 "); - } - - return $mb; -} - - -// 관리자인가? -function gb_is_admin($mb_id) -{ - global $gb_config, $group, $board; - - if (!$mb_id) return; - - if($gb_config['cf_admin'] == $mb_id) return 'super'; - if($group['gr_admin'] == $mb_id) return 'group'; - if($board['bo_admin'] == $mb_id) return 'board'; - - $mb = get_member($mb_id); - if($mb['mb_level'] > 9) return 'super'; - - return ''; -} - - -// 분류 옵션을 얻음 -// 4.00 에서는 카테고리 테이블을 없애고 보드테이블에 있는 내용으로 대체 -function gb_get_category_option($bo_table='') -{ - global $g4, $board; - - /* - $sql = " select bo_category_list from $g4[board_table] where bo_table = '$bo_table' "; - $row = sql_fetch($sql); - $arr = explode("|", $row[bo_category_list]); // 구분자가 , 로 되어 있음 - */ - $arr = explode("|", $board[bo_category_list]); // 구분자가 , 로 되어 있음 - $str = ""; - for ($i=0; $i$name"; - } - } - $title_mb_id = "[$mb_id]"; - } else { - $tmp_name = "$name"; - $title_mb_id = "[비회원]"; - } - - $name = get_text($name); - $email = get_text($email); - $homepage = get_text($homepage); - - return "$tmp_name"; -} - - -// 파일을 보이게 하는 링크 (이미지, 플래쉬, 동영상) -function gb_view_file_link($file, $width, $height, $content="") -{ - global $gb_config, $board; - global $g4; - static $ids; - - if (!$file) return; - - $ids++; - - // 파일의 폭이 게시판설정의 이미지폭 보다 크다면 게시판설정 폭으로 맞추고 비율에 따라 높이를 계산 - if ($width > $board[bo_image_width] && $board[bo_image_width]) - { - $rate = $board[bo_image_width] / $width; - $width = $board[bo_image_width]; - $height = (int)($height * $rate); - } - - // 폭이 있는 경우 폭과 높이의 속성을 주고, 없으면 자동 계산되도록 코드를 만들지 않는다. - if ($width) - $attr = " width='$width' height='$height' "; - else - $attr = ""; - - if (preg_match("/\.($gb_config[cf_image_extension])$/i", $file)) - // 이미지에 속성을 주지 않는 이유는 이미지 클릭시 원본 이미지를 보여주기 위한것임 - // 게시판설정 이미지보다 크다면 스킨의 자바스크립트에서 이미지를 줄여준다 - return ""; - /* - // 110106 : FLASH XSS 공격으로 인하여 코드 자체를 막음 - else if (preg_match("/\.($gb_config[cf_flash_extension])$/i", $file)) - //return ""; - return ""; - */ - //============================================================================================= - // 동영상 파일에 악성코드를 심는 경우를 방지하기 위해 경로를 노출하지 않음 - //--------------------------------------------------------------------------------------------- - /* - else if (preg_match("/\.($gb_config[cf_movie_extension])$/i", $file)) - //return ""; - return ""; - */ - //============================================================================================= -} - - -// view_file_link() 함수에서 넘겨진 이미지를 보이게 합니다. -// {img:0} ... {img:n} 과 같은 형식 -function gb_view_image($view, $number, $attribute) -{ - if ($view['file'][$number]['view']) - return preg_replace("/>$/", " $attribute>", $view['file'][$number]['view']); - else - //return "{".$number."번 이미지 없음}"; - return ""; -} - - -/* -// {link:0} ... {link:n} 과 같은 형식 -function gb_view_link($view, $number, $attribute) -{ - global $gb_config; - - if ($view[link][$number][link]) - { - if (!preg_match("/target/i", $attribute)) - $attribute .= " target='$gb_config[cf_link_target]'"; - return "{$view[link][$number][link]}"; - } - else - return "{".$number."번 링크 없음}"; -} -*/ - - -// 한글 한글자(2byte, 유니코드 3byte)는 길이 2, 공란.영숫자.특수문자는 길이 1 -// 유니코드는 http://g4uni.winnwe.net/bbs/board.php?bo_table=g4uni_faq&wr_id=7 의 Mr.Learn님의 글을 참고하였습니다. -function gb_cut_str($str, $len, $suffix="…") -{ - global $g4; - - if (strtoupper($g4['charset']) == 'UTF-8') { - $c = substr(str_pad(decbin(ord($str{$len})),8,'0',STR_PAD_LEFT),0,2); - if ($c == '10') - for (;$c != '11' && $c{0} == 1;$c = substr(str_pad(decbin(ord($str{--$len})),8,'0',STR_PAD_LEFT),0,2)); - return substr($str,0,$len) . (strlen($str)-strlen($suffix) >= $len ? $suffix : ''); - } else { - $s = substr($str, 0, $len); - $cnt = 0; - for ($i=0; $i 127) - $cnt++; - $s = substr($s, 0, $len - ($cnt % 2)); - if (strlen($s) >= strlen($str)) - $suffix = ""; - return $s . $suffix; - } -} - - -// TEXT 형식으로 변환 -function gb_get_text($str, $html=0) -{ - /* 3.22 막음 (HTML 체크 줄바꿈시 출력 오류때문) - $source[] = "/ /"; - $target[] = "  "; - */ - - // 3.31 - // TEXT 출력일 경우 &   등의 코드를 정상으로 출력해 주기 위함 - if ($html == 0) { - $str = html_symbol($str); - } - - $source[] = "//"; - $target[] = ">"; - //$source[] = "/\"/"; - //$target[] = """; - $source[] = "/\'/"; - $target[] = "'"; - //$source[] = "/}/"; $target[] = "}"; - if ($html) { - $source[] = "/\n/"; - $target[] = "
"; - } - - return preg_replace($source, $target, $str); -} - - -/* -// HTML 특수문자 변환 htmlspecialchars -function gb_hsc($str) -{ - $trans = array("\"" => """, "'" => "'", "<"=>"<", ">"=>">"); - $str = strtr($str, $trans); - return $str; -} -*/ - -// 3.31 -// HTML SYMBOL 변환 -//   & · 등을 정상으로 출력 -function gb_html_symbol($str) -{ - return preg_replace("/\&([a-z0-9]{1,20}|\#[0-9]{0,3});/i", "&\\1;", $str); -} - - -/************************************************************************* -** -** SQL 관련 함수 모음 -** -*************************************************************************/ - -// DB 연결 -function gb_sql_connect($host, $user, $pass) -{ - global $g4; - - return @mysql_connect($host, $user, $pass); -} - - -// DB 선택 -function gb_sql_select_db($db, $connect) -{ - global $g4; - - if (strtolower($g4['charset']) == 'utf-8') @mysql_query(" set names utf8 "); - else if (strtolower($g4['charset']) == 'euc-kr') @mysql_query(" set names euckr "); - return @mysql_select_db($db, $connect); -} - - -// mysql_query 와 mysql_error 를 한꺼번에 처리 -function gb_sql_query($sql, $error=TRUE) -{ - // Blind SQL Injection 취약점 해결 - $sql = trim($sql); - // union의 사용을 허락하지 않습니다. - $sql = preg_replace("#^select.*from.*[^\'\"]union[^\'\"].*#i", "select 1", $sql); - // `information_schema` DB로의 접근을 허락하지 않습니다. - $sql = preg_replace("#^select.*from.*[^\'\"]`?information_schema`?[^\'\"].*#i", "select 1", $sql); - - if ($error) - $result = @mysql_query($sql) or die("

$sql

" . mysql_errno() . " : " . mysql_error() . "

error file : $_SERVER[PHP_SELF]"); - else - $result = @mysql_query($sql); - return $result; -} - - -// 쿼리를 실행한 후 결과값에서 한행을 얻는다. -function gb_sql_fetch($sql, $error=TRUE) -{ - $result = sql_query($sql, $error); - //$row = @sql_fetch_array($result) or die("

$sql

" . mysql_errno() . " : " . mysql_error() . "

error file : $_SERVER[PHP_SELF]"); - $row = gb_sql_fetch_array($result); - return $row; -} - - -// 결과값에서 한행 연관배열(이름으로)로 얻는다. -function gb_sql_fetch_array($result) -{ - $row = @mysql_fetch_assoc($result); - return $row; -} - - -// $result에 대한 메모리(memory)에 있는 내용을 모두 제거한다. -// sql_free_result()는 결과로부터 얻은 질의 값이 커서 많은 메모리를 사용할 염려가 있을 때 사용된다. -// 단, 결과 값은 스크립트(script) 실행부가 종료되면서 메모리에서 자동적으로 지워진다. -function gb_sql_free_result($result) -{ - return mysql_free_result($result); -} - - -function gb_sql_password($value) -{ - // mysql 4.0x 이하 버전에서는 password() 함수의 결과가 16bytes - // mysql 4.1x 이상 버전에서는 password() 함수의 결과가 41bytes - $row = gb_sql_fetch(" select password('$value') as pass "); - return $row[pass]; -} - - -// PHPMyAdmin 참고 -function gb_get_table_define($table, $crlf="\n") -{ - global $g4; - - // For MySQL < 3.23.20 - $schema_create .= 'CREATE TABLE ' . $table . ' (' . $crlf; - - $sql = 'SHOW FIELDS FROM ' . $table; - $result = sql_query($sql); - while ($row = gb_sql_fetch_array($result)) - { - $schema_create .= ' ' . $row['Field'] . ' ' . $row['Type']; - if (isset($row['Default']) && $row['Default'] != '') - { - $schema_create .= ' DEFAULT \'' . $row['Default'] . '\''; - } - if ($row['Null'] != 'YES') - { - $schema_create .= ' NOT NULL'; - } - if ($row['Extra'] != '') - { - $schema_create .= ' ' . $row['Extra']; - } - $schema_create .= ',' . $crlf; - } // end while - sql_free_result($result); - - $schema_create = preg_replace('/,' . $crlf . '$/', '', $schema_create); - - $sql = 'SHOW KEYS FROM ' . $table; - $result = sql_query($sql); - while ($row = gb_sql_fetch_array($result)) - { - $kname = $row['Key_name']; - $comment = (isset($row['Comment'])) ? $row['Comment'] : ''; - $sub_part = (isset($row['Sub_part'])) ? $row['Sub_part'] : ''; - - if ($kname != 'PRIMARY' && $row['Non_unique'] == 0) { - $kname = "UNIQUE|$kname"; - } - if ($comment == 'FULLTEXT') { - $kname = 'FULLTEXT|$kname'; - } - if (!isset($index[$kname])) { - $index[$kname] = array(); - } - if ($sub_part > 1) { - $index[$kname][] = $row['Column_name'] . '(' . $sub_part . ')'; - } else { - $index[$kname][] = $row['Column_name']; - } - } // end while - sql_free_result($result); - - while (list($x, $columns) = @each($index)) { - $schema_create .= ',' . $crlf; - if ($x == 'PRIMARY') { - $schema_create .= ' PRIMARY KEY ('; - } else if (substr($x, 0, 6) == 'UNIQUE') { - $schema_create .= ' UNIQUE ' . substr($x, 7) . ' ('; - } else if (substr($x, 0, 8) == 'FULLTEXT') { - $schema_create .= ' FULLTEXT ' . substr($x, 9) . ' ('; - } else { - $schema_create .= ' KEY ' . $x . ' ('; - } - $schema_create .= implode($columns, ', ') . ')'; - } // end while - - if (strtolower($g4['charset']) == "utf-8") - $schema_create .= $crlf . ') DEFAULT CHARSET=utf8'; - else - $schema_create .= $crlf . ')'; - - return $schema_create; -} // end of the 'PMA_getTableDef()' function - - -// 리퍼러 체크 -function gb_referer_check($url="") -{ - /* - // 제대로 체크를 하지 못하여 주석 처리함 - global $g4; - - if (!$url) - $url = $g4[url]; - - if (!preg_match("/^http[s]?:\/\/".$_SERVER[HTTP_HOST]."/", $_SERVER[HTTP_REFERER])) - alert("제대로 된 접근이 아닌것 같습니다.", $url); - */ -} - - -// 한글 요일 -function gb_get_yoil($date, $full=0) -{ - $arr_yoil = array ("일", "월", "화", "수", "목", "금", "토"); - - $yoil = date("w", strtotime($date)); - $str = $arr_yoil[$yoil]; - if ($full) { - $str .= "요일"; - } - return $str; -} - - -// 날짜를 select 박스 형식으로 얻는다 -function gb_date_select($date, $name="") -{ - global $g4; - - $s = ""; - if (substr($date, 0, 4) == "0000") { - $date = $g4[time_ymdhis]; - } - preg_match("/([0-9]{4})-([0-9]{2})-([0-9]{2})/", $date, $m); - - // 년 - $s .= "