1614 lines
52 KiB
PHP
1614 lines
52 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* @file gnuboard.lib.php
|
||
|
* @date 2018-01-01
|
||
|
* @author Go Namhyeon <gnh1201@gmail.com>
|
||
|
* @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 .= "<a href='" . $url . "1{$add}'>처음</a>";
|
||
|
//$str .= "[<a href='" . $url . ($cur_page-1) . "'>이전</a>]";
|
||
|
}
|
||
|
|
||
|
$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 .= " <a href='" . $url . ($start_page-1) . "{$add}'>이전</a>";
|
||
|
|
||
|
if ($total_page > 1) {
|
||
|
for ($k=$start_page;$k<=$end_page;$k++) {
|
||
|
if ($cur_page != $k)
|
||
|
$str .= " <a href='$url$k{$add}'><span>$k</span></a>";
|
||
|
else
|
||
|
$str .= " <b>$k</b> ";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ($total_page > $end_page) $str .= " <a href='" . $url . ($end_page+1) . "{$add}'>다음</a>";
|
||
|
|
||
|
if ($cur_page < $total_page) {
|
||
|
//$str .= "[<a href='$url" . ($cur_page+1) . "'>다음</a>]";
|
||
|
$str .= " <a href='$url$total_page{$add}'>맨끝</a>";
|
||
|
}
|
||
|
$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("<span style='font-family:Tahoma, 굴림; font-size:9pt;'>$str</span>");
|
||
|
}
|
||
|
|
||
|
|
||
|
// 메타태그를 이용한 URL 이동
|
||
|
// header("location:URL") 을 대체
|
||
|
function gb_goto_url($url)
|
||
|
{
|
||
|
echo "<script type='text/javascript'> location.replace('$url'); </script>";
|
||
|
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 "<meta http-equiv=\"content-type\" content=\"text/html; charset=$g4[charset]\">";
|
||
|
echo "<script type='text/javascript'>alert('$msg');";
|
||
|
if (!$url)
|
||
|
echo "history.go(-1);";
|
||
|
echo "</script>";
|
||
|
if ($url)
|
||
|
// 4.06.00 : 불여우의 경우 아래의 코드를 제대로 인식하지 못함
|
||
|
//echo "<meta http-equiv='refresh' content='0;url=$url'>";
|
||
|
goto_url($url);
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
|
||
|
// 경고메세지 출력후 창을 닫음
|
||
|
function gb_alert_close($msg)
|
||
|
{
|
||
|
global $g4;
|
||
|
|
||
|
echo "<meta http-equiv=\"content-type\" content=\"text/html; charset=$g4[charset]\">";
|
||
|
echo "<script type='text/javascript'> alert('$msg'); window.close(); </script>";
|
||
|
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<A HREF=\"http://\\2\" TARGET='$gb_config[cf_link_target]'>\\2</A>", $str);
|
||
|
//$str = preg_replace("/([^(HREF=\"?'?)|(SRC=\"?'?)]|\(|^)((http|https|ftp|telnet|news|mms):\/\/[a-zA-Z0-9\.-]+\.[\xA1-\xFEa-zA-Z0-9\.:&#=_\?\/~\+%@;\-\|\,]+)/i", "\\1<A HREF=\"\\2\" TARGET='$gb_config[cf_link_target]'>\\2</A>", $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<A HREF=\"\\2\" TARGET='$gb_config[cf_link_target]'>\\2</A>", $str);
|
||
|
} else {
|
||
|
$str = preg_replace("/([^(HREF=\"?'?)|(SRC=\"?'?)]|\(|^)((http|https|ftp|telnet|news|mms):\/\/[a-zA-Z0-9\.-]+\.[\xA1-\xFEa-zA-Z0-9\.:&#=_\?\/~\+%@;\-\|\,\(\)]+)/i", "\\1<A HREF=\"\\2\" TARGET='$gb_config[cf_link_target]'>\\2</A>", $str);
|
||
|
}
|
||
|
// 이메일 정규표현식 수정 061004
|
||
|
//$str = preg_replace("/(([a-z0-9_]|\-|\.)+@([^[:space:]]*)([[:alnum:]-]))/i", "<a href='mailto:\\1'>\\1</a>", $str);
|
||
|
$str = preg_replace("/([0-9a-z]([-_\.]?[0-9a-z])*@[0-9a-z]([-_\.]?[0-9a-z])*\.[a-z]{2,4})/i", "<a href='mailto:\\1'>\\1</a>", $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'] = "<span class='".($list['mb_id']?'member':'guest')."'>$tmp_name</span>";
|
||
|
|
||
|
$reply = $list['wr_reply'];
|
||
|
|
||
|
$list['reply'] = "";
|
||
|
if (strlen($reply) > 0)
|
||
|
{
|
||
|
for ($k=0; $k<strlen($reply); $k++)
|
||
|
$list['reply'] .= ' ';
|
||
|
}
|
||
|
|
||
|
$list['icon_reply'] = "";
|
||
|
if ($list['reply'])
|
||
|
$list['icon_reply'] = "<img src='$skin_path/img/icon_reply.gif' align='absmiddle'>";
|
||
|
|
||
|
$list['icon_link'] = "";
|
||
|
if ($list['wr_link1'] || $list['wr_link2'])
|
||
|
$list['icon_link'] = "<img src='$skin_path/img/icon_link.gif' align='absmiddle'>";
|
||
|
|
||
|
// 분류명 링크
|
||
|
$list['ca_name_href'] = "$g4[bbs_path]/board.php?bo_table=$board[bo_table]&sca=".urlencode($list['ca_name']);
|
||
|
|
||
|
$list['href'] = "$g4[bbs_path]/board.php?bo_table=$board[bo_table]&wr_id=$list[wr_id]" . $qstr;
|
||
|
//$list['href'] = "$g4[bbs_path]/board.php?bo_table=$board[bo_table]&wr_id=$list[wr_id]";
|
||
|
if ($board['bo_use_comment'])
|
||
|
$list['comment_href'] = "javascript:win_comment('$g4[bbs_path]/board.php?bo_table=$board[bo_table]&wr_id=$list[wr_id]&cwin=1');";
|
||
|
else
|
||
|
$list['comment_href'] = $list['href'];
|
||
|
|
||
|
$list['icon_new'] = "";
|
||
|
if ($list['wr_datetime'] >= date("Y-m-d H:i:s", $g4['server_time'] - ($board['bo_new'] * 3600)))
|
||
|
$list['icon_new'] = "<img src='$skin_path/img/icon_new.gif' align='absmiddle'>";
|
||
|
|
||
|
$list['icon_hot'] = "";
|
||
|
if ($list['wr_hit'] >= $board['bo_hot'])
|
||
|
$list['icon_hot'] = "<img src='$skin_path/img/icon_hot.gif' align='absmiddle'>";
|
||
|
|
||
|
$list['icon_secret'] = "";
|
||
|
if (strstr($list['wr_option'], "secret"))
|
||
|
$list['icon_secret'] = "<img src='$skin_path/img/icon_secret.gif' align='absmiddle'>";
|
||
|
|
||
|
// 링크
|
||
|
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'] = "<img src='$skin_path/img/icon_file.gif' align='absmiddle'>";
|
||
|
|
||
|
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<count($s); $m++) {
|
||
|
if (trim($s[$m]) == "") continue;
|
||
|
// 태그는 포함하지 않아야 하는데 잘 안되는군. ㅡㅡa
|
||
|
//$pattern .= $bar . '([^<])(' . quotemeta($s[$m]) . ')';
|
||
|
//$pattern .= $bar . quotemeta($s[$m]);
|
||
|
//$pattern .= $bar . str_replace("/", "\/", quotemeta($s[$m]));
|
||
|
$tmp_str = quotemeta($s[$m]);
|
||
|
$tmp_str = str_replace($src, $dst, $tmp_str);
|
||
|
$pattern .= $bar . $tmp_str . "(?![^<]*>)";
|
||
|
$bar = "|";
|
||
|
}
|
||
|
|
||
|
// 지정된 검색 폰트의 색상, 배경색상으로 대체
|
||
|
$replace = "<span style='background-color:$gb_config[cf_search_bgcolor]; color:$gb_config[cf_search_color];'>\\1</span>";
|
||
|
|
||
|
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[] = "<br/>";
|
||
|
}
|
||
|
|
||
|
// 테이블 태그의 갯수를 세어 테이블이 깨지지 않도록 한다.
|
||
|
$table_begin_count = substr_count(strtolower($content), "<table");
|
||
|
$table_end_count = substr_count(strtolower($content), "</table");
|
||
|
for ($i=$table_end_count; $i<$table_begin_count; $i++)
|
||
|
{
|
||
|
$content .= "</table>";
|
||
|
}
|
||
|
|
||
|
$content = preg_replace_callback("/<([^>]+)>/s", 'bad130128', $content);
|
||
|
|
||
|
$content = preg_replace($source, $target, $content);
|
||
|
|
||
|
// XSS (Cross Site Script) 막기
|
||
|
// 완벽한 XSS 방지는 없다.
|
||
|
|
||
|
// 이런 경우를 방지함 <IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))">
|
||
|
//$content = preg_replace("#\/\*.*\*\/#iU", "", $content);
|
||
|
// 위의 정규식이 아래와 같은 내용을 통과시키므로 not greedy(비탐욕수량자?) 옵션을 제거함. ignore case 옵션도 필요 없으므로 제거
|
||
|
// <IMG STYLE="xss:ex//*XSS*/**/pression(alert('XSS'))"></IMG>
|
||
|
$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("/((?<=\<param|\<embed)[^>]+)(\s*=\s*[\'\"]?)always([\'\"]?)([^>]+(?=\>))/i", "$1$2never$3$4", $content);
|
||
|
// allowscript 속성의 param 태그를 삭제한다.
|
||
|
//$content = preg_replace("#(<param.*?allowscript[^>]+>)(<\/param>)?#i", "", $content);
|
||
|
$content = preg_replace("#<param[^>]+AllowScriptAccess[^>]+>(<\/param>)?#i", "", $content);
|
||
|
// embed 태그의 allowscript 속성을 삭제한다.
|
||
|
//$content = preg_replace("#(<embed.*?)(allowscriptaccess[^\s\>]+)#i", "$1", $content);
|
||
|
$content = preg_replace("#(<embed[^>]+)(allowscriptaccess[^\s\>]+)#i", "$1", $content);
|
||
|
// object 태그에 allowscript 의 값을 never 로 하여 태그를 추가한다.
|
||
|
$content = preg_replace("#(<object[^>]+>)#i", "$1<param name=\"allowscriptaccess\" value=\"never\">", $content);
|
||
|
// embed 태그에 allowscrpt 값을 never 로 하여 속성을 추가한다.
|
||
|
$content = preg_replace("#(<embed[^>]+)#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);
|
||
|
// <IMG STYLE="xss:e\xpression(alert('XSS'))"></IMG> 와 같은 코드에 취약점이 있어 수정함. 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<count($s); $i++) {
|
||
|
// 검색어
|
||
|
$search_str = trim($s[$i]);
|
||
|
if ($search_str == "") continue;
|
||
|
|
||
|
// 인기검색어
|
||
|
$sql = " insert into $g4[popular_table] set pp_word = '$search_str', pp_date = '$g4[time_ymd]', pp_ip = '$_SERVER[REMOTE_ADDR]' ";
|
||
|
sql_query($sql, FALSE);
|
||
|
|
||
|
$str .= $op1;
|
||
|
$str .= "(";
|
||
|
|
||
|
$op2 = "";
|
||
|
for ($k=0; $k<count($field); $k++) { // 필드의 수만큼 다중 필드 검색 가능 (필드1+필드2...)
|
||
|
|
||
|
// SQL Injection 방지
|
||
|
// 필드값에 a-z A-Z 0-9 _ , | 이외의 값이 있다면 검색필드를 wr_subject 로 설정한다.
|
||
|
$field[$k] = preg_match("/^[\w\,\|]+$/", $field[$k]) ? $field[$k] : "wr_subject";
|
||
|
|
||
|
$str .= $op2;
|
||
|
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;
|
||
|
}
|
||
|
$op2 = " or ";
|
||
|
}
|
||
|
$str .= ")";
|
||
|
|
||
|
$op1 = " $search_operator ";
|
||
|
}
|
||
|
$str .= " ) ";
|
||
|
if ($not_comment)
|
||
|
$str .= " and wr_is_comment = '0' ";
|
||
|
|
||
|
return $str;
|
||
|
}
|
||
|
|
||
|
|
||
|
// 게시판 테이블에서 하나의 행을 읽음
|
||
|
function gb_get_write($write_table, $wr_id)
|
||
|
{
|
||
|
return sql_fetch(" select * from $write_table where wr_id = '$wr_id' ");
|
||
|
}
|
||
|
|
||
|
|
||
|
// 게시판의 다음글 번호를 얻는다.
|
||
|
function gb_get_next_num($table)
|
||
|
{
|
||
|
// 가장 작은 번호를 얻어
|
||
|
$sql = " select min(wr_num) as min_wr_num from $table ";
|
||
|
$row = sql_fetch($sql);
|
||
|
// 가장 작은 번호에 1을 빼서 넘겨줌
|
||
|
return (int)($row[min_wr_num] - 1);
|
||
|
}
|
||
|
|
||
|
|
||
|
// 그룹 설정 테이블에서 하나의 행을 읽음
|
||
|
function gb_get_group($gr_id)
|
||
|
{
|
||
|
global $g4;
|
||
|
|
||
|
return sql_fetch(" select * from $g4[group_table] where gr_id = '$gr_id' ");
|
||
|
}
|
||
|
|
||
|
|
||
|
// 회원 정보를 얻는다.
|
||
|
function gb_get_member($mb_id, $fields='*')
|
||
|
{
|
||
|
global $g4;
|
||
|
|
||
|
return sql_fetch(" select $fields from $g4[member_table] where mb_id = TRIM('$mb_id') ");
|
||
|
}
|
||
|
|
||
|
|
||
|
// 날짜, 조회수의 경우 높은 순서대로 보여져야 하므로 $flag 를 추가
|
||
|
// $flag : asc 낮은 순서 , desc 높은 순서
|
||
|
// 제목별로 컬럼 정렬하는 QUERY STRING
|
||
|
function gb_subject_sort_link($col, $query_string='', $flag='asc')
|
||
|
{
|
||
|
global $sst, $sod, $sfl, $stx, $page;
|
||
|
|
||
|
$q1 = "sst=$col";
|
||
|
if ($flag == 'asc')
|
||
|
{
|
||
|
$q2 = 'sod=asc';
|
||
|
if ($sst == $col)
|
||
|
{
|
||
|
if ($sod == 'asc')
|
||
|
{
|
||
|
$q2 = 'sod=desc';
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$q2 = 'sod=desc';
|
||
|
if ($sst == $col)
|
||
|
{
|
||
|
if ($sod == 'desc')
|
||
|
{
|
||
|
$q2 = 'sod=asc';
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return "<a href='$_SERVER[PHP_SELF]?$query_string&$q1&$q2&sfl=$sfl&stx=$stx&page=$page'>";
|
||
|
}
|
||
|
|
||
|
|
||
|
// 관리자 정보를 얻음
|
||
|
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<count($arr); $i++)
|
||
|
if (trim($arr[$i]))
|
||
|
$str .= "<option value='$arr[$i]'>$arr[$i]</option>\n";
|
||
|
|
||
|
return $str;
|
||
|
}
|
||
|
|
||
|
|
||
|
// 게시판 그룹을 SELECT 형식으로 얻음
|
||
|
function gb_get_group_select($name, $selected='', $event='')
|
||
|
{
|
||
|
global $g4, $is_admin, $member;
|
||
|
|
||
|
$sql = " select gr_id, gr_subject from $g4[group_table] a ";
|
||
|
if ($is_admin == "group") {
|
||
|
$sql .= " left join $g4[member_table] b on (b.mb_id = a.gr_admin)
|
||
|
where b.mb_id = '$member[mb_id]' ";
|
||
|
}
|
||
|
$sql .= " order by a.gr_id ";
|
||
|
|
||
|
$result = sql_query($sql);
|
||
|
$str = "<select name='$name' $event>";
|
||
|
for ($i=0; $row=sql_fetch_array($result); $i++)
|
||
|
{
|
||
|
$str .= "<option value='$row[gr_id]'";
|
||
|
if ($row[gr_id] == $selected) $str .= " selected";
|
||
|
$str .= ">$row[gr_subject]</option>";
|
||
|
}
|
||
|
$str .= "</select>";
|
||
|
return $str;
|
||
|
}
|
||
|
|
||
|
|
||
|
// '예', '아니오'를 SELECT 형식으로 얻음
|
||
|
function gb_get_yn_select($name, $selected='1', $event='')
|
||
|
{
|
||
|
$str = "<select name='$name' $event>";
|
||
|
if ($selected) {
|
||
|
$str .= "<option value='1' selected>예</option>";
|
||
|
$str .= "<option value='0'>아니오</option>";
|
||
|
} else {
|
||
|
$str .= "<option value='1'>예</option>";
|
||
|
$str .= "<option value='0' selected>아니오</option>";
|
||
|
}
|
||
|
$str .= "</select>";
|
||
|
return $str;
|
||
|
}
|
||
|
|
||
|
|
||
|
// 포인트 부여
|
||
|
function gb_insert_point($mb_id, $point, $content='', $rel_table='', $rel_id='', $rel_action='')
|
||
|
{
|
||
|
global $gb_config;
|
||
|
global $g4;
|
||
|
global $is_admin;
|
||
|
|
||
|
// 포인트 사용을 하지 않는다면 return
|
||
|
if (!$gb_config[cf_use_point]) { return 0; }
|
||
|
|
||
|
// 포인트가 없다면 업데이트 할 필요 없음
|
||
|
if ($point == 0) { return 0; }
|
||
|
|
||
|
// 회원아이디가 없다면 업데이트 할 필요 없음
|
||
|
if ($mb_id == "") { return 0; }
|
||
|
$mb = sql_fetch(" select mb_id from $g4[member_table] where mb_id = '$mb_id' ");
|
||
|
if (!$mb[mb_id]) { return 0; }
|
||
|
|
||
|
// 이미 등록된 내역이라면 건너뜀
|
||
|
if ($rel_table || $rel_id || $rel_action)
|
||
|
{
|
||
|
$sql = " select count(*) as cnt from $g4[point_table]
|
||
|
where mb_id = '$mb_id'
|
||
|
and po_rel_table = '$rel_table'
|
||
|
and po_rel_id = '$rel_id'
|
||
|
and po_rel_action = '$rel_action' ";
|
||
|
$row = sql_fetch($sql);
|
||
|
if ($row[cnt])
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
// 포인트 건별 생성
|
||
|
$sql = " insert into $g4[point_table]
|
||
|
set mb_id = '$mb_id',
|
||
|
po_datetime = '$g4[time_ymdhis]',
|
||
|
po_content = '".addslashes($content)."',
|
||
|
po_point = '$point',
|
||
|
po_rel_table = '$rel_table',
|
||
|
po_rel_id = '$rel_id',
|
||
|
po_rel_action = '$rel_action' ";
|
||
|
sql_query($sql);
|
||
|
|
||
|
// 포인트 내역의 합을 구하고
|
||
|
$sql = " select sum(po_point) as sum_po_point from $g4[point_table] where mb_id = '$mb_id' ";
|
||
|
$row = sql_fetch($sql);
|
||
|
$sum_point = $row[sum_po_point];
|
||
|
|
||
|
// 포인트 UPDATE
|
||
|
$sql = " update $g4[member_table] set mb_point = '$sum_point' where mb_id = '$mb_id' ";
|
||
|
sql_query($sql);
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
// 포인트 삭제
|
||
|
function gb_delete_point($mb_id, $rel_table, $rel_id, $rel_action)
|
||
|
{
|
||
|
global $g4;
|
||
|
|
||
|
$result = false;
|
||
|
if ($rel_table || $rel_id || $rel_action)
|
||
|
{
|
||
|
$result = sql_query(" delete from $g4[point_table]
|
||
|
where mb_id = '$mb_id'
|
||
|
and po_rel_table = '$rel_table'
|
||
|
and po_rel_id = '$rel_id'
|
||
|
and po_rel_action = '$rel_action' ", false);
|
||
|
|
||
|
// 포인트 내역의 합을 구하고
|
||
|
$sql = " select sum(po_point) as sum_po_point from $g4[point_table] where mb_id = '$mb_id' ";
|
||
|
$row = sql_fetch($sql);
|
||
|
$sum_point = $row[sum_po_point];
|
||
|
|
||
|
// 포인트 UPDATE
|
||
|
$sql = " update $g4[member_table] set mb_point = '$sum_point' where mb_id = '$mb_id' ";
|
||
|
$result = sql_query($sql);
|
||
|
}
|
||
|
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
// 회원 레이어
|
||
|
function gb_get_sideview($mb_id, $name="", $email="", $homepage="")
|
||
|
{
|
||
|
global $gb_config;
|
||
|
global $g4;
|
||
|
|
||
|
$email = base64_encode($email);
|
||
|
$homepage = set_http($homepage);
|
||
|
|
||
|
$name = preg_replace("/\'/", "", $name);
|
||
|
$name = preg_replace("/\'/", "", $name);
|
||
|
$name = preg_replace("/\"/", """, $name);
|
||
|
$title_name = $name;
|
||
|
|
||
|
if ($mb_id) {
|
||
|
$tmp_name = "<span class='member'>$name</span>";
|
||
|
|
||
|
if ($gb_config['cf_use_member_icon']) {
|
||
|
$mb_dir = substr($mb_id,0,2);
|
||
|
$icon_file = "$g4[path]/data/member/$mb_dir/$mb_id.gif";
|
||
|
|
||
|
//if (file_exists($icon_file) && is_file($icon_file)) {
|
||
|
if (file_exists($icon_file)) {
|
||
|
//$size = getimagesize($icon_file);
|
||
|
//$width = $size[0];
|
||
|
//$height = $size[1];
|
||
|
$width = $gb_config['cf_member_icon_width'];
|
||
|
$height = $gb_config['cf_member_icon_height'];
|
||
|
$tmp_name = "<img src='$icon_file' width='$width' height='$height' align='absmiddle' border='0'>";
|
||
|
|
||
|
if ($gb_config['cf_use_member_icon'] == 2) // 회원아이콘+이름
|
||
|
$tmp_name = $tmp_name . " <span class='member'>$name</span>";
|
||
|
}
|
||
|
}
|
||
|
$title_mb_id = "[$mb_id]";
|
||
|
} else {
|
||
|
$tmp_name = "<span class='guest'>$name</span>";
|
||
|
$title_mb_id = "[비회원]";
|
||
|
}
|
||
|
|
||
|
$name = get_text($name);
|
||
|
$email = get_text($email);
|
||
|
$homepage = get_text($homepage);
|
||
|
|
||
|
return "<a href=\"javascript:;\" onClick=\"showSideView(this, '$mb_id', '$name', '$email', '$homepage');\" title=\"{$title_mb_id}{$title_name}\">$tmp_name</a>";
|
||
|
}
|
||
|
|
||
|
|
||
|
// 파일을 보이게 하는 링크 (이미지, 플래쉬, 동영상)
|
||
|
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 "<img src='$g4[path]/data/file/$board[bo_table]/".urlencode($file)."' name='target_resize_image[]' onclick='image_window(this);' style='cursor:pointer;' title='$content'>";
|
||
|
/*
|
||
|
// 110106 : FLASH XSS 공격으로 인하여 코드 자체를 막음
|
||
|
else if (preg_match("/\.($gb_config[cf_flash_extension])$/i", $file))
|
||
|
//return "<embed src='$g4[path]/data/file/$board[bo_table]/$file' $attr></embed>";
|
||
|
return "<script>doc_write(flash_movie('$g4[path]/data/file/$board[bo_table]/$file', '_g4_{$ids}', '$width', '$height', 'transparent'));</script>";
|
||
|
*/
|
||
|
//=============================================================================================
|
||
|
// 동영상 파일에 악성코드를 심는 경우를 방지하기 위해 경로를 노출하지 않음
|
||
|
//---------------------------------------------------------------------------------------------
|
||
|
/*
|
||
|
else if (preg_match("/\.($gb_config[cf_movie_extension])$/i", $file))
|
||
|
//return "<embed src='$g4[path]/data/file/$board[bo_table]/$file' $attr></embed>";
|
||
|
return "<script>doc_write(obj_movie('$g4[path]/data/file/$board[bo_table]/$file', '_g4_{$ids}', '$width', '$height'));</script>";
|
||
|
*/
|
||
|
//=============================================================================================
|
||
|
}
|
||
|
|
||
|
|
||
|
// 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 "<a href='{$view[link][$number][href]}' $attribute>{$view[link][$number][link]}</a>";
|
||
|
}
|
||
|
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<strlen($s); $i++)
|
||
|
if (ord($s[$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[] = "'";
|
||
|
//$source[] = "/}/"; $target[] = "}";
|
||
|
if ($html) {
|
||
|
$source[] = "/\n/";
|
||
|
$target[] = "<br/>";
|
||
|
}
|
||
|
|
||
|
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("<p>$sql<p>" . mysql_errno() . " : " . mysql_error() . "<p>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("<p>$sql<p>" . mysql_errno() . " : " . mysql_error() . "<p>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 .= "<select name='{$name}_y'>";
|
||
|
for ($i=$m[0]-3; $i<=$m[0]+3; $i++) {
|
||
|
$s .= "<option value='$i'";
|
||
|
if ($i == $m[0]) {
|
||
|
$s .= " selected";
|
||
|
}
|
||
|
$s .= ">$i";
|
||
|
}
|
||
|
$s .= "</select>년 \n";
|
||
|
|
||
|
// 월
|
||
|
$s .= "<select name='{$name}_m'>";
|
||
|
for ($i=1; $i<=12; $i++) {
|
||
|
$s .= "<option value='$i'";
|
||
|
if ($i == $m[2]) {
|
||
|
$s .= " selected";
|
||
|
}
|
||
|
$s .= ">$i";
|
||
|
}
|
||
|
$s .= "</select>월 \n";
|
||
|
|
||
|
// 일
|
||
|
$s .= "<select name='{$name}_d'>";
|
||
|
for ($i=1; $i<=31; $i++) {
|
||
|
$s .= "<option value='$i'";
|
||
|
if ($i == $m[3]) {
|
||
|
$s .= " selected";
|
||
|
}
|
||
|
$s .= ">$i";
|
||
|
}
|
||
|
$s .= "</select>일 \n";
|
||
|
|
||
|
return $s;
|
||
|
}
|
||
|
|
||
|
|
||
|
// 시간을 select 박스 형식으로 얻는다
|
||
|
// 1.04.00
|
||
|
// 경매에 시간 설정이 가능하게 되면서 추가함
|
||
|
function gb_time_select($time, $name="")
|
||
|
{
|
||
|
preg_match("/([0-9]{2}):([0-9]{2}):([0-9]{2})/", $time, $m);
|
||
|
|
||
|
// 시
|
||
|
$s .= "<select name='{$name}_h'>";
|
||
|
for ($i=0; $i<=23; $i++) {
|
||
|
$s .= "<option value='$i'";
|
||
|
if ($i == $m[0]) {
|
||
|
$s .= " selected";
|
||
|
}
|
||
|
$s .= ">$i";
|
||
|
}
|
||
|
$s .= "</select>시 \n";
|
||
|
|
||
|
// 분
|
||
|
$s .= "<select name='{$name}_i'>";
|
||
|
for ($i=0; $i<=59; $i++) {
|
||
|
$s .= "<option value='$i'";
|
||
|
if ($i == $m[2]) {
|
||
|
$s .= " selected";
|
||
|
}
|
||
|
$s .= ">$i";
|
||
|
}
|
||
|
$s .= "</select>분 \n";
|
||
|
|
||
|
// 초
|
||
|
$s .= "<select name='{$name}_s'>";
|
||
|
for ($i=0; $i<=59; $i++) {
|
||
|
$s .= "<option value='$i'";
|
||
|
if ($i == $m[3]) {
|
||
|
$s .= " selected";
|
||
|
}
|
||
|
$s .= ">$i";
|
||
|
}
|
||
|
$s .= "</select>초 \n";
|
||
|
|
||
|
return $s;
|
||
|
}
|
||
|
|
||
|
|
||
|
// DEMO 라는 파일이 있으면 데모 화면으로 인식함
|
||
|
function gb_check_demo()
|
||
|
{
|
||
|
global $g4, $member;
|
||
|
|
||
|
if($member['mb_1'] == "demo" || file_exists("$g4[path]/DEMO"))
|
||
|
alert("데모 화면에서는 하실(보실) 수 없는 작업입니다.");
|
||
|
}
|
||
|
|
||
|
|
||
|
// 문자열이 한글, 영문, 숫자, 특수문자로 구성되어 있는지 검사
|
||
|
function gb_check_string($str, $options)
|
||
|
{
|
||
|
global $g4;
|
||
|
|
||
|
$s = '';
|
||
|
for($i=0;$i<strlen($str);$i++) {
|
||
|
$c = $str[$i];
|
||
|
$oc = ord($c);
|
||
|
|
||
|
// 한글
|
||
|
if ($oc >= 0xA0 && $oc <= 0xFF) {
|
||
|
if (strtoupper($g4['charset']) == 'UTF-8') {
|
||
|
if ($options & _G4_HANGUL_) {
|
||
|
$s .= $c . $str[$i+1] . $str[$i+2];
|
||
|
}
|
||
|
$i+=2;
|
||
|
} else {
|
||
|
// 한글은 2바이트 이므로 문자하나를 건너뜀
|
||
|
$i++;
|
||
|
if ($options & _G4_HANGUL_) {
|
||
|
$s .= $c . $str[$i];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// 숫자
|
||
|
else if ($oc >= 0x30 && $oc <= 0x39) {
|
||
|
if ($options & _G4_NUMERIC_) {
|
||
|
$s .= $c;
|
||
|
}
|
||
|
}
|
||
|
// 영대문자
|
||
|
else if ($oc >= 0x41 && $oc <= 0x5A) {
|
||
|
if (($options & _G4_ALPHABETIC_) || ($options & _G4_ALPHAUPPER_)) {
|
||
|
$s .= $c;
|
||
|
}
|
||
|
}
|
||
|
// 영소문자
|
||
|
else if ($oc >= 0x61 && $oc <= 0x7A) {
|
||
|
if (($options & _G4_ALPHABETIC_) || ($options & _G4_ALPHALOWER_)) {
|
||
|
$s .= $c;
|
||
|
}
|
||
|
}
|
||
|
// 공백
|
||
|
else if ($oc == 0x20) {
|
||
|
if ($options & _G4_SPACE_) {
|
||
|
$s .= $c;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
if ($options & _G4_SPECIAL_) {
|
||
|
$s .= $c;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// 넘어온 값과 비교하여 같으면 참, 틀리면 거짓
|
||
|
return ($str == $s);
|
||
|
}
|
||
|
|
||
|
|
||
|
// 한글(2bytes)에서 마지막 글자가 1byte로 끝나는 경우
|
||
|
// 출력시 깨지는 현상이 발생하므로 마지막 완전하지 않은 글자(1byte)를 하나 없앰
|
||
|
function gb_cut_hangul_last($hangul)
|
||
|
{
|
||
|
global $g4;
|
||
|
|
||
|
// 한글이 반쪽나면 ?로 표시되는 현상을 막음
|
||
|
$cnt = 0;
|
||
|
for($i=0;$i<strlen($hangul);$i++) {
|
||
|
// 한글만 센다
|
||
|
if (ord($hangul[$i]) >= 0xA0) {
|
||
|
$cnt++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// 홀수라면 한글이 반쪽난 상태이므로
|
||
|
if (strtoupper($g4['charset']) != 'UTF-8') {
|
||
|
if ($cnt%2) {
|
||
|
$hangul = substr($hangul, 0, $cnt-1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $hangul;
|
||
|
}
|
||
|
|
||
|
|
||
|
// 테이블에서 INDEX(키) 사용여부 검사
|
||
|
function gb_explain($sql)
|
||
|
{
|
||
|
if (preg_match("/^(select)/i", trim($sql))) {
|
||
|
$q = "explain $sql";
|
||
|
echo $q;
|
||
|
$row = sql_fetch($q);
|
||
|
if (!$row[key]) $row[key] = "NULL";
|
||
|
echo " <font color=blue>(type=$row[type] , key=$row[key])</font>";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// 악성태그 변환
|
||
|
function gb_bad_tag_convert($code)
|
||
|
{
|
||
|
global $view;
|
||
|
global $member, $is_admin;
|
||
|
|
||
|
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 "<div class=\"embedx\">보안문제로 인하여 관리자 아이디로는 embed 또는 object 태그를 볼 수 없습니다. 확인하시려면 관리권한이 없는 다른 아이디로 접속하세요.</div>";'),
|
||
|
$code);
|
||
|
}
|
||
|
|
||
|
//return preg_replace("/\<([\/]?)(script|iframe)([^\>]*)\>/i", "<$1$2$3>", $code);
|
||
|
// script 나 iframe 태그를 막지 않는 경우 필터링이 되도록 수정
|
||
|
//return preg_replace("/\<([\/]?)(script|iframe|form|applet)([^\>]*)\>?/i", "<$1$2$3>", $code);
|
||
|
return preg_replace("/\<([\/]?)(script|form|applet)([^\>]*)\>?/i", "<$1$2$3>", $code);
|
||
|
}
|
||
|
|
||
|
|
||
|
// 불법접근을 막도록 토큰을 생성하면서 토큰값을 리턴
|
||
|
function gb_get_token()
|
||
|
{
|
||
|
$token = md5(uniqid(rand(), true));
|
||
|
set_session("ss_token", $token);
|
||
|
|
||
|
return $token;
|
||
|
}
|
||
|
|
||
|
|
||
|
// POST로 넘어온 토큰과 세션에 저장된 토큰 비교
|
||
|
function gb_check_token()
|
||
|
{
|
||
|
set_session('ss_token', '');
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
// 문자열에 utf8 문자가 들어 있는지 검사하는 함수
|
||
|
// 코드 : http://in2.php.net/manual/en/function.mb-check-encoding.php#95289
|
||
|
function gb_is_utf8($str)
|
||
|
{
|
||
|
$len = strlen($str);
|
||
|
for($i = 0; $i < $len; $i++) {
|
||
|
$c = ord($str[$i]);
|
||
|
if ($c > 128) {
|
||
|
if (($c > 247)) return false;
|
||
|
elseif ($c > 239) $bytes = 4;
|
||
|
elseif ($c > 223) $bytes = 3;
|
||
|
elseif ($c > 191) $bytes = 2;
|
||
|
else return false;
|
||
|
if (($i + $bytes) > $len) return false;
|
||
|
while ($bytes > 1) {
|
||
|
$i++;
|
||
|
$b = ord($str[$i]);
|
||
|
if ($b < 128 || $b > 191) return false;
|
||
|
$bytes--;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
function gb_login_check($mb, $mb_id, $mb_password) {
|
||
|
global $gb_config, $g4;
|
||
|
|
||
|
if (!trim($mb_id) || !trim($mb_password))
|
||
|
gb_alert("회원아이디나 패스워드가 공백이면 안됩니다.");
|
||
|
|
||
|
if ($check_time = gb_get_session("ss_login_check_time")) {
|
||
|
if ($check_time > $g4['server_time'] - 15) {
|
||
|
gb_alert("로그인 실패시에는 15초 이후에 다시 로그인 하시기 바랍니다.");
|
||
|
}
|
||
|
}
|
||
|
gb_set_session("ss_login_check_time", $g4['server_time']);
|
||
|
|
||
|
if (!$mb['mb_id'] || (gb_sql_password($mb_password) !== $mb['mb_password'])) {
|
||
|
gb_alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다.");
|
||
|
}
|
||
|
|
||
|
if ($mb['mb_intercept_date'] && $mb['mb_intercept_date'] <= date("Ymd", $g4['server_time'])) {
|
||
|
$date = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})/", "\\1년 \\2월 \\3일", $mb[mb_intercept_date]);
|
||
|
gb_alert("회원님의 아이디는 접근이 금지되어 있습니다.\\n\\n처리일 : $date");
|
||
|
}
|
||
|
|
||
|
if ($mb['mb_leave_date'] && $mb['mb_leave_date'] <= date("Ymd", $g4['server_time'])) {
|
||
|
$date = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})/", "\\1년 \\2월 \\3일", $mb['mb_leave_date']);
|
||
|
gb_alert("탈퇴한 아이디이므로 접근하실 수 없습니다.\\n\\n탈퇴일 : $date");
|
||
|
}
|
||
|
|
||
|
if ($gb_config['cf_use_email_certify'] && !preg_match("/[1-9]/", $mb['mb_email_certify']))
|
||
|
gb_alert("메일인증을 받으셔야 로그인 하실 수 있습니다.\\n\\n회원님의 메일주소는 {$mb['mb_email']} 입니다.");
|
||
|
|
||
|
gb_set_session('ss_mb_id', $mb['mb_id']);
|
||
|
gb_set_session('ss_mb_key', md5($mb['mb_datetime'] . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']));
|
||
|
}
|