2022-09-17 20:50:50 +09:00
< ? php
2024-09-19 20:46:45 +09:00
if ( ! defined ( '_GNUBOARD_' ))
exit ;
include_once ( dirname ( __FILE__ ) . '/pbkdf2.compat.php' );
2022-09-17 20:50:50 +09:00
2024-09-19 20:57:55 +09:00
include_once __DIR__ . " /hook.lib.php " ;
include_once __DIR__ . '/Hook/hook.class.php' ;
include_once __DIR__ . '/Hook/hook.extends.class.php' ;
2022-09-17 20:50:50 +09:00
/*************************************************************************
2024-09-19 20:46:45 +09:00
**
** 일반 함수 모음
**
*************************************************************************/
2022-09-17 20:50:50 +09:00
// 마이크로 타임을 얻어 계산 형식으로 만듦
function get_microtime ()
{
2024-09-19 20:46:45 +09:00
list ( $usec , $sec ) = explode ( " " , microtime ());
return (( float ) $usec + ( float ) $sec );
2022-09-17 20:50:50 +09:00
}
// 한페이지에 보여줄 행, 현재페이지, 총페이지수, URL
2024-09-19 20:46:45 +09:00
function get_paging ( $write_pages , $cur_page , $total_page , $url , $add = " " )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
if ( ! $write_pages )
$write_pages = 5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
//$url = preg_replace('#&page=[0-9]*(&page=)$#', '$1', $url);
$url = preg_replace ( '#&page=[0-9]*#' , '' , $url ) . '&page=' ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$str = '' ;
if ( $cur_page > 1 ) {
$str .= '<a href="' . $url . '1' . $add . '" class="pg_control pg_start" title="처음으로"><i class="material-icons">keyboard_double_arrow_left</i></a>' . PHP_EOL ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$start_page = ((( int ) (( $cur_page - 1 ) / $write_pages )) * $write_pages ) + 1 ;
$end_page = $start_page + $write_pages - 1 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $end_page >= $total_page )
$end_page = $total_page ;
if ( $start_page > 1 )
$str .= '<a href="' . $url . ( $start_page - 1 ) . $add . '" class="pg_control pg_prev" title="이전"><i class="material-icons">navigate_before</i></a>' . PHP_EOL ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $total_page > 1 ) {
$str .= " <span class='pg-number-group'> " ;
for ( $k = $start_page ; $k <= $end_page ; $k ++ ) {
if ( $cur_page != $k )
$str .= '<a href="' . $url . $k . $add . '" class="pg_page">' . $k . '</a>' . PHP_EOL ;
else
$str .= '<strong class="pg_current pg_page">' . $k . '</strong>' . PHP_EOL ;
}
$str .= " </span> " ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $total_page > $end_page )
$str .= '<a href="' . $url . ( $end_page + 1 ) . $add . '" class="pg_control pg_next" title="다음"><i class="material-icons">navigate_next</i></a>' . PHP_EOL ;
if ( $cur_page < $total_page ) {
$str .= '<a href="' . $url . $total_page . $add . '" class="pg_control pg_end" title="마지막으로"><i class="material-icons">keyboard_double_arrow_right</i></a>' . PHP_EOL ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $str )
return " <nav class= \" pg_wrap \" ><span class= \" pg \" > { $str } </span></nav> " ;
else
return " " ;
2022-09-17 20:50:50 +09:00
}
// 페이징 코드의 <nav><span> 태그 다음에 코드를 삽입
function page_insertbefore ( $paging_html , $insert_html )
{
2024-09-19 20:46:45 +09:00
if ( ! $paging_html )
$paging_html = '<nav class="pg_wrap"><span class="pg"></span></nav>' ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return preg_replace ( " /^(<nav[^>]+><span[^>]+>)/ " , '$1' . $insert_html . PHP_EOL , $paging_html );
2022-09-17 20:50:50 +09:00
}
// 페이징 코드의 </span></nav> 태그 이전에 코드를 삽입
function page_insertafter ( $paging_html , $insert_html )
{
2024-09-19 20:46:45 +09:00
if ( ! $paging_html )
$paging_html = '<nav class="pg_wrap"><span class="pg"></span></nav>' ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( preg_match ( " # " . PHP_EOL . " </span></nav># " , $paging_html ))
$php_eol = '' ;
else
$php_eol = PHP_EOL ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return preg_replace ( " #(</span></nav>) $ # " , $php_eol . $insert_html . '$1' , $paging_html );
2022-09-17 20:50:50 +09:00
}
// 변수 또는 배열의 이름과 값을 얻어냄. print_r() 함수의 변형
function print_r2 ( $var )
{
2024-09-19 20:46:45 +09:00
ob_start ();
print_r ( $var );
$str = ob_get_contents ();
ob_end_clean ();
$str = str_replace ( " " , " " , $str );
echo nl2br ( " <span style='font-family:Tahoma, 굴림; font-size:9pt;'> $str </span> " );
2022-09-17 20:50:50 +09:00
}
// 메타태그를 이용한 URL 이동
// header("location:URL") 을 대체
function goto_url ( $url )
{
2024-09-19 20:46:45 +09:00
$url = str_replace ( " & " , " & " , $url );
//echo "<script> location.replace('$url'); </script>";
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! headers_sent ())
header ( 'Location: ' . $url );
else {
echo '<script>' ;
echo 'location.replace("' . $url . '");' ;
echo '</script>' ;
echo '<noscript>' ;
echo '<meta http-equiv="refresh" content="0;url=' . $url . '" />' ;
echo '</noscript>' ;
}
exit ;
2022-09-17 20:50:50 +09:00
}
// 세션변수 생성
function set_session ( $session_name , $value )
{
2024-09-19 20:46:45 +09:00
if ( PHP_VERSION < '5.3.0' )
session_register ( $session_name );
// PHP 버전별 차이를 없애기 위한 방법
$$session_name = $_SESSION [ $session_name ] = $value ;
2022-09-17 20:50:50 +09:00
}
// 세션변수값 얻음
function get_session ( $session_name )
{
2024-09-19 20:46:45 +09:00
return isset ( $_SESSION [ $session_name ]) ? $_SESSION [ $session_name ] : '' ;
2022-09-17 20:50:50 +09:00
}
// 쿠키변수 생성
function set_cookie ( $cookie_name , $value , $expire )
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
setcookie ( md5 ( $cookie_name ), base64_encode ( $value ), G5_SERVER_TIME + $expire , '/' , G5_COOKIE_DOMAIN );
2022-09-17 20:50:50 +09:00
}
// 쿠키변수값 얻음
function get_cookie ( $cookie_name )
{
2024-09-19 20:46:45 +09:00
$cookie = md5 ( $cookie_name );
if ( array_key_exists ( $cookie , $_COOKIE ))
return base64_decode ( $_COOKIE [ $cookie ]);
else
return " " ;
2022-09-17 20:50:50 +09:00
}
// 경고메세지를 경고창으로
2024-09-19 20:46:45 +09:00
function alert ( $msg = '' , $url = '' , $error = true , $post = false )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $g5 , $config , $member ;
global $is_admin ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! $msg )
$msg = '올바른 방법으로 이용해 주십시오.' ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$header = '' ;
if ( isset ( $g5 [ 'title' ])) {
$header = $g5 [ 'title' ];
}
include_once ( G5_BBS_PATH . '/alert.php' );
exit ;
2022-09-17 20:50:50 +09:00
}
// 경고메세지 출력후 창을 닫음
2024-09-19 20:46:45 +09:00
function alert_close ( $msg , $error = true )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$header = '' ;
if ( isset ( $g5 [ 'title' ])) {
$header = $g5 [ 'title' ];
}
include_once ( G5_BBS_PATH . '/alert_close.php' );
exit ;
2022-09-17 20:50:50 +09:00
}
// confirm 창
2024-09-19 20:46:45 +09:00
function confirm ( $msg , $url1 = '' , $url2 = '' , $url3 = '' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! $msg ) {
$msg = '올바른 방법으로 이용해 주십시오.' ;
alert ( $msg );
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! trim ( $url1 ) || ! trim ( $url2 )) {
$msg = '$url1 과 $url2 를 지정해 주세요.' ;
alert ( $msg );
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! $url3 )
$url3 = clean_xss_tags ( $_SERVER [ 'HTTP_REFERER' ]);
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$msg = str_replace ( " \\ n " , " <br> " , $msg );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$header = '' ;
if ( isset ( $g5 [ 'title' ])) {
$header = $g5 [ 'title' ];
}
include_once ( G5_BBS_PATH . '/confirm.php' );
exit ;
2022-09-17 20:50:50 +09:00
}
// way.co.kr 의 wayboard 참고
function url_auto_link ( $str )
{
2024-09-19 20:46:45 +09:00
global $g5 ;
global $config ;
// 140326 유창화님 제안코드로 수정
// http://sir.kr/pg_lecture/461
// http://sir.kr/pg_lecture/463
$str = str_replace ( array ( " < " , " > " , " & " , " " " , " " , " ' " ), array ( " \t _lt_ \t " , " \t _gt_ \t " , " & " , " \" " , " \t _nbsp_ \t " , " ' " ), $str );
//$str = preg_replace("`(?:(?:(?:href|src)\s*=\s*(?:\"|'|)){0})((http|https|ftp|telnet|news|mms)://[^\"'\s()]+)`", "<A HREF=\"\\1\" TARGET='{$config['cf_link_target']}'>\\1</A>", $str);
$str = preg_replace ( " /([^(href= \" ?'?)|(src= \" ?'?)]| \ (|^)((http|https|ftp|telnet|news|mms): \ / \ /[a-zA-Z0-9 \ .-]+ \ .[가-힣 \xA1 - \xFE a-zA-Z0-9 \ .:&#=_ \ ? \ /~ \ +%@; \ - \ | \ , \ ( \ )]+)/i " , " \\ 1<A HREF= \" \\ 2 \" TARGET= \" { $config [ 'cf_link_target' ] } \" > \\ 2</A> " , $str );
$str = preg_replace ( " /(^|[ \" ' \ s(])(www \ .[^ \" ' \ s()]+)/i " , " \\ 1<A HREF= \" http:// \\ 2 \" TARGET= \" { $config [ 'cf_link_target' ] } \" > \\ 2</A> " , $str );
$str = preg_replace ( " /[0-9a-z_-]+@[a-z0-9._-] { 4,}/i " , " <a href= \" mailto: \\ 0 \" > \\ 0</a> " , $str );
$str = str_replace ( array ( " \t _nbsp_ \t " , " \t _lt_ \t " , " \t _gt_ \t " , " ' " ), array ( " " , " < " , " > " , " ' " ), $str );
/*
// 속도 향상 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=' { $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='$config['cf_link_target']'>\\2</A>", $str);
// 100825 : () 추가
// 120315 : CHARSET 에 따라 링크시 글자 잘림 현상이 있어 수정
$str = preg_replace ( " /([^(HREF= \" ?'?)|(SRC= \" ?'?)]| \ (|^)((http|https|ftp|telnet|news|mms): \ / \ /[a-zA-Z0-9 \ .-]+ \ .[가-힣 \xA1 - \xFE a-zA-Z0-9 \ .:&#=_ \ ? \ /~ \ +%@; \ - \ | \ , \ ( \ )]+)/i " , " \\ 1<A HREF= \" \\ 2 \" TARGET=' { $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 ;
2022-09-17 20:50:50 +09:00
}
// url에 http:// 를 붙인다
function set_http ( $url )
{
2024-09-19 20:46:45 +09:00
if ( ! trim ( $url ))
return ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! preg_match ( " /^(http|https|ftp|telnet|news|mms) \ : \ / \ //i " , $url ))
$url = " http:// " . $url ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $url ;
2022-09-17 20:50:50 +09:00
}
// 파일의 용량을 구한다.
//function get_filesize($file)
function get_filesize ( $size )
{
2024-09-19 20:46:45 +09:00
//$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 ;
2022-09-17 20:50:50 +09:00
}
// 게시글에 첨부된 파일을 얻는다. (배열로 반환)
function get_file ( $bo_table , $wr_id )
{
2024-09-19 20:46:45 +09:00
global $g5 , $qstr ;
$file [ 'count' ] = 0 ;
$sql = " select * from { $g5 [ 'board_file_table' ] } where bo_table = ' $bo_table ' and wr_id = ' $wr_id ' order by bf_no " ;
$result = sql_query ( $sql );
while ( $row = sql_fetch_array ( $result )) {
$no = $row [ 'bf_no' ];
$file [ $no ][ 'href' ] = G5_BBS_URL . " /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' ] = G5_DATA_URL . '/file/' . $bo_table ;
$file [ $no ][ 'size' ] = get_filesize ( $row [ 'bf_filesize' ]);
$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' ];
$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 ;
2022-09-17 20:50:50 +09:00
}
// 폴더의 용량 ($dir는 / 없이 넘기세요)
function get_dirsize ( $dir )
{
2024-09-19 20:46:45 +09:00
$size = 0 ;
$d = dir ( $dir );
while ( $entry = $d -> read ()) {
if ( $entry != '.' && $entry != '..' ) {
$size += filesize ( $dir . '/' . $entry );
}
}
$d -> close ();
return $size ;
2022-09-17 20:50:50 +09:00
}
/*************************************************************************
2024-09-19 20:46:45 +09:00
**
** 그누보드 관련 함수 모음
**
*************************************************************************/
2022-09-17 20:50:50 +09:00
// 게시물 정보($write_row)를 출력하기 위하여 $list로 가공된 정보를 복사 및 가공
2024-09-19 20:46:45 +09:00
function get_list ( $write_row , $board , $skin_url , $subject_len = 40 )
{
global $g5 , $config ;
global $qstr , $page ;
//$t = get_microtime();
// 배열전체를 복사
$list = $write_row ;
unset ( $write_row );
$board_notice = array_map ( 'trim' , explode ( ',' , $board [ 'bo_notice' ]));
$list [ 'is_notice' ] = in_array ( $list [ 'wr_id' ], $board_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' ] || $board [ 'bo_type' ] == 'mmb' ) {
$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' ] = " <span class= \" cnt_cmt \" > " . $list [ 'wr_comment' ] . " </span> " ;
// 당일인 경우 시간으로 표시함
$list [ 'datetime' ] = substr ( $list [ 'wr_datetime' ], 0 , 10 );
$list [ 'datetime2' ] = $list [ 'wr_datetime' ];
if ( $list [ 'datetime' ] == G5_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' ] == G5_TIME_YMD )
$list [ 'last2' ] = substr ( $list [ 'last2' ], 11 , 5 );
else
$list [ 'last2' ] = substr ( $list [ 'last2' ], 5 , 5 );
$list [ 'wr_homepage' ] = get_text ( $list [ 'wr_homepage' ]);
$tmp_name = get_text ( cut_str ( $list [ 'wr_name' ], $config [ 'cf_cut_name' ])); // 설정된 자리수 만큼만 이름 출력
$tmp_name2 = cut_str ( $list [ 'wr_name' ], $config [ 'cf_cut_name' ]); // 설정된 자리수 만큼만 이름 출력
if ( $board [ 'bo_use_sideview' ])
$list [ 'name' ] = get_sideview ( $list [ 'mb_id' ], $tmp_name2 , $list [ 'wr_email' ], $list [ 'wr_homepage' ]);
else
$list [ 'name' ] = '<span class="' . ( $list [ 'mb_id' ] ? 'sv_member' : 'sv_guest' ) . '">' . $tmp_name . '</span>' ;
$reply = $list [ 'wr_reply' ];
$list [ 'reply' ] = strlen ( $reply ) * 10 ;
$list [ 'icon_reply' ] = '' ;
if ( $list [ 'reply' ])
$list [ 'icon_reply' ] = '<img src="' . $skin_url . '/img/icon_reply.gif" style="margin-left:' . $list [ 'reply' ] . 'px;" alt="답변글">' ;
$list [ 'icon_link' ] = '' ;
if ( $list [ 'wr_link1' ] || $list [ 'wr_link2' ])
$list [ 'icon_link' ] = '<img src="' . $skin_url . '/img/icon_link.gif" alt="관련링크">' ;
// 분류명 링크
$list [ 'ca_name_href' ] = G5_BBS_URL . '/board.php?bo_table=' . $board [ 'bo_table' ] . '&sca=' . urlencode ( $list [ 'ca_name' ]);
$list [ 'href' ] = G5_BBS_URL . '/board.php?bo_table=' . $board [ 'bo_table' ] . '&wr_id=' . $list [ 'wr_id' ] . $qstr ;
$list [ 'comment_href' ] = $list [ 'href' ];
$list [ 'icon_new' ] = '' ;
if ( $board [ 'bo_new' ] && $list [ 'wr_datetime' ] >= date ( " Y-m-d H:i:s " , G5_SERVER_TIME - ( $board [ 'bo_new' ] * 3600 )))
$list [ 'icon_new' ] = '<img src="' . $skin_url . '/img/icon_new.gif" alt="새글">' ;
$list [ 'icon_hot' ] = '' ;
if ( $board [ 'bo_hot' ] && $list [ 'wr_hit' ] >= $board [ 'bo_hot' ])
$list [ 'icon_hot' ] = '<img src="' . $skin_url . '/img/icon_hot.gif" alt="인기글">' ;
$list [ 'icon_secret' ] = '' ;
if ( strstr ( $list [ 'wr_option' ], 'secret' ))
$list [ 'icon_secret' ] = '<img src="' . $skin_url . '/img/icon_secret.gif" alt="비밀글">' ;
// 링크
for ( $i = 1 ; $i <= G5_LINK_COUNT ; $i ++ ) {
$list [ 'link' ][ $i ] = set_http ( get_text ( $list [ " wr_link { $i } " ]));
$list [ 'link_href' ][ $i ] = G5_BBS_URL . '/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 " ];
}
// 가변 파일
if ( $board [ 'bo_use_list_file' ] || ( $list [ 'wr_file' ] && $subject_len == 255 ) /* view 인 경우 */ ) {
$list [ 'file' ] = get_file ( $board [ 'bo_table' ], $list [ 'wr_id' ]);
} else {
$list [ 'file' ][ 'count' ] = $list [ 'wr_file' ];
}
if ( $list [ 'file' ][ 'count' ])
$list [ 'icon_file' ] = '<img src="' . $skin_url . '/img/icon_file.gif" alt="첨부파일">' ;
return $list ;
2022-09-17 20:50:50 +09:00
}
// get_list 의 alias
function get_view ( $write_row , $board , $skin_url )
{
2024-09-19 20:46:45 +09:00
return get_list ( $write_row , $board , $skin_url , 255 );
2022-09-17 20:50:50 +09:00
}
// set_search_font(), get_search_font() 함수를 search_font() 함수로 대체
function search_font ( $stx , $str )
{
2024-09-19 20:46:45 +09:00
global $config ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 문자앞에 \ 를 붙입니다.
$src = array ( '/' , '|' );
$dst = array ( '\/' , '\|' );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! trim ( $stx ))
return $str ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 검색어 전체를 공란으로 나눈다
$s = explode ( ' ' , $stx );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// "/(검색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 = " | " ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 지정된 검색 폰트의 색상, 배경색상으로 대체
$replace = " <b class= \" sch_word \" > \\ 1</b> " ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return preg_replace ( " /( $pattern )/i " , $replace , $str );
2022-09-17 20:50:50 +09:00
}
// 제목을 변환
2024-09-19 20:46:45 +09:00
function conv_subject ( $subject , $len , $suffix = '' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
return get_text ( cut_str ( $subject , $len , $suffix ));
2022-09-17 20:50:50 +09:00
}
// 내용을 변환
2024-09-19 20:46:45 +09:00
function conv_content ( $content , $html , $filter = true )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $config , $board ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $html ) {
$source = array ();
$target = array ();
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$source [] = " // " ;
$target [] = " " ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $html == 2 ) { // 자동 줄바꿈
$source [] = " / \n / " ;
$target [] = " <br/> " ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 테이블 태그의 개수를 세어 테이블이 깨지지 않도록 한다.
$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> " ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$content = preg_replace ( $source , $target , $content );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $filter )
$content = html_purifier ( $content );
} else // text 이면
{
// & 처리 : & 등의 코드를 정상 출력함
$content = html_symbol ( $content );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 공백 처리
//$content = preg_replace("/ /", " ", $content);
$content = str_replace ( " " , " " , $content );
$content = str_replace ( " \n " , " \n " , $content );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$content = get_text ( $content , 1 );
$content = url_auto_link ( $content );
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $content ;
2022-09-17 20:50:50 +09:00
}
// http://htmlpurifier.org/
// Standards-Compliant HTML Filtering
// Safe : HTML Purifier defeats XSS with an audited whitelist
// Clean : HTML Purifier ensures standards-compliant output
// Open : HTML Purifier is open-source and highly customizable
function html_purifier ( $html )
{
2024-09-19 20:46:45 +09:00
$f = file ( G5_PLUGIN_PATH . '/htmlpurifier/safeiframe.txt' );
$domains = array ();
foreach ( $f as $domain ) {
// 첫행이 # 이면 주석 처리
if ( ! preg_match ( " /^#/ " , $domain )) {
$domain = trim ( $domain );
if ( $domain )
array_push ( $domains , $domain );
}
}
// 내 도메인도 추가
array_push ( $domains , $_SERVER [ 'HTTP_HOST' ] . '/' );
$safeiframe = implode ( '|' , $domains );
include_once ( G5_PLUGIN_PATH . '/htmlpurifier/HTMLPurifier.standalone.php' );
$config = HTMLPurifier_Config :: createDefault ();
// data/cache 디렉토리에 CSS, HTML, URI 디렉토리 등을 만든다.
$config -> set ( 'Cache.SerializerPath' , G5_DATA_PATH . '/cache' );
$config -> set ( 'HTML.SafeEmbed' , false );
$config -> set ( 'HTML.SafeObject' , false );
$config -> set ( 'Output.FlashCompat' , false );
$config -> set ( 'HTML.SafeIframe' , true );
$config -> set ( 'URI.SafeIframeRegexp' , '%^(https?:)?//(' . $safeiframe . ')%' );
$config -> set ( 'Attr.AllowedFrameTargets' , array ( '_blank' ));
$purifier = new HTMLPurifier ( $config );
return $purifier -> purify ( $html );
2022-09-17 20:50:50 +09:00
}
// 검색 구문을 얻는다.
2024-09-19 20:46:45 +09:00
function get_sql_search ( $search_ca_name , $search_field , $search_text , $search_operator = 'and' )
{
global $g5 ;
$str = " " ;
if ( $search_ca_name )
$str = " ca_name = ' $search_ca_name ' " ;
$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 = " " ;
if ( ! empty ( $tmp [ 1 ]))
$not_comment = $tmp [ 1 ];
$str .= " ( " ;
for ( $i = 0 ; $i < count ( $s ); $i ++ ) {
// 검색어
$search_str = trim ( $s [ $i ]);
if ( $search_str == " " )
continue ;
// 인기검색어
insert_popular ( $field , $search_str );
$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 ;
2022-09-17 20:50:50 +09:00
}
// 게시판 테이블에서 하나의 행을 읽음
function get_write ( $write_table , $wr_id )
{
2024-09-19 20:46:45 +09:00
return sql_fetch ( " select * from $write_table where wr_id = ' $wr_id ' " );
2022-09-17 20:50:50 +09:00
}
// 게시판의 다음글 번호를 얻는다.
function get_next_num ( $table )
{
2024-09-19 20:46:45 +09:00
// 가장 작은 번호를 얻어
$sql = " select min(wr_num) as min_wr_num from $table " ;
$row = sql_fetch ( $sql );
// 가장 작은 번호에 1을 빼서 넘겨줌
return ( int ) ( $row [ 'min_wr_num' ] - 1 );
2022-09-17 20:50:50 +09:00
}
// 그룹 설정 테이블에서 하나의 행을 읽음
function get_group ( $gr_id )
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return sql_fetch ( " select * from { $g5 [ 'group_table' ] } where gr_id = ' $gr_id ' " );
2022-09-17 20:50:50 +09:00
}
// 회원 정보를 얻는다.
2024-09-19 20:46:45 +09:00
function get_member ( $mb_id , $fields = '*' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return sql_fetch ( " select $fields from { $g5 [ 'member_table' ] } where mb_id = TRIM(' $mb_id ') " );
2022-09-17 20:50:50 +09:00
}
// 날짜, 조회수의 경우 높은 순서대로 보여져야 하므로 $flag 를 추가
// $flag : asc 낮은 순서 , desc 높은 순서
// 제목별로 컬럼 정렬하는 QUERY STRING
2024-09-19 20:46:45 +09:00
function subject_sort_link ( $col , $query_string = '' , $flag = 'asc' )
{
global $sst , $sod , $sfl , $stx , $page , $sca ;
$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' ;
}
}
}
$arr_query = array ();
$arr_query [] = $query_string ;
$arr_query [] = $q1 ;
$arr_query [] = $q2 ;
$arr_query [] = 'sfl=' . $sfl ;
$arr_query [] = 'stx=' . $stx ;
$arr_query [] = 'sca=' . $sca ;
$arr_query [] = 'page=' . $page ;
$qstr = implode ( " & " , $arr_query );
return " <a href= \" { $_SERVER [ 'SCRIPT_NAME' ] } ? { $qstr } \" > " ;
2022-09-17 20:50:50 +09:00
}
// 관리자 정보를 얻음
2024-09-19 20:46:45 +09:00
function get_admin ( $admin = 'super' , $fields = '*' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $config , $group , $board ;
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$is = false ;
if ( $admin == 'board' ) {
$mb = sql_fetch ( " select { $fields } from { $g5 [ 'member_table' ] } where mb_id in (' { $board [ 'bo_admin' ] } ') limit 1 " );
$is = true ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if (( $is && ! $mb [ 'mb_id' ]) || $admin == 'group' ) {
$mb = sql_fetch ( " select { $fields } from { $g5 [ 'member_table' ] } where mb_id in (' { $group [ 'gr_admin' ] } ') limit 1 " );
$is = true ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if (( $is && ! $mb [ 'mb_id' ]) || $admin == 'super' ) {
$mb = sql_fetch ( " select { $fields } from { $g5 [ 'member_table' ] } where mb_id in (' { $config [ 'cf_admin' ] } ') limit 1 " );
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $mb ;
2022-09-17 20:50:50 +09:00
}
// 관리자인가?
function is_admin ( $mb_id )
{
2024-09-19 20:46:45 +09:00
global $config , $group , $board ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! $mb_id )
return ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$mb = get_member ( $mb_id );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $config [ 'cf_admin' ] == $mb_id || $mb [ 'mb_level' ] == 10 )
return 'super' ;
if ( isset ( $group [ 'gr_admin' ]) && ( $group [ 'gr_admin' ] == $mb_id ))
return 'group' ;
if ( isset ( $board [ 'bo_admin' ]) && ( $board [ 'bo_admin' ] == $mb_id ))
return 'board' ;
return '' ;
2022-09-17 20:50:50 +09:00
}
// 분류 옵션을 얻음
// 4.00 에서는 카테고리 테이블을 없애고 보드테이블에 있는 내용으로 대체
2024-09-19 20:46:45 +09:00
function get_category_option ( $bo_table = '' , $ca_name = '' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $g5 , $board , $is_admin ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$categories = explode ( " | " , $board [ 'bo_category_list' ] . ( $is_admin ? " |공지 " : " " )); // 구분자가 | 로 되어 있음
$str = " " ;
for ( $i = 0 ; $i < count ( $categories ); $i ++ ) {
$category = trim ( $categories [ $i ]);
if ( ! $category )
continue ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$str .= " <option value= \" $categories[$i] \" " ;
if ( $category == $ca_name ) {
$str .= ' selected="selected"' ;
}
$str .= " > $categories[$i] </option> \n " ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $str ;
2022-09-17 20:50:50 +09:00
}
// 게시판 그룹을 SELECT 형식으로 얻음
2024-09-19 20:46:45 +09:00
function get_group_select ( $name , $selected = '' , $event = '' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $g5 , $is_admin , $member ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$sql = " select gr_id, gr_subject from { $g5 [ 'group_table' ] } a " ;
if ( $is_admin == " group " ) {
$sql .= " left join { $g5 [ 'member_table' ] } b on (b.mb_id = a.gr_admin)
2022-09-17 20:50:50 +09:00
where b . mb_id = '{$member[' mb_id ']}' " ;
2024-09-19 20:46:45 +09:00
}
$sql .= " order by a.gr_id " ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$result = sql_query ( $sql );
$str = " <select id= \" $name\ " name = \ " $name\ " $event > \n " ;
for ( $i = 0 ; $row = sql_fetch_array ( $result ); $i ++ ) {
if ( $i == 0 )
$str .= " <option value= \" \" >선택</option> " ;
$str .= option_selected ( $row [ 'gr_id' ], $selected , $row [ 'gr_subject' ]);
}
$str .= " </select> " ;
return $str ;
2022-09-17 20:50:50 +09:00
}
2024-09-19 20:46:45 +09:00
function option_selected ( $value , $selected , $text = '' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
if ( ! $text )
$text = $value ;
if ( $value == $selected )
return " <option value= \" $value\ " selected = \ " selected \" > $text </option> \n " ;
else
return " <option value= \" $value\ " > $text </ option > \n " ;
2022-09-17 20:50:50 +09:00
}
// '예', '아니오'를 SELECT 형식으로 얻음
2024-09-19 20:46:45 +09:00
function get_yn_select ( $name , $selected = '1' , $event = '' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
$str = " <select name= \" $name\ " $event > \n " ;
if ( $selected ) {
$str .= " <option value= \" 1 \" selected>예</option> \n " ;
$str .= " <option value= \" 0 \" >아니오</option> \n " ;
} else {
$str .= " <option value= \" 1 \" >예</option> \n " ;
$str .= " <option value= \" 0 \" selected>아니오</option> \n " ;
}
$str .= " </select> " ;
return $str ;
2022-09-17 20:50:50 +09:00
}
// 포인트 부여
2024-09-19 20:46:45 +09:00
function insert_point ( $mb_id , $point , $content = '' , $rel_table = '' , $rel_id = '' , $rel_action = '' , $expire = 0 )
{
global $config ;
global $g5 ;
global $is_admin ;
// 포인트 사용을 하지 않는다면 return
if ( ! $config [ 'cf_use_point' ]) {
return 0 ;
}
// 포인트가 없다면 업데이트 할 필요 없음
if ( $point == 0 ) {
return 0 ;
}
// 회원아이디가 없다면 업데이트 할 필요 없음
if ( $mb_id == '' ) {
return 0 ;
}
$mb = sql_fetch ( " select mb_id from { $g5 [ 'member_table' ] } where mb_id = ' $mb_id ' " );
if ( ! $mb [ 'mb_id' ]) {
return 0 ;
}
// 회원포인트
$mb_point = get_point_sum ( $mb_id );
// 이미 등록된 내역이라면 건너뜀
if ( $rel_table || $rel_id || $rel_action ) {
$sql = " select count(*) as cnt from { $g5 [ 'point_table' ] }
2022-09-17 20:50:50 +09:00
where mb_id = '$mb_id'
and po_rel_table = '$rel_table'
and po_rel_id = '$rel_id'
and po_rel_action = '$rel_action' " ;
2024-09-19 20:46:45 +09:00
$row = sql_fetch ( $sql );
if ( $row [ 'cnt' ])
return - 1 ;
}
// 포인트 건별 생성
$po_expire_date = '9999-12-31' ;
if ( $config [ 'cf_point_term' ] > 0 ) {
if ( $expire > 0 )
$po_expire_date = date ( 'Y-m-d' , strtotime ( '+' . ( $expire - 1 ) . ' days' , G5_SERVER_TIME ));
else
$po_expire_date = date ( 'Y-m-d' , strtotime ( '+' . ( $config [ 'cf_point_term' ] - 1 ) . ' days' , G5_SERVER_TIME ));
}
$po_expired = 0 ;
if ( $point < 0 ) {
$po_expired = 1 ;
$po_expire_date = G5_TIME_YMD ;
}
$po_mb_point = $mb_point + $point ;
$sql = " insert into { $g5 [ 'point_table' ] }
2022-09-17 20:50:50 +09:00
set mb_id = '$mb_id' ,
2024-09-19 20:46:45 +09:00
po_datetime = '" . G5_TIME_YMDHIS . "' ,
po_content = '" . addslashes($content) . "' ,
2022-09-17 20:50:50 +09:00
po_point = '$point' ,
po_use_point = '0' ,
po_mb_point = '$po_mb_point' ,
po_expired = '$po_expired' ,
po_expire_date = '$po_expire_date' ,
po_rel_table = '$rel_table' ,
po_rel_id = '$rel_id' ,
po_rel_action = '$rel_action' " ;
2024-09-19 20:46:45 +09:00
sql_query ( $sql );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 포인트를 사용한 경우 포인트 내역에 사용금액 기록
if ( $point < 0 ) {
insert_use_point ( $mb_id , $point );
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 포인트 UPDATE
$sql = " update { $g5 [ 'member_table' ] } set mb_point = ' $po_mb_point ' where mb_id = ' $mb_id ' " ;
sql_query ( $sql );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return 1 ;
2022-09-17 20:50:50 +09:00
}
// 사용포인트 입력
2024-09-19 20:46:45 +09:00
function insert_use_point ( $mb_id , $point , $po_id = '' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $g5 , $config ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $config [ 'cf_point_term' ])
$sql_order = " order by po_expire_date asc, po_id asc " ;
else
$sql_order = " order by po_id asc " ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$point1 = abs ( $point );
$sql = " select po_id, po_point, po_use_point
2022-09-17 20:50:50 +09:00
from { $g5 [ 'point_table' ]}
where mb_id = '$mb_id'
and po_id <> '$po_id'
and po_expired = '0'
and po_point > po_use_point
$sql_order " ;
2024-09-19 20:46:45 +09:00
$result = sql_query ( $sql );
for ( $i = 0 ; $row = sql_fetch_array ( $result ); $i ++ ) {
$point2 = $row [ 'po_point' ];
$point3 = $row [ 'po_use_point' ];
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if (( $point2 - $point3 ) > $point1 ) {
$sql = " update { $g5 [ 'point_table' ] }
2022-09-17 20:50:50 +09:00
set po_use_point = po_use_point + '$point1'
where po_id = '{$row[' po_id ']}' " ;
2024-09-19 20:46:45 +09:00
sql_query ( $sql );
break ;
} else {
$point4 = $point2 - $point3 ;
$sql = " update { $g5 [ 'point_table' ] }
2022-09-17 20:50:50 +09:00
set po_use_point = po_use_point + '$point4' ,
po_expired = '100'
where po_id = '{$row[' po_id ']}' " ;
2024-09-19 20:46:45 +09:00
sql_query ( $sql );
$point1 -= $point4 ;
}
}
2022-09-17 20:50:50 +09:00
}
// 사용포인트 삭제
function delete_use_point ( $mb_id , $point )
{
2024-09-19 20:46:45 +09:00
global $g5 , $config ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $config [ 'cf_point_term' ])
$sql_order = " order by po_expire_date desc, po_id desc " ;
else
$sql_order = " order by po_id desc " ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$point1 = abs ( $point );
$sql = " select po_id, po_use_point, po_expired, po_expire_date
2022-09-17 20:50:50 +09:00
from { $g5 [ 'point_table' ]}
where mb_id = '$mb_id'
and po_expired <> '1'
and po_use_point > 0
$sql_order " ;
2024-09-19 20:46:45 +09:00
$result = sql_query ( $sql );
for ( $i = 0 ; $row = sql_fetch_array ( $result ); $i ++ ) {
$point2 = $row [ 'po_use_point' ];
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$po_expired = $row [ 'po_expired' ];
if ( $row [ 'po_expired' ] == 100 && ( $row [ 'po_expire_date' ] == '9999-12-31' || $row [ 'po_expire_date' ] >= G5_TIME_YMD ))
$po_expired = 0 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $point2 > $point1 ) {
$sql = " update { $g5 [ 'point_table' ] }
2022-09-17 20:50:50 +09:00
set po_use_point = po_use_point - '$point1' ,
po_expired = '$po_expired'
where po_id = '{$row[' po_id ']}' " ;
2024-09-19 20:46:45 +09:00
sql_query ( $sql );
break ;
} else {
$sql = " update { $g5 [ 'point_table' ] }
2022-09-17 20:50:50 +09:00
set po_use_point = '0' ,
po_expired = '$po_expired'
where po_id = '{$row[' po_id ']}' " ;
2024-09-19 20:46:45 +09:00
sql_query ( $sql );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$point1 -= $point2 ;
}
}
2022-09-17 20:50:50 +09:00
}
// 소멸포인트 삭제
function delete_expire_point ( $mb_id , $point )
{
2024-09-19 20:46:45 +09:00
global $g5 , $config ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$point1 = abs ( $point );
$sql = " select po_id, po_use_point, po_expired, po_expire_date
2022-09-17 20:50:50 +09:00
from { $g5 [ 'point_table' ]}
where mb_id = '$mb_id'
and po_expired = '1'
and po_point >= 0
and po_use_point > 0
order by po_expire_date desc , po_id desc " ;
2024-09-19 20:46:45 +09:00
$result = sql_query ( $sql );
for ( $i = 0 ; $row = sql_fetch_array ( $result ); $i ++ ) {
$point2 = $row [ 'po_use_point' ];
$po_expired = '0' ;
$po_expire_date = '9999-12-31' ;
if ( $config [ 'cf_point_term' ] > 0 )
$po_expire_date = date ( 'Y-m-d' , strtotime ( '+' . ( $config [ 'cf_point_term' ] - 1 ) . ' days' , G5_SERVER_TIME ));
if ( $point2 > $point1 ) {
$sql = " update { $g5 [ 'point_table' ] }
2022-09-17 20:50:50 +09:00
set po_use_point = po_use_point - '$point1' ,
po_expired = '$po_expired' ,
po_expire_date = '$po_expire_date'
where po_id = '{$row[' po_id ']}' " ;
2024-09-19 20:46:45 +09:00
sql_query ( $sql );
break ;
} else {
$sql = " update { $g5 [ 'point_table' ] }
2022-09-17 20:50:50 +09:00
set po_use_point = '0' ,
po_expired = '$po_expired' ,
po_expire_date = '$po_expire_date'
where po_id = '{$row[' po_id ']}' " ;
2024-09-19 20:46:45 +09:00
sql_query ( $sql );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$point1 -= $point2 ;
}
}
2022-09-17 20:50:50 +09:00
}
// 포인트 내역 합계
function get_point_sum ( $mb_id )
{
2024-09-19 20:46:45 +09:00
global $g5 , $config ;
if ( $config [ 'cf_point_term' ] > 0 ) {
// 소멸포인트가 있으면 내역 추가
$expire_point = get_expire_point ( $mb_id );
if ( $expire_point > 0 ) {
$mb = get_member ( $mb_id , 'mb_point' );
$content = '포인트 소멸' ;
$rel_table = '@expire' ;
$rel_id = $mb_id ;
$rel_action = 'expire' . '-' . uniqid ( '' );
$point = $expire_point * ( - 1 );
$po_mb_point = $mb [ 'mb_point' ] + $point ;
$po_expire_date = G5_TIME_YMD ;
$po_expired = 1 ;
$sql = " insert into { $g5 [ 'point_table' ] }
2022-09-17 20:50:50 +09:00
set mb_id = '$mb_id' ,
2024-09-19 20:46:45 +09:00
po_datetime = '" . G5_TIME_YMDHIS . "' ,
po_content = '" . addslashes($content) . "' ,
2022-09-17 20:50:50 +09:00
po_point = '$point' ,
po_use_point = '0' ,
po_mb_point = '$po_mb_point' ,
po_expired = '$po_expired' ,
po_expire_date = '$po_expire_date' ,
po_rel_table = '$rel_table' ,
po_rel_id = '$rel_id' ,
po_rel_action = '$rel_action' " ;
2024-09-19 20:46:45 +09:00
sql_query ( $sql );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 포인트를 사용한 경우 포인트 내역에 사용금액 기록
if ( $point < 0 ) {
insert_use_point ( $mb_id , $point );
}
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 유효기간이 있을 때 기간이 지난 포인트 expired 체크
$sql = " update { $g5 [ 'point_table' ] }
2022-09-17 20:50:50 +09:00
set po_expired = '1'
where mb_id = '$mb_id'
and po_expired <> '1'
and po_expire_date <> '9999-12-31'
2024-09-19 20:46:45 +09:00
and po_expire_date < '" . G5_TIME_YMD . "' " ;
sql_query ( $sql );
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 포인트합
$sql = " select sum(po_point) as sum_po_point
2022-09-17 20:50:50 +09:00
from { $g5 [ 'point_table' ]}
where mb_id = '$mb_id' " ;
2024-09-19 20:46:45 +09:00
$row = sql_fetch ( $sql );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $row [ 'sum_po_point' ];
2022-09-17 20:50:50 +09:00
}
// 소멸 포인트
function get_expire_point ( $mb_id )
{
2024-09-19 20:46:45 +09:00
global $g5 , $config ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $config [ 'cf_point_term' ] == 0 )
return 0 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$sql = " select sum(po_point - po_use_point) as sum_point
2022-09-17 20:50:50 +09:00
from { $g5 [ 'point_table' ]}
where mb_id = '$mb_id'
and po_expired = '0'
and po_expire_date <> '9999-12-31'
2024-09-19 20:46:45 +09:00
and po_expire_date < '" . G5_TIME_YMD . "' " ;
$row = sql_fetch ( $sql );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $row [ 'sum_point' ];
2022-09-17 20:50:50 +09:00
}
// 포인트 삭제
function delete_point ( $mb_id , $rel_table , $rel_id , $rel_action )
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$result = false ;
if ( $rel_table || $rel_id || $rel_action ) {
// 포인트 내역정보
$sql = " select * from { $g5 [ 'point_table' ] }
2022-09-17 20:50:50 +09:00
where mb_id = '$mb_id'
and po_rel_table = '$rel_table'
and po_rel_id = '$rel_id'
and po_rel_action = '$rel_action' " ;
2024-09-19 20:46:45 +09:00
$row = sql_fetch ( $sql );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $row [ 'po_point' ] < 0 ) {
$mb_id = $row [ 'mb_id' ];
$po_point = abs ( $row [ 'po_point' ]);
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
delete_use_point ( $mb_id , $po_point );
} else {
if ( $row [ 'po_use_point' ] > 0 ) {
insert_use_point ( $row [ 'mb_id' ], $row [ 'po_use_point' ], $row [ 'po_id' ]);
}
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$result = sql_query ( " delete from { $g5 [ 'point_table' ] }
2022-09-17 20:50:50 +09:00
where mb_id = '$mb_id'
and po_rel_table = '$rel_table'
and po_rel_id = '$rel_id'
and po_rel_action = '$rel_action' " , false);
2024-09-19 20:46:45 +09:00
// po_mb_point에 반영
$sql = " update { $g5 [ 'point_table' ] }
2022-09-17 20:50:50 +09:00
set po_mb_point = po_mb_point - '{$row[' po_point ']}'
where mb_id = '$mb_id'
and po_id > '{$row[' po_id ']}' " ;
2024-09-19 20:46:45 +09:00
sql_query ( $sql );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 포인트 내역의 합을 구하고
$sum_point = get_point_sum ( $mb_id );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 포인트 UPDATE
$sql = " update { $g5 [ 'member_table' ] } set mb_point = ' $sum_point ' where mb_id = ' $mb_id ' " ;
$result = sql_query ( $sql );
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $result ;
2022-09-17 20:50:50 +09:00
}
// 회원 레이어
2024-09-19 20:46:45 +09:00
function get_sideview ( $mb_id , $name = '' , $email = '' , $homepage = '' )
{
global $config ;
global $g5 ;
global $bo_table , $sca , $is_admin , $member ;
$email_enc = new str_encrypt ();
$email = $email_enc -> encrypt ( $email );
$homepage = set_http ( clean_xss_tags ( $homepage ));
$name = get_text ( $name , 0 , true );
$email = get_text ( $email );
$homepage = get_text ( $homepage );
$tmp_name = " " ;
if ( $mb_id ) {
//$tmp_name = "<a href=\"".G5_BBS_URL."/profile.php?mb_id=".$mb_id."\" class=\"sv_member\" title=\"$name 자기소개\" target=\"_blank\" onclick=\"return false;\">$name</a>";
$tmp_name = '<a href="' . G5_BBS_URL . '/profile.php?mb_id=' . $mb_id . '" class="sv_member" title="' . $name . ' 자기소개" target="_blank" onclick="return false;">' ;
if ( $config [ 'cf_use_member_icon' ]) {
$mb_dir = substr ( $mb_id , 0 , 2 );
$icon_file = G5_DATA_PATH . '/member/' . $mb_dir . '/' . $mb_id . '.gif' ;
if ( file_exists ( $icon_file )) {
$width = $config [ 'cf_member_icon_width' ];
$height = $config [ 'cf_member_icon_height' ];
$icon_file_url = G5_DATA_URL . '/member/' . $mb_dir . '/' . $mb_id . '.gif' ;
$tmp_name .= '<img src="' . $icon_file_url . '" width="' . $width . '" height="' . $height . '" alt="">' ;
if ( $config [ 'cf_use_member_icon' ] == 2 ) // 회원아이콘+이름
$tmp_name = $tmp_name . ' ' . $name ;
} else {
$tmp_name = $tmp_name . " " . $name ;
}
} else {
$tmp_name = $tmp_name . ' ' . $name ;
}
$tmp_name .= '</a>' ;
$title_mb_id = '[' . $mb_id . ']' ;
} else {
if ( ! $bo_table )
return $name ;
$tmp_name = '<a href="' . G5_BBS_URL . '/board.php?bo_table=' . $bo_table . '&sca=' . $sca . '&sfl=wr_name,1&stx=' . $name . '" title="' . $name . ' 이름으로 검색" class="sv_guest" onclick="return false;">' . $name . '</a>' ;
$title_mb_id = '[비회원]' ;
}
$str = " <span class= \" sv_wrap \" > \n " ;
$str .= $tmp_name . " \n " ;
$str2 = " <span class= \" sv \" > \n " ;
if ( $mb_id )
$str2 .= " <a href= \" " . G5_BBS_URL . " /memo_form.php?me_recv_mb_id= " . $mb_id . " \" onclick= \" win_memo(this.href); return false; \" >쪽지보내기</a> \n " ;
if ( $email )
$str2 .= " <a href= \" " . G5_BBS_URL . " /formmail.php?mb_id= " . $mb_id . " &name= " . urlencode ( $name ) . " &email= " . $email . " \" onclick= \" win_email(this.href); return false; \" >메일보내기</a> \n " ;
if ( $homepage )
$str2 .= " <a href= \" " . $homepage . " \" target= \" _blank \" >홈페이지</a> \n " ;
if ( $mb_id )
$str2 .= " <a href= \" " . G5_BBS_URL . " /profile.php?mb_id= " . $mb_id . " \" onclick= \" win_profile(this.href); return false; \" >자기소개</a> \n " ;
if ( $bo_table ) {
if ( $mb_id )
$str2 .= " <a href= \" " . G5_BBS_URL . " /board.php?bo_table= " . $bo_table . " &sca= " . $sca . " &sfl=mb_id,1&stx= " . $mb_id . " \" >아이디로 검색</a> \n " ;
else
$str2 .= " <a href= \" " . G5_BBS_URL . " /board.php?bo_table= " . $bo_table . " &sca= " . $sca . " &sfl=wr_name,1&stx= " . $name . " \" >이름으로 검색</a> \n " ;
}
if ( $mb_id )
$str2 .= " <a href= \" " . G5_BBS_URL . " /new.php?mb_id= " . $mb_id . " \" >전체게시물</a> \n " ;
if ( $is_admin == " super " && $mb_id ) {
$str2 .= " <a href= \" " . G5_ADMIN_URL . " /member_form.php?w=u&mb_id= " . $mb_id . " \" target= \" _blank \" >회원정보변경</a> \n " ;
$str2 .= " <a href= \" " . G5_ADMIN_URL . " /point_list.php?sfl=mb_id&stx= " . $mb_id . " \" target= \" _blank \" >포인트내역</a> \n " ;
}
$str2 .= " </span> \n " ;
$str .= $str2 ;
$str .= " \n <noscript class= \" sv_nojs \" > " . $str2 . " </noscript> " ;
$str .= " </span> " ;
return $str ;
2022-09-17 20:50:50 +09:00
}
// 파일을 보이게 하는 링크 (이미지, 플래쉬, 동영상)
2024-09-19 20:46:45 +09:00
function view_file_link ( $file , $width , $height , $content = '' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $config , $board ;
global $g5 ;
static $ids ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! $file )
return ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$ids ++ ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 파일의 폭이 게시판설정의 이미지폭 보다 크다면 게시판설정 폭으로 맞추고 비율에 따라 높이를 계산
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 );
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 폭이 있는 경우 폭과 높이의 속성을 주고, 없으면 자동 계산되도록 코드를 만들지 않는다.
if ( $width )
$attr = ' width="' . $width . '" height="' . $height . '" ' ;
else
$attr = '' ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( preg_match ( " / \ .( { $config [ 'cf_image_extension' ] } ) $ /i " , $file )) {
$img = '<a href="' . G5_BBS_URL . '/view_image.php?bo_table=' . $board [ 'bo_table' ] . '&fn=' . urlencode ( $file ) . '" target="_blank" class="view_image">' ;
$img .= '<img src="' . G5_DATA_URL . '/file/' . $board [ 'bo_table' ] . '/' . urlencode ( $file ) . '" alt="' . $content . '" ' . $attr . '>' ;
$img .= '</a>' ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $img ;
}
2022-09-17 20:50:50 +09:00
}
// view_file_link() 함수에서 넘겨진 이미지를 보이게 합니다.
// {img:0} ... {img:n} 과 같은 형식
function view_image ( $view , $number , $attribute )
{
2024-09-19 20:46:45 +09:00
if ( $view [ 'file' ][ $number ][ 'view' ])
return preg_replace ( " /> $ / " , " $attribute > " , $view [ 'file' ][ $number ][ 'view' ]);
else
//return "{".$number."번 이미지 없음}";
return " " ;
2022-09-17 20:50:50 +09:00
}
/*
// {link:0} ... {link:n} 과 같은 형식
function view_link ( $view , $number , $attribute )
{
2024-09-19 20:46:45 +09:00
global $config ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $view [ 'link' ][ $number ][ 'link' ])
{
if ( ! preg_match ( " /target/i " , $attribute ))
$attribute .= " target=' $config['cf_link_target'] ' " ;
return " <a href=' { $view [ 'link' ][ $number ][ 'href' ] } ' $attribute > { $view [ 'link' ][ $number ][ 'link' ] } </a> " ;
}
else
return " { " . $number . " 번 링크 없음} " ;
2022-09-17 20:50:50 +09:00
}
*/
2024-09-19 20:46:45 +09:00
function cut_str ( $str , $len , $suffix = " … " )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
$arr_str = preg_split ( " //u " , $str , - 1 , PREG_SPLIT_NO_EMPTY );
$str_len = count ( $arr_str );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $str_len >= $len ) {
$slice_str = array_slice ( $arr_str , 0 , $len );
$str = join ( " " , $slice_str );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $str . ( $str_len > $len ? $suffix : '' );
} else {
$str = join ( " " , $arr_str );
return $str ;
}
2022-09-17 20:50:50 +09:00
}
// TEXT 형식으로 변환
2024-09-19 20:46:45 +09:00
function get_text ( $str , $html = 0 , $restore = false )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
$source [] = " < " ;
$target [] = " < " ;
$source [] = " > " ;
$target [] = " > " ;
$source [] = " \" " ;
$target [] = " " " ;
$source [] = " \ ' " ;
$target [] = " ' " ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $restore )
$str = str_replace ( $target , $source , $str );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 3.31
// TEXT 출력일 경우 & 등의 코드를 정상으로 출력해 주기 위함
if ( $html == 0 ) {
$str = html_symbol ( $str );
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $html ) {
$source [] = " \n " ;
$target [] = " <br/> " ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return str_replace ( $source , $target , $str );
2022-09-17 20:50:50 +09:00
}
/*
// HTML 특수문자 변환 htmlspecialchars
function hsc ( $str )
{
2024-09-19 20:46:45 +09:00
$trans = array ( " \" " => " " " , " ' " => " ' " , " < " => " < " , " > " => " > " );
$str = strtr ( $str , $trans );
return $str ;
2022-09-17 20:50:50 +09:00
}
*/
// 3.31
// HTML SYMBOL 변환
// & · 등을 정상으로 출력
function html_symbol ( $str )
{
2024-09-19 20:46:45 +09:00
return preg_replace ( " / \ &([a-z0-9] { 1,20}| \ #[0-9] { 0,3});/i " , " & \\ 1; " , $str );
2022-09-17 20:50:50 +09:00
}
/*************************************************************************
2024-09-19 20:46:45 +09:00
**
** SQL 관련 함수 모음
**
*************************************************************************/
2022-09-17 20:50:50 +09:00
// DB 연결
2024-09-19 20:46:45 +09:00
function sql_connect ( $host , $user , $pass , $db = G5_MYSQL_DB )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( function_exists ( 'mysqli_connect' ) && G5_MYSQLI_USE ) {
2024-09-19 20:57:55 +09:00
mysqli_report ( MYSQLI_REPORT_OFF );
$link = @ mysqli_connect ( $host , $user , $pass , $db ) or die ( 'MySQL Host, User, Password, DB 정보에 오류가 있습니다.' );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 연결 오류 발생 시 스크립트 종료
if ( mysqli_connect_errno ()) {
die ( 'Connect Error: ' . mysqli_connect_error ());
}
} else {
$link = mysql_connect ( $host , $user , $pass );
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $link ;
2022-09-17 20:50:50 +09:00
}
// DB 선택
function sql_select_db ( $db , $connect )
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( function_exists ( 'mysqli_select_db' ) && G5_MYSQLI_USE )
return @ mysqli_select_db ( $connect , $db );
else
return @ mysql_select_db ( $db , $connect );
2022-09-17 20:50:50 +09:00
}
2024-09-19 20:46:45 +09:00
function sql_set_charset ( $charset , $link = null )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! $link )
$link = $g5 [ 'connect_db' ];
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( function_exists ( 'mysqli_set_charset' ) && G5_MYSQLI_USE )
mysqli_set_charset ( $link , $charset );
else
mysql_query ( " set names { $charset } " , $link );
2022-09-17 20:50:50 +09:00
}
2024-09-19 20:57:55 +09:00
function sql_data_seek ( $result , $offset = 0 )
{
if ( ! $result )
return ;
if ( function_exists ( 'mysqli_set_charset' ) && G5_MYSQLI_USE )
mysqli_data_seek ( $result , $offset );
else
mysql_data_seek ( $result , $offset );
}
function _callback_sql_show_tables ( $m )
{
return " show tables like ' " . str_replace ( " ` " , " " , $m [ 1 ]) . " ' " ;
}
2022-09-17 20:50:50 +09:00
// mysqli_query 와 mysqli_error 를 한꺼번에 처리
// mysql connect resource 지정 - 명랑폐인님 제안
2024-09-19 20:46:45 +09:00
function sql_query ( $sql , $error = G5_DISPLAY_SQL_ERROR , $link = null )
2022-09-17 20:50:50 +09:00
{
2024-09-19 21:01:26 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! $link )
$link = $g5 [ 'connect_db' ];
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// Blind SQL Injection 취약점 해결
$sql = trim ( $sql );
// union의 사용을 허락하지 않습니다.
//$sql = preg_replace("#^select.*from.*union.*#i", "select 1", $sql);
$sql = preg_replace ( " #^select.*from.*[ \ s \ (]+union[ \ s \ )]+.*#i " , " select 1 " , $sql );
// `information_schema` DB로의 접근을 허락하지 않습니다.
$sql = preg_replace ( " #^select.*from.*where.*`?information_schema`?.*#i " , " select 1 " , $sql );
2022-09-17 20:50:50 +09:00
2024-09-19 20:57:55 +09:00
if ( preg_match ( " #^desc(?:ribe)? \ s+(.*)#i " , $sql )) {
$sql = preg_replace_callback ( " #^desc(?:ribe)? \ s+(.*)#i " , '_callback_sql_show_tables' , trim ( $sql ));
}
2024-09-19 20:46:45 +09:00
if ( function_exists ( 'mysqli_query' ) && G5_MYSQLI_USE ) {
if ( $error ) {
$result = @ mysqli_query ( $link , $sql ) or die ( " <p> $sql <p> " . mysqli_errno ( $link ) . " : " . mysqli_error ( $link ) . " <p>error file : { $_SERVER [ 'SCRIPT_NAME' ] } " );
} else {
2024-09-19 20:57:55 +09:00
try {
$result = @ mysqli_query ( $link , $sql );
} catch ( Exception $e ) {
$result = null ;
}
2024-09-19 20:46:45 +09:00
}
} else {
if ( $error ) {
$result = @ mysql_query ( $sql , $link ) or die ( " <p> $sql <p> " . mysql_errno () . " : " . mysql_error () . " <p>error file : { $_SERVER [ 'SCRIPT_NAME' ] } " );
} else {
$result = @ mysql_query ( $sql , $link );
}
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:57:55 +09:00
run_event ( 'sql_query_after' , $result , $sql );
2024-09-19 20:46:45 +09:00
return $result ;
2022-09-17 20:50:50 +09:00
}
// 쿼리를 실행한 후 결과값에서 한행을 얻는다.
2024-09-19 20:46:45 +09:00
function sql_fetch ( $sql , $error = G5_DISPLAY_SQL_ERROR , $link = null )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! $link )
$link = $g5 [ 'connect_db' ];
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$result = sql_query ( $sql , $error , $link );
//$row = @sql_fetch_array($result) or die("<p>$sql<p>" . mysqli_errno() . " : " . mysqli_error() . "<p>error file : $_SERVER['SCRIPT_NAME']");
$row = sql_fetch_array ( $result );
return $row ;
2022-09-17 20:50:50 +09:00
}
// 결과값에서 한행 연관배열(이름으로)로 얻는다.
function sql_fetch_array ( $result )
{
2024-09-19 20:57:55 +09:00
if ( ! $result )
return array ();
2024-09-19 20:46:45 +09:00
if ( function_exists ( 'mysqli_fetch_assoc' ) && G5_MYSQLI_USE )
2024-09-19 20:57:55 +09:00
try {
$row = @ mysqli_fetch_assoc ( $result );
} catch ( Exception $e ) {
$row = null ;
} else
2024-09-19 20:46:45 +09:00
$row = @ mysql_fetch_assoc ( $result );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $row ;
2022-09-17 20:50:50 +09:00
}
// $result에 대한 메모리(memory)에 있는 내용을 모두 제거한다.
// sql_free_result()는 결과로부터 얻은 질의 값이 커서 많은 메모리를 사용할 염려가 있을 때 사용된다.
// 단, 결과 값은 스크립트(script) 실행부가 종료되면서 메모리에서 자동적으로 지워진다.
function sql_free_result ( $result )
{
2024-09-19 20:57:55 +09:00
if ( ! is_resource ( $result ))
return ;
2024-09-19 20:46:45 +09:00
if ( function_exists ( 'mysqli_free_result' ) && G5_MYSQLI_USE )
return mysqli_free_result ( $result );
else
return mysql_free_result ( $result );
2022-09-17 20:50:50 +09:00
}
function sql_password ( $value )
{
2024-09-19 20:46:45 +09:00
// mysql 4.0x 이하 버전에서는 password() 함수의 결과가 16bytes
// mysql 4.1x 이상 버전에서는 password() 함수의 결과가 41bytes
$row = sql_fetch ( " select password(' $value ') as pass " );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $row [ 'pass' ];
2022-09-17 20:50:50 +09:00
}
2024-09-19 20:46:45 +09:00
function sql_insert_id ( $link = null )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! $link )
$link = $g5 [ 'connect_db' ];
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( function_exists ( 'mysqli_insert_id' ) && G5_MYSQLI_USE )
return mysqli_insert_id ( $link );
else
return mysql_insert_id ( $link );
2022-09-17 20:50:50 +09:00
}
function sql_num_rows ( $result )
{
2024-09-19 20:46:45 +09:00
if ( function_exists ( 'mysqli_num_rows' ) && G5_MYSQLI_USE )
return mysqli_num_rows ( $result );
else
return mysql_num_rows ( $result );
2022-09-17 20:50:50 +09:00
}
2024-09-19 20:46:45 +09:00
function sql_field_names ( $table , $link = null )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! $link )
$link = $g5 [ 'connect_db' ];
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$columns = array ();
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$sql = " select * from ` $table ` limit 1 " ;
$result = sql_query ( $sql , $link );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( function_exists ( 'mysqli_fetch_field' ) && G5_MYSQLI_USE ) {
while ( $field = mysqli_fetch_field ( $result )) {
$columns [] = $field -> name ;
}
} else {
$i = 0 ;
$cnt = mysql_num_fields ( $result );
while ( $i < $cnt ) {
$field = mysql_fetch_field ( $result , $i );
$columns [] = $field -> name ;
$i ++ ;
}
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $columns ;
2022-09-17 20:50:50 +09:00
}
2024-09-19 20:46:45 +09:00
function sql_error_info ( $link = null )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! $link )
$link = $g5 [ 'connect_db' ];
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( function_exists ( 'mysqli_error' ) && G5_MYSQLI_USE ) {
return mysqli_errno ( $link ) . ' : ' . mysqli_error ( $link );
} else {
return mysql_errno ( $link ) . ' : ' . mysql_error ( $link );
}
2022-09-17 20:50:50 +09:00
}
// PHPMyAdmin 참고
2024-09-19 20:46:45 +09:00
function get_table_define ( $table , $crlf = " \n " )
{
global $g5 ;
// For MySQL < 3.23.20
2024-09-19 20:52:06 +09:00
$schema_create = 'CREATE TABLE ' . $table . ' (' . $crlf ;
2024-09-19 20:46:45 +09:00
$sql = 'SHOW FIELDS FROM ' . $table ;
$result = sql_query ( $sql );
while ( $row = 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 = 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 . ' (' ;
}
2024-09-19 20:52:06 +09:00
$schema_create .= implode ( ', ' , $columns ) . ')' ;
2024-09-19 20:46:45 +09:00
} // end while
$schema_create .= $crlf . ') ENGINE=MyISAM DEFAULT CHARSET=utf8' ;
return $schema_create ;
2022-09-17 20:50:50 +09:00
} // end of the 'PMA_getTableDef()' function
// 리퍼러 체크
2024-09-19 20:46:45 +09:00
function referer_check ( $url = '' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
/*
// 제대로 체크를 하지 못하여 주석 처리함
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! $url )
$url = G5_URL ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! preg_match ( " /^http['s']?: \ / \ / " . $_SERVER [ 'HTTP_HOST' ] . " / " , $_SERVER [ 'HTTP_REFERER' ]))
alert ( " 제대로 된 접근이 아닌것 같습니다. " , $url );
*/
2022-09-17 20:50:50 +09:00
}
// 한글 요일
2024-09-19 20:46:45 +09:00
function get_yoil ( $date , $full = 0 )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
$arr_yoil = array ( '일' , '월' , '화' , '수' , '목' , '금' , '토' );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$yoil = date ( " w " , strtotime ( $date ));
$str = $arr_yoil [ $yoil ];
if ( $full ) {
$str .= '요일' ;
}
return $str ;
2022-09-17 20:50:50 +09:00
}
// 날짜를 select 박스 형식으로 얻는다
2024-09-19 20:46:45 +09:00
function date_select ( $date , $name = '' )
{
global $g5 ;
$s = '' ;
if ( substr ( $date , 0 , 4 ) == " 0000 " ) {
$date = G5_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 ;
2022-09-17 20:50:50 +09:00
}
// 시간을 select 박스 형식으로 얻는다
// 1.04.00
// 경매에 시간 설정이 가능하게 되면서 추가함
2024-09-19 20:46:45 +09:00
function time_select ( $time , $name = " " )
{
preg_match ( " /([0-9] { 2}):([0-9] { 2}):([0-9] { 2})/ " , $time , $m );
// 시
2024-09-19 20:52:06 +09:00
$s = " <select name=' { $name } _h'> " ;
2024-09-19 20:46:45 +09:00
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 ;
2022-09-17 20:50:50 +09:00
}
// DEMO 라는 파일이 있으면 데모 화면으로 인식함
function check_demo ()
{
2024-09-19 20:46:45 +09:00
global $is_admin ;
if ( $is_admin != 'super' && file_exists ( G5_PATH . '/DEMO' ))
alert ( '데모 화면에서는 하실(보실) 수 없는 작업입니다.' );
2022-09-17 20:50:50 +09:00
}
// 문자열이 한글, 영문, 숫자, 특수문자로 구성되어 있는지 검사
function check_string ( $str , $options )
{
2024-09-19 20:46:45 +09:00
global $g5 ;
$s = '' ;
for ( $i = 0 ; $i < strlen ( $str ); $i ++ ) {
$c = $str [ $i ];
$oc = ord ( $c );
// 한글
if ( $oc >= 0xA0 && $oc <= 0xFF ) {
if ( $options & G5_HANGUL ) {
$s .= $c . $str [ $i + 1 ] . $str [ $i + 2 ];
}
$i += 2 ;
}
// 숫자
else if ( $oc >= 0x30 && $oc <= 0x39 ) {
if ( $options & G5_NUMERIC ) {
$s .= $c ;
}
}
// 영대문자
else if ( $oc >= 0x41 && $oc <= 0x5A ) {
if (( $options & G5_ALPHABETIC ) || ( $options & G5_ALPHAUPPER )) {
$s .= $c ;
}
}
// 영소문자
else if ( $oc >= 0x61 && $oc <= 0x7A ) {
if (( $options & G5_ALPHABETIC ) || ( $options & G5_ALPHALOWER )) {
$s .= $c ;
}
}
// 공백
else if ( $oc == 0x20 ) {
if ( $options & G5_SPACE ) {
$s .= $c ;
}
} else {
if ( $options & G5_SPECIAL ) {
$s .= $c ;
}
}
}
// 넘어온 값과 비교하여 같으면 참, 틀리면 거짓
return ( $str == $s );
2022-09-17 20:50:50 +09:00
}
// 한글(2bytes)에서 마지막 글자가 1byte로 끝나는 경우
// 출력시 깨지는 현상이 발생하므로 마지막 완전하지 않은 글자(1byte)를 하나 없앰
function cut_hangul_last ( $hangul )
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 한글이 반쪽나면 ?로 표시되는 현상을 막음
$cnt = 0 ;
for ( $i = 0 ; $i < strlen ( $hangul ); $i ++ ) {
// 한글만 센다
if ( ord ( $hangul [ $i ]) >= 0xA0 ) {
$cnt ++ ;
}
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $hangul ;
2022-09-17 20:50:50 +09:00
}
// 테이블에서 INDEX(키) 사용여부 검사
function explain ( $sql )
{
2024-09-19 20:46:45 +09:00
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> " ;
}
2022-09-17 20:50:50 +09:00
}
// 악성태그 변환
function bad_tag_convert ( $code )
{
2024-09-19 20:46:45 +09:00
global $view ;
global $member , $is_admin ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
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
);
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return preg_replace ( " / \ <([ \ /]?)(script|iframe|form)([^ \ >]*) \ >?/i " , " < $ 1 $ 2 $ 3> " , $code );
2022-09-17 20:50:50 +09:00
}
// 토큰 생성
function _token ()
{
2024-09-19 20:46:45 +09:00
return md5 ( uniqid ( rand (), true ));
2022-09-17 20:50:50 +09:00
}
// 불법접근을 막도록 토큰을 생성하면서 토큰값을 리턴
function get_token ()
{
2024-09-19 20:46:45 +09:00
$token = md5 ( uniqid ( rand (), true ));
set_session ( 'ss_token' , $token );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $token ;
2022-09-17 20:50:50 +09:00
}
// POST로 넘어온 토큰과 세션에 저장된 토큰 비교
function check_token ()
{
2024-09-19 20:46:45 +09:00
set_session ( 'ss_token' , '' );
return true ;
2022-09-17 20:50:50 +09:00
}
// 문자열에 utf8 문자가 들어 있는지 검사하는 함수
// 코드 : http://in2.php.net/manual/en/function.mb-check-encoding.php#95289
function is_utf8 ( $str )
{
2024-09-19 20:46:45 +09:00
$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 ;
2022-09-17 20:50:50 +09:00
}
// UTF-8 문자열 자르기
// 출처 : https://www.google.co.kr/search?q=utf8_strcut&aq=f&oq=utf8_strcut&aqs=chrome.0.57j0l3.826j0&sourceid=chrome&ie=UTF-8
2024-09-19 20:46:45 +09:00
function utf8_strcut ( $str , $size , $suffix = '...' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
$substr = substr ( $str , 0 , $size * 2 );
$multi_size = preg_match_all ( '/[\x80-\xff]/' , $substr , $multi_chars );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $multi_size > 0 )
$size = $size + intval ( $multi_size / 3 ) - 1 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( strlen ( $str ) > $size ) {
$str = substr ( $str , 0 , $size );
$str = preg_replace ( '/(([\x80-\xff]{3})*?)([\x80-\xff]{0,2})$/' , '$1' , $str );
$str .= $suffix ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $str ;
2022-09-17 20:50:50 +09:00
}
/*
-----------------------------------------------------------
2024-09-19 20:46:45 +09:00
Charset 을 변환하는 함수
2022-09-17 20:50:50 +09:00
-----------------------------------------------------------
iconv 함수가 있으면 iconv 로 변환하고
없으면 mb_convert_encoding 함수를 사용한다 .
둘다 없으면 사용할 수 없다 .
*/
function convert_charset ( $from_charset , $to_charset , $str )
{
2024-09-19 20:46:45 +09:00
if ( function_exists ( 'iconv' ))
return iconv ( $from_charset , $to_charset , $str );
elseif ( function_exists ( 'mb_convert_encoding' ))
return mb_convert_encoding ( $str , $to_charset , $from_charset );
else
die ( " Not found 'iconv' or 'mbstring' library in server. " );
2022-09-17 20:50:50 +09:00
}
// mysqli_real_escape_string 의 alias 기능을 한다.
2024-09-19 20:46:45 +09:00
function sql_real_escape_string ( $str , $link = null )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! $link )
$link = $g5 [ 'connect_db' ];
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return mysqli_real_escape_string ( $link , $str );
2022-09-17 20:50:50 +09:00
}
function escape_trim ( $field )
{
2024-09-19 20:46:45 +09:00
$str = call_user_func ( G5_ESCAPE_FUNCTION , $field );
return $str ;
2022-09-17 20:50:50 +09:00
}
// $_POST 형식에서 checkbox 엘리먼트의 checked 속성에서 checked 가 되어 넘어 왔는지를 검사
function is_checked ( $field )
{
2024-09-19 20:46:45 +09:00
return ! empty ( $_POST [ $field ]);
2022-09-17 20:50:50 +09:00
}
2024-09-19 20:46:45 +09:00
function abs_ip2long ( $ip = '' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
$ip = $ip ? $ip : $_SERVER [ 'REMOTE_ADDR' ];
return abs ( ip2long ( $ip ));
2022-09-17 20:50:50 +09:00
}
function get_selected ( $field , $value )
{
2024-09-19 20:46:45 +09:00
return ( $field == $value ) ? ' selected="selected"' : '' ;
2022-09-17 20:50:50 +09:00
}
function get_checked ( $field , $value )
{
2024-09-19 20:46:45 +09:00
return ( $field == $value ) ? ' checked="checked"' : '' ;
2022-09-17 20:50:50 +09:00
}
function is_mobile ()
{
2024-09-19 20:46:45 +09:00
return preg_match ( '/' . G5_MOBILE_AGENT . '/i' , $_SERVER [ 'HTTP_USER_AGENT' ]);
2022-09-17 20:50:50 +09:00
}
/*******************************************************************************
2024-09-19 20:46:45 +09:00
유일한 키를 얻는다 .
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
결과 :
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
년월일시분초00 ~ 년월일시분초99
년 ( 4 ) 월 ( 2 ) 일 ( 2 ) 시 ( 2 ) 분 ( 2 ) 초 ( 2 ) 100 분의1초 ( 2 )
총 16 자리이며 년도는 2 자리로 끊어서 사용해도 됩니다 .
예 ) 2008062611570199 또는 08062611570199 ( 2100 년까지만 유일키 )
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
사용하는 곳 :
1. 게시판 글쓰기시 미리 유일키를 얻어 파일 업로드 필드에 넣는다 .
2. 주문번호 생성시에 사용한다 .
3. 기타 유일키가 필요한 곳에서 사용한다 .
2022-09-17 20:50:50 +09:00
*******************************************************************************/
// 기존의 get_unique_id() 함수를 사용하지 않고 get_uniqid() 를 사용한다.
function get_uniqid ()
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
sql_query ( " LOCK TABLE { $g5 [ 'uniqid_table' ] } WRITE " );
while ( 1 ) {
// 년월일시분초에 100분의 1초 두자리를 추가함 (1/100 초 앞에 자리가 모자르면 0으로 채움)
$key = date ( 'ymdHis' , time ()) . str_pad (( int ) ( microtime () * 100 ), 2 , " 0 " , STR_PAD_LEFT );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$result = sql_query ( " insert into { $g5 [ 'uniqid_table' ] } set uq_id = ' $key ', uq_ip = ' { $_SERVER [ 'REMOTE_ADDR' ] } ' " , false );
if ( $result )
break ; // 쿼리가 정상이면 빠진다.
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// insert 하지 못했으면 일정시간 쉰다음 다시 유일키를 만든다.
usleep ( 10000 ); // 100분의 1초를 쉰다
}
sql_query ( " UNLOCK TABLES " );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $key ;
2022-09-17 20:50:50 +09:00
}
// CHARSET 변경 : euc-kr -> utf-8
function iconv_utf8 ( $str )
{
2024-09-19 20:46:45 +09:00
return iconv ( 'euc-kr' , 'utf-8' , $str );
2022-09-17 20:50:50 +09:00
}
// CHARSET 변경 : utf-8 -> euc-kr
function iconv_euckr ( $str )
{
2024-09-19 20:46:45 +09:00
return iconv ( 'utf-8' , 'euc-kr' , $str );
2022-09-17 20:50:50 +09:00
}
// PC 또는 모바일 사용인지를 검사
function check_device ( $device )
{
2024-09-19 20:46:45 +09:00
global $is_admin ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $is_admin )
return ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $device == 'pc' && G5_IS_MOBILE ) {
alert ( 'PC 전용 게시판입니다.' , G5_URL );
} else if ( $device == 'mobile' && ! G5_IS_MOBILE ) {
alert ( '모바일 전용 게시판입니다.' , G5_URL );
}
2022-09-17 20:50:50 +09:00
}
// 게시판 최신글 캐시 파일 삭제
function delete_cache_latest ( $bo_table )
{
2024-09-19 20:46:45 +09:00
$files = glob ( G5_DATA_PATH . '/cache/latest-' . $bo_table . '-*' );
if ( is_array ( $files )) {
foreach ( $files as $filename )
unlink ( $filename );
}
2022-09-17 20:50:50 +09:00
}
// 게시판 첨부파일 썸네일 삭제
function delete_board_thumbnail ( $bo_table , $file )
{
2024-09-19 20:46:45 +09:00
if ( ! $bo_table || ! $file )
return ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$fn = preg_replace ( " / \ .[^ \ .]+ $ /i " , " " , basename ( $file ));
$files = glob ( G5_DATA_PATH . '/file/' . $bo_table . '/thumb-' . $fn . '*' );
if ( is_array ( $files )) {
foreach ( $files as $filename )
unlink ( $filename );
}
2022-09-17 20:50:50 +09:00
}
// 에디터 이미지 얻기
2024-09-19 20:46:45 +09:00
function get_editor_image ( $contents , $view = true )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
if ( ! $contents )
return false ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// $contents 중 img 태그 추출
if ( $view )
$pattern = " /<img([^>]*)>/iS " ;
else
$pattern = " /<img[^>]*src=[ \ ' \" ]?([^> \ ' \" ]+[^> \ ' \" ]+)[ \ ' \" ]?[^>]*>/i " ;
preg_match_all ( $pattern , $contents , $matchs );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $matchs ;
2022-09-17 20:50:50 +09:00
}
// 에디터 썸네일 삭제
function delete_editor_thumbnail ( $contents )
{
2024-09-19 20:46:45 +09:00
if ( ! $contents )
return ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// $contents 중 img 태그 추출
$matchs = get_editor_image ( $contents );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! $matchs )
return ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
for ( $i = 0 ; $i < count ( $matchs [ 1 ]); $i ++ ) {
// 이미지 path 구함
$imgurl = @ parse_url ( $matchs [ 1 ][ $i ]);
$srcfile = $_SERVER [ 'DOCUMENT_ROOT' ] . $imgurl [ 'path' ];
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$filename = preg_replace ( " / \ .[^ \ .]+ $ /i " , " " , basename ( $srcfile ));
$filepath = dirname ( $srcfile );
$files = glob ( $filepath . '/thumb-' . $filename . '*' );
if ( is_array ( $files )) {
foreach ( $files as $filename )
unlink ( $filename );
}
}
2022-09-17 20:50:50 +09:00
}
// 1:1문의 첨부파일 썸네일 삭제
function delete_qa_thumbnail ( $file )
{
2024-09-19 20:46:45 +09:00
if ( ! $file )
return ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$fn = preg_replace ( " / \ .[^ \ .]+ $ /i " , " " , basename ( $file ));
$files = glob ( G5_DATA_PATH . '/qa/thumb-' . $fn . '*' );
if ( is_array ( $files )) {
foreach ( $files as $filename )
unlink ( $filename );
}
2022-09-17 20:50:50 +09:00
}
// 스킨 style sheet 파일 얻기
2024-09-19 20:46:45 +09:00
function get_skin_stylesheet ( $skin_path , $dir = '' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
if ( ! $skin_path )
return " " ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$str = " " ;
$files = array ();
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $dir )
$skin_path .= '/' . $dir ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$skin_url = G5_URL . str_replace ( " \\ " , " / " , str_replace ( G5_PATH , " " , $skin_path ));
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( is_dir ( $skin_path )) {
if ( $dh = opendir ( $skin_path )) {
while (( $file = readdir ( $dh )) !== false ) {
if ( $file == " . " || $file == " .. " )
continue ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( is_dir ( $skin_path . '/' . $file ))
continue ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( preg_match ( " / \ .(css) $ /i " , $file ))
$files [] = $file ;
}
closedir ( $dh );
}
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! empty ( $files )) {
sort ( $files );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
foreach ( $files as $file ) {
$str .= '<link rel="stylesheet" href="' . $skin_url . '/' . $file . '?=' . date ( " md " ) . '">' . " \n " ;
}
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $str ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
/*
// glob 를 이용한 코드
if ( ! $skin_path ) return '' ;
$skin_path .= $dir ? '/' . $dir : '' ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$str = '' ;
$skin_url = G5_URL . str_replace ( '\\' , '/' , str_replace ( G5_PATH , '' , $skin_path ));
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
foreach ( glob ( $skin_path . '/*.css' ) as $filepath ) {
$file = str_replace ( $skin_path , '' , $filepath );
$str .= '<link rel="stylesheet" href="' . $skin_url . '/' . $file . '?=' . date ( 'md' ) . '">' . " \n " ;
}
return $str ;
*/
2022-09-17 20:50:50 +09:00
}
// 스킨 javascript 파일 얻기
2024-09-19 20:46:45 +09:00
function get_skin_javascript ( $skin_path , $dir = '' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
if ( ! $skin_path )
return " " ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$str = " " ;
$files = array ();
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $dir )
$skin_path .= '/' . $dir ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$skin_url = G5_URL . str_replace ( " \\ " , " / " , str_replace ( G5_PATH , " " , $skin_path ));
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( is_dir ( $skin_path )) {
if ( $dh = opendir ( $skin_path )) {
while (( $file = readdir ( $dh )) !== false ) {
if ( $file == " . " || $file == " .. " )
continue ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( is_dir ( $skin_path . '/' . $file ))
continue ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( preg_match ( " / \ .(js) $ /i " , $file ))
$files [] = $file ;
}
closedir ( $dh );
}
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! empty ( $files )) {
sort ( $files );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
foreach ( $files as $file ) {
$str .= '<script src="' . $skin_url . '/' . $file . '"></script>' . " \n " ;
}
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $str ;
2022-09-17 20:50:50 +09:00
}
// file_put_contents 는 PHP5 전용 함수이므로 PHP4 하위버전에서 사용하기 위함
// http://www.phpied.com/file_get_contents-for-php4/
if ( ! function_exists ( 'file_put_contents' )) {
2024-09-19 20:46:45 +09:00
function file_put_contents ( $filename , $data )
{
$f = @ fopen ( $filename , 'w' );
if ( ! $f ) {
return false ;
} else {
$bytes = fwrite ( $f , $data );
fclose ( $f );
return $bytes ;
}
}
2022-09-17 20:50:50 +09:00
}
// HTML 마지막 처리
function html_end ()
{
2024-09-19 20:46:45 +09:00
global $html_process ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $html_process -> run ();
2022-09-17 20:50:50 +09:00
}
2024-09-19 20:46:45 +09:00
function add_stylesheet ( $stylesheet , $order = 0 )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $html_process ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( trim ( $stylesheet ))
$html_process -> merge_stylesheet ( $stylesheet , $order );
2022-09-17 20:50:50 +09:00
}
2024-09-19 20:46:45 +09:00
function add_javascript ( $javascript , $order = 0 )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $html_process ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( trim ( $javascript ))
$html_process -> merge_javascript ( $javascript , $order );
2022-09-17 20:50:50 +09:00
}
2024-09-19 20:46:45 +09:00
class html_process
{
protected $css = array ();
protected $js = array ();
function merge_stylesheet ( $stylesheet , $order )
{
$links = $this -> css ;
$is_merge = true ;
foreach ( $links as $link ) {
if ( $link [ 1 ] == $stylesheet ) {
$is_merge = false ;
break ;
}
}
if ( $is_merge )
$this -> css [] = array ( $order , $stylesheet );
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
function merge_javascript ( $javascript , $order )
{
$scripts = $this -> js ;
$is_merge = true ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
foreach ( $scripts as $script ) {
if ( $script [ 1 ] == $javascript ) {
$is_merge = false ;
break ;
}
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $is_merge )
$this -> js [] = array ( $order , $javascript );
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
function run ()
{
global $config , $g5 , $member ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 현재접속자 처리
$tmp_sql = " select count(*) as cnt from { $g5 [ 'login_table' ] } where lo_ip = ' { $_SERVER [ 'REMOTE_ADDR' ] } ' " ;
$tmp_row = sql_fetch ( $tmp_sql );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $tmp_row [ 'cnt' ]) {
$tmp_sql = " update { $g5 [ 'login_table' ] } set mb_id = ' { $member [ 'mb_id' ] } ', lo_datetime = ' " . G5_TIME_YMDHIS . " ', lo_location = ' { $g5 [ 'lo_location' ] } ', lo_url = ' { $g5 [ 'lo_url' ] } ' where lo_ip = ' { $_SERVER [ 'REMOTE_ADDR' ] } ' " ;
sql_query ( $tmp_sql , FALSE );
} else {
$tmp_sql = " insert into { $g5 [ 'login_table' ] } ( lo_ip, mb_id, lo_datetime, lo_location, lo_url ) values ( ' { $_SERVER [ 'REMOTE_ADDR' ] } ', ' { $member [ 'mb_id' ] } ', ' " . G5_TIME_YMDHIS . " ', ' { $g5 [ 'lo_location' ] } ', ' { $g5 [ 'lo_url' ] } ' ) " ;
sql_query ( $tmp_sql , FALSE );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 시간이 지난 접속은 삭제한다
sql_query ( " delete from { $g5 [ 'login_table' ] } where lo_datetime < ' " . date ( " Y-m-d H:i:s " , G5_SERVER_TIME - ( 60 * $config [ 'cf_login_minutes' ])) . " ' " );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 부담(overhead)이 있다면 테이블 최적화
//$row = sql_fetch(" SHOW TABLE STATUS FROM `$mysql_db` LIKE '$g5['login_table']' ");
//if ($row['Data_free'] > 0) sql_query(" OPTIMIZE TABLE $g5['login_table'] ");
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$buffer = ob_get_contents ();
ob_end_clean ();
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$stylesheet = '' ;
$links = $this -> css ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! empty ( $links )) {
foreach ( $links as $key => $row ) {
$order [ $key ] = $row [ 0 ];
$index [ $key ] = $key ;
$style [ $key ] = $row [ 1 ];
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
array_multisort ( $order , SORT_ASC , $index , SORT_ASC , $links );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
foreach ( $links as $link ) {
if ( ! trim ( $link [ 1 ]))
continue ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$link [ 1 ] = preg_replace ( '#\.css([\'\"]?>)$#i' , '.css?ver=' . G5_CSS_VER . '$1' , $link [ 1 ]);
$stylesheet .= PHP_EOL . $link [ 1 ];
}
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$javascript = '' ;
$scripts = $this -> js ;
$php_eol = '' ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
unset ( $order );
unset ( $index );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! empty ( $scripts )) {
foreach ( $scripts as $key => $row ) {
$order [ $key ] = $row [ 0 ];
$index [ $key ] = $key ;
$script [ $key ] = $row [ 1 ];
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
array_multisort ( $order , SORT_ASC , $index , SORT_ASC , $scripts );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
foreach ( $scripts as $js ) {
if ( ! trim ( $js [ 1 ]))
continue ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$js [ 1 ] = preg_replace ( '#\.js([\'\"]?>)$#i' , '.js?ver=' . G5_JS_VER . '$1' , $js [ 1 ]);
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$javascript .= $php_eol . $js [ 1 ];
$php_eol = PHP_EOL ;
}
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
/*
</ title >
< link rel = " stylesheet " href = " default.css " >
밑으로 스킨의 스타일시트가 위치하도록 하게 한다 .
*/
$buffer = preg_replace ( '#(</title>[^<]*<link[^>]+>)#' , " $ 1 $stylesheet " , $buffer );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
/*
</ head >
< body >
전에 스킨의 자바스크립트가 위치하도록 하게 한다 .
*/
$nl = '' ;
if ( $javascript )
$nl = " \n " ;
$buffer = preg_replace ( '#(</head>[^<]*<body[^>]*>)#' , " $javascript { $nl } $ 1 " , $buffer );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $buffer ;
}
2022-09-17 20:50:50 +09:00
}
// 휴대폰번호의 숫자만 취한 후 중간에 하이픈(-)을 넣는다.
function hyphen_hp_number ( $hp )
{
2024-09-19 20:46:45 +09:00
$hp = preg_replace ( " /[^0-9]/ " , " " , $hp );
return preg_replace ( " /([0-9] { 3})([0-9] { 3,4})([0-9] { 4}) $ / " , " \\ 1- \\ 2- \\ 3 " , $hp );
2022-09-17 20:50:50 +09:00
}
// 로그인 후 이동할 URL
2024-09-19 20:46:45 +09:00
function login_url ( $url = '' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
if ( ! $url )
$url = G5_URL ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return urlencode ( clean_xss_tags ( urldecode ( $url )));
2022-09-17 20:50:50 +09:00
}
// $dir 을 포함하여 https 또는 http 주소를 반환한다.
2024-09-19 20:46:45 +09:00
function https_url ( $dir , $https = true )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
if ( $https ) {
if ( G5_HTTPS_DOMAIN ) {
$url = G5_HTTPS_DOMAIN . '/' . $dir ;
} else {
$url = G5_URL . '/' . $dir ;
}
} else {
if ( G5_DOMAIN ) {
$url = G5_DOMAIN . '/' . $dir ;
} else {
$url = G5_URL . '/' . $dir ;
}
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $url ;
2022-09-17 20:50:50 +09:00
}
// 게시판의 공지사항을 , 로 구분하여 업데이트 한다.
2024-09-19 20:46:45 +09:00
function board_notice ( $bo_notice , $wr_id , $insert = false )
{
$notice_array = explode ( " , " , trim ( $bo_notice ));
if ( $insert && in_array ( $wr_id , $notice_array ))
return $bo_notice ;
$notice_array = array_merge ( array ( $wr_id ), $notice_array );
$notice_array = array_unique ( $notice_array );
foreach ( $notice_array as $key => $value ) {
if ( ! trim ( $value ))
unset ( $notice_array [ $key ]);
}
if ( ! $insert ) {
foreach ( $notice_array as $key => $value ) {
if (( int ) $value == ( int ) $wr_id )
unset ( $notice_array [ $key ]);
}
}
return implode ( " , " , $notice_array );
2022-09-17 20:50:50 +09:00
}
// goo.gl 짧은주소 만들기
function googl_short_url ( $longUrl )
{
2024-09-19 20:46:45 +09:00
global $config ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// Get API key from : http://code.google.com/apis/console/
// URL Shortener API ON
$apiKey = $config [ 'cf_googl_shorturl_apikey' ];
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$postData = array ( 'longUrl' => $longUrl );
$jsonData = json_encode ( $postData );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$curlObj = curl_init ();
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
curl_setopt ( $curlObj , CURLOPT_URL , 'https://www.googleapis.com/urlshortener/v1/url?key=' . $apiKey );
curl_setopt ( $curlObj , CURLOPT_RETURNTRANSFER , 1 );
curl_setopt ( $curlObj , CURLOPT_SSL_VERIFYPEER , 0 );
curl_setopt ( $curlObj , CURLOPT_HEADER , 0 );
curl_setopt ( $curlObj , CURLOPT_HTTPHEADER , array ( 'Content-type:application/json' ));
curl_setopt ( $curlObj , CURLOPT_POST , 1 );
curl_setopt ( $curlObj , CURLOPT_POSTFIELDS , $jsonData );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$response = curl_exec ( $curlObj );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
//change the response json string to object
$json = json_decode ( $response );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
curl_close ( $curlObj );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $json -> id ;
2022-09-17 20:50:50 +09:00
}
// 임시 저장된 글 수
function autosave_count ( $mb_id )
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $mb_id ) {
$row = sql_fetch ( " select count(*) as cnt from { $g5 [ 'autosave_table' ] } where mb_id = ' $mb_id ' " );
return ( int ) $row [ 'cnt' ];
} else {
return 0 ;
}
2022-09-17 20:50:50 +09:00
}
// 본인확인내역 기록
function insert_cert_history ( $mb_id , $company , $method )
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$sql = " insert into { $g5 [ 'cert_history_table' ] }
2022-09-17 20:50:50 +09:00
set mb_id = '$mb_id' ,
cr_company = '$company' ,
cr_method = '$method' ,
cr_ip = '{$_SERVER[' REMOTE_ADDR ']}' ,
2024-09-19 20:46:45 +09:00
cr_date = '" . G5_TIME_YMD . "' ,
cr_time = '" . G5_TIME_HIS . "' " ;
sql_query ( $sql );
2022-09-17 20:50:50 +09:00
}
// 인증시도회수 체크
function certify_count_check ( $mb_id , $type )
{
2024-09-19 20:46:45 +09:00
global $g5 , $config ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $config [ 'cf_cert_use' ] != 2 )
return ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $config [ 'cf_cert_limit' ] == 0 )
return ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$sql = " select count(*) as cnt from { $g5 [ 'cert_history_table' ] } " ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $mb_id ) {
$sql .= " where mb_id = ' $mb_id ' " ;
} else {
$sql .= " where cr_ip = ' { $_SERVER [ 'REMOTE_ADDR' ] } ' " ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$sql .= " and cr_method = ' " . $type . " ' and cr_date = ' " . G5_TIME_YMD . " ' " ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$row = sql_fetch ( $sql );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
switch ( $type ) {
case 'hp' :
$cert = '휴대폰' ;
break ;
case 'ipin' :
$cert = '아이핀' ;
break ;
default :
break ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if (( int ) $row [ 'cnt' ] >= ( int ) $config [ 'cf_cert_limit' ])
alert_close ( '오늘 ' . $cert . ' 본인확인을 ' . $row [ 'cnt' ] . '회 이용하셔서 더 이상 이용할 수 없습니다.' );
2022-09-17 20:50:50 +09:00
}
// 1:1문의 설정로드
2024-09-19 20:46:45 +09:00
function get_qa_config ( $fld = '*' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$sql = " select $fld from { $g5 [ 'qa_config_table' ] } " ;
$row = sql_fetch ( $sql );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $row ;
2022-09-17 20:50:50 +09:00
}
// get_sock 함수 대체
if ( ! function_exists ( " get_sock " )) {
2024-09-19 20:46:45 +09:00
function get_sock ( $url )
{
// host 와 uri 를 분리
//if (ereg("http://([a-zA-Z0-9_\-\.]+)([^<]*)", $url, $res))
if ( preg_match ( " /http: \ / \ /([a-zA-Z0-9_ \ - \ .]+)([^<]*)/ " , $url , $res )) {
$host = $res [ 1 ];
$get = $res [ 2 ];
}
// 80번 포트로 소캣접속 시도
$fp = fsockopen ( $host , 80 , $errno , $errstr , 30 );
if ( ! $fp ) {
die ( " $errstr ( $errno ) \n " );
} else {
fputs ( $fp , " GET $get HTTP/1.0 \r \n " );
fputs ( $fp , " Host: $host\r\n " );
fputs ( $fp , " \r \n " );
// header 와 content 를 분리한다.
while ( trim ( $buffer = fgets ( $fp , 1024 )) != " " ) {
$header .= $buffer ;
}
while ( ! feof ( $fp )) {
$buffer .= fgets ( $fp , 1024 );
}
}
fclose ( $fp );
// content 만 return 한다.
return $buffer ;
}
2022-09-17 20:50:50 +09:00
}
// 인증, 결제 모듈 실행 체크
function module_exec_check ( $exe , $type )
{
2024-09-19 20:46:45 +09:00
$error = '' ;
$is_linux = false ;
if ( strtoupper ( substr ( PHP_OS , 0 , 3 )) !== 'WIN' )
$is_linux = true ;
// 모듈 파일 존재하는지 체크
if ( ! is_file ( $exe )) {
$error = $exe . ' 파일이 존재하지 않습니다.' ;
} else {
// 실행권한 체크
if ( ! is_executable ( $exe )) {
if ( $is_linux )
$error = $exe . '\n파일의 실행권한이 없습니다.\n\nchmod 755 ' . basename ( $exe ) . ' 과 같이 실행권한을 부여해 주십시오.' ;
else
$error = $exe . '\n파일의 실행권한이 없습니다.\n\n' . basename ( $exe ) . ' 파일에 실행권한을 부여해 주십시오.' ;
} else {
// 바이너리 파일인지
if ( $is_linux ) {
$search = false ;
$isbinary = true ;
$executable = true ;
switch ( $type ) {
case 'ct_cli' :
exec ( $exe . ' -h 2>&1' , $out , $return_var );
if ( $return_var == 139 ) {
$isbinary = false ;
break ;
}
for ( $i = 0 ; $i < count ( $out ); $i ++ ) {
if ( strpos ( $out [ $i ], 'KCP ENC' ) !== false ) {
$search = true ;
break ;
}
}
break ;
case 'okname' :
exec ( $exe . ' D 2>&1' , $out , $return_var );
if ( $return_var == 139 ) {
$isbinary = false ;
break ;
}
for ( $i = 0 ; $i < count ( $out ); $i ++ ) {
if ( strpos ( strtolower ( $out [ $i ]), 'ret code' ) !== false ) {
$search = true ;
break ;
}
}
break ;
}
if ( ! $isbinary || ! $search ) {
$error = $exe . '\n파일을 바이너리 타입으로 다시 업로드하여 주십시오.' ;
}
}
}
}
if ( $error ) {
$error = '<script>alert("' . $error . '");</script>' ;
}
return $error ;
2022-09-17 20:50:50 +09:00
}
// 주소출력
function print_address ( $addr1 , $addr2 , $addr3 , $addr4 )
{
2024-09-19 20:46:45 +09:00
$address = get_text ( trim ( $addr1 ));
$addr2 = get_text ( trim ( $addr2 ));
$addr3 = get_text ( trim ( $addr3 ));
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $addr4 == 'N' ) {
if ( $addr2 )
$address .= ' ' . $addr2 ;
} else {
if ( $addr2 )
$address .= ', ' . $addr2 ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $addr3 )
$address .= ' ' . $addr3 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $address ;
2022-09-17 20:50:50 +09:00
}
// input vars 체크
function check_input_vars ()
{
2024-09-19 20:46:45 +09:00
$max_input_vars = ini_get ( 'max_input_vars' );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $max_input_vars ) {
$post_vars = count ( $_POST , COUNT_RECURSIVE );
$get_vars = count ( $_GET , COUNT_RECURSIVE );
$cookie_vars = count ( $_COOKIE , COUNT_RECURSIVE );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$input_vars = $post_vars + $get_vars + $cookie_vars ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $input_vars > $max_input_vars ) {
alert ( '폼에서 전송된 변수의 개수가 max_input_vars 값보다 큽니다.\\n전송된 값중 일부는 유실되어 DB에 기록될 수 있습니다.\\n\\n문제를 해결하기 위해서는 서버 php.ini의 max_input_vars 값을 변경하십시오.' );
}
}
2022-09-17 20:50:50 +09:00
}
// HTML 특수문자 변환 htmlspecialchars
function htmlspecialchars2 ( $str )
{
2024-09-19 20:46:45 +09:00
$trans = array ( " \" " => " " " , " ' " => " ' " , " < " => " < " , " > " => " > " );
$str = strtr ( $str , $trans );
return $str ;
2022-09-17 20:50:50 +09:00
}
// date 형식 변환
2024-09-19 20:46:45 +09:00
function conv_date_format ( $format , $date , $add = '' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
if ( $add )
$timestamp = strtotime ( $add , strtotime ( $date ));
else
$timestamp = strtotime ( $date );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return date ( $format , $timestamp );
2022-09-17 20:50:50 +09:00
}
// 검색어 특수문자 제거
function get_search_string ( $stx )
{
2024-09-19 20:46:45 +09:00
$stx_pattern = array ();
$stx_pattern [] = '#\.*/+#' ;
$stx_pattern [] = '#\\\*#' ;
$stx_pattern [] = '#\.{2,}#' ;
$stx_pattern [] = '#[/\'\"%=*\#\(\)\|\+\&\!\$~\{\}\[\]`;:\?\^\,]+#' ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$stx_replace = array ();
$stx_replace [] = '' ;
$stx_replace [] = '' ;
$stx_replace [] = '.' ;
$stx_replace [] = '' ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$stx = preg_replace ( $stx_pattern , $stx_replace , $stx );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $stx ;
2022-09-17 20:50:50 +09:00
}
// XSS 관련 태그 제거
2024-09-19 20:57:55 +09:00
// gnuboard - 258f94e597, d4f554e653
function clean_xss_tags ( $str , $check_entities = 0 , $is_remove_tags = 0 , $cur_str_len = 0 , $is_trim_both = 1 )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:57:55 +09:00
if ( $is_trim_both ) {
// tab('\t'), formfeed('\f'), vertical tab('\v'), newline('\n'), carriage return('\r') 를 제거한다.
$str = preg_replace ( " #[ \t \ f \ v \n \r ]# " , '' , $str );
}
if ( $is_remove_tags ) {
$str = strip_tags ( $str );
}
if ( $cur_str_len ) {
$str = utf8_strcut ( $str , $cur_str_len , '' );
}
$str_len = strlen ( $str );
$i = 0 ;
while ( $i <= $str_len ) {
$result = preg_replace ( '#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i' , '' , $str );
if ( $check_entities ) {
$result = str_replace ( array ( ':' , '(' , ')' , '
' , '	' ), '' , $result );
}
$result = preg_replace (
'#([^\p{L}]|^)(?:javascript|jar|applescript|vbscript|vbs|wscript|jscript|behavior|mocha|livescript|view-source)\s*:(?:.*?([/\\\;()\'">]|$))#ius' ,
'$1$2' ,
$result
);
if (( string ) $result === ( string ) $str )
break ;
$str = $result ;
$i ++ ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $str ;
2022-09-17 20:50:50 +09:00
}
// unescape nl 얻기
function conv_unescape_nl ( $str )
{
2024-09-19 20:46:45 +09:00
$search = array ( '\\r' , '\r' , '\\n' , '\n' );
$replace = array ( '' , '' , " \n " , " \n " );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return str_replace ( $search , $replace , $str );
2022-09-17 20:50:50 +09:00
}
// 회원 삭제
function member_delete ( $mb_id )
{
2024-09-19 20:46:45 +09:00
global $config ;
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$sql = " select mb_name, mb_nick, mb_ip, mb_recommend, mb_memo, mb_level from { $g5 [ 'member_table' ] } where mb_id= ' " . $mb_id . " ' " ;
$mb = sql_fetch ( $sql );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 이미 삭제된 회원은 제외
if ( preg_match ( '#^[0-9]{8}.*삭제함#' , $mb [ 'mb_memo' ]))
return ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $mb [ 'mb_recommend' ]) {
$row = sql_fetch ( " select count(*) as cnt from { $g5 [ 'member_table' ] } where mb_id = ' " . addslashes ( $mb [ 'mb_recommend' ]) . " ' " );
if ( $row [ 'cnt' ])
insert_point ( $mb [ 'mb_recommend' ], $config [ 'cf_recommend_point' ] * ( - 1 ), $mb_id . '님의 회원자료 삭제로 인한 추천인 포인트 반환' , " @member " , $mb [ 'mb_recommend' ], $mb_id . ' 추천인 삭제' );
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 회원자료는 정보만 없앤 후 아이디는 보관하여 다른 사람이 사용하지 못하도록 함 : 061025
$sql = " update { $g5 [ 'member_table' ] } set mb_password = '', mb_level = 1, mb_email = '', mb_homepage = '', mb_tel = '', mb_hp = '', mb_zip1 = '', mb_zip2 = '', mb_addr1 = '', mb_addr2 = '', mb_birth = '', mb_sex = '', mb_signature = '', mb_memo = ' " . date ( 'Ymd' , G5_SERVER_TIME ) . " 삭제함 \n { $mb [ 'mb_memo' ] } ' where mb_id = ' { $mb_id } ' " ;
sql_query ( $sql );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 포인트 테이블에서 삭제
sql_query ( " delete from { $g5 [ 'point_table' ] } where mb_id = ' $mb_id ' " );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 그룹접근가능 삭제
sql_query ( " delete from { $g5 [ 'group_member_table' ] } where mb_id = ' $mb_id ' " );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 쪽지 삭제
sql_query ( " delete from { $g5 [ 'memo_table' ] } where me_recv_mb_id = ' $mb_id ' or me_send_mb_id = ' $mb_id ' " );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 스크랩 삭제
sql_query ( " delete from { $g5 [ 'scrap_table' ] } where mb_id = ' $mb_id ' " );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 관리권한 삭제
sql_query ( " delete from { $g5 [ 'auth_table' ] } where mb_id = ' $mb_id ' " );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 그룹관리자인 경우 그룹관리자를 공백으로
sql_query ( " update { $g5 [ 'group_table' ] } set gr_admin = '' where gr_admin = ' $mb_id ' " );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 게시판관리자인 경우 게시판관리자를 공백으로
sql_query ( " update { $g5 [ 'board_table' ] } set bo_admin = '' where bo_admin = ' $mb_id ' " );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
// 아이콘 삭제
@ unlink ( G5_DATA_PATH . '/member/' . substr ( $mb_id , 0 , 2 ) . '/' . $mb_id . '.gif' );
2022-09-17 20:50:50 +09:00
}
// 이메일 주소 추출
function get_email_address ( $email )
{
2024-09-19 20:46:45 +09:00
preg_match ( " /[0-9a-z._-]+@[a-z0-9._-] { 4,}/i " , $email , $matches );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $matches [ 0 ];
2022-09-17 20:50:50 +09:00
}
// 파일명에서 특수문자 제거
function get_safe_filename ( $name )
{
2024-09-19 20:46:45 +09:00
$pattern = '/["\'<>=#&!%\\\\(\)\*\+\?]/' ;
$name = preg_replace ( $pattern , '' , $name );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $name ;
2022-09-17 20:50:50 +09:00
}
// 파일명 치환
function replace_filename ( $name )
{
2024-09-19 20:46:45 +09:00
@ session_start ();
$ss_id = session_id ();
$usec = get_microtime ();
$ext = array_pop ( explode ( '.' , $name ));
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return sha1 ( $ss_id . $_SERVER [ 'REMOTE_ADDR' ] . $usec ) . '.' . $ext ;
2022-09-17 20:50:50 +09:00
}
// 아이코드 사용자정보
function get_icode_userinfo ( $id , $pass )
{
2024-09-19 20:46:45 +09:00
$res = get_sock ( 'http://www.icodekorea.com/res/userinfo.php?userid=' . $id . '&userpw=' . $pass );
$res = explode ( ';' , $res );
$userinfo = array (
'code' => $res [ 0 ], // 결과코드
'coin' => $res [ 1 ], // 고객 잔액 (충전제만 해당)
'gpay' => $res [ 2 ], // 고객의 건수 별 차감액 표시 (충전제만 해당)
'payment' => $res [ 3 ] // 요금제 표시, A:충전제, C:정액제
);
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $userinfo ;
2022-09-17 20:50:50 +09:00
}
// 인기검색어 입력
function insert_popular ( $field , $str )
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! in_array ( 'mb_id' , $field )) {
$sql = " insert into { $g5 [ 'popular_table' ] } set pp_word = ' { $str } ', pp_date = ' " . G5_TIME_YMD . " ', pp_ip = ' { $_SERVER [ 'REMOTE_ADDR' ] } ' " ;
sql_query ( $sql , FALSE );
}
2022-09-17 20:50:50 +09:00
}
// 문자열 암호화
function get_encrypt_string ( $str )
{
2024-09-19 20:46:45 +09:00
if ( defined ( 'G5_STRING_ENCRYPT_FUNCTION' ) && G5_STRING_ENCRYPT_FUNCTION ) {
$encrypt = call_user_func ( G5_STRING_ENCRYPT_FUNCTION , $str );
} else {
$encrypt = sql_password ( $str );
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $encrypt ;
2022-09-17 20:50:50 +09:00
}
// 비밀번호 비교
function check_password ( $pass , $hash )
{
2024-09-19 20:46:45 +09:00
if ( defined ( 'G5_STRING_ENCRYPT_FUNCTION' ) && G5_STRING_ENCRYPT_FUNCTION === 'create_hash' ) {
return validate_password ( $pass , $hash );
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$password = get_encrypt_string ( $pass );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return ( $password === $hash );
2022-09-17 20:50:50 +09:00
}
// 로그인 패스워드 체크
function login_password_check ( $mb , $pass , $hash )
{
2024-09-19 20:46:45 +09:00
global $g5 ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$mb_id = isset ( $mb [ 'mb_id' ]) ? $mb [ 'mb_id' ] : '' ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! $mb_id )
return false ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( G5_STRING_ENCRYPT_FUNCTION === 'create_hash' && ( strlen ( $hash ) === G5_MYSQL_PASSWORD_LENGTH || strlen ( $hash ) === 16 )) {
if ( sql_password ( $pass ) === $hash ) {
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! isset ( $mb [ 'mb_password2' ])) {
$sql = " ALTER TABLE ` { $g5 [ 'member_table' ] } ` ADD `mb_password2` varchar(255) NOT NULL default '' AFTER `mb_password` " ;
sql_query ( $sql );
}
$new_password = create_hash ( $pass );
$sql = " update { $g5 [ 'member_table' ] } set mb_password = ' $new_password ', mb_password2 = ' $hash ' where mb_id = ' $mb_id ' " ;
sql_query ( $sql );
return true ;
2022-09-17 20:50:50 +09:00
}
2024-09-19 20:46:45 +09:00
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return check_password ( $pass , $hash );
2022-09-17 20:50:50 +09:00
}
// 동일한 host url 인지
2024-09-19 20:57:55 +09:00
function check_url_host ( $url , $msg = '' , $return_url = G5_URL , $is_redirect = false )
2024-09-19 20:46:45 +09:00
{
if ( ! $msg )
$msg = 'url에 타 도메인을 지정할 수 없습니다.' ;
2024-09-19 20:57:55 +09:00
if ( run_replace ( 'check_url_host_before' , '' , $url , $msg , $return_url , $is_redirect ) === 'is_checked' ) {
return ;
}
// KVE-2021-1277 Open Redirect 취약점 해결
if ( preg_match ( '#\\\0#' , $url )) {
alert ( 'url 에 올바르지 않은 값이 포함되어 있습니다.' );
}
while (( $replace_url = preg_replace ( array ( '/\/{2,}/' , '/\\@/' ), array ( '//' , '' ), urldecode ( $url ))) != $url ) {
$url = $replace_url ;
}
$p = @ parse_url ( trim ( $url ));
2024-09-19 20:46:45 +09:00
$host = preg_replace ( '/:[0-9]+$/' , '' , $_SERVER [ 'HTTP_HOST' ]);
2024-09-19 20:57:55 +09:00
$is_host_check = false ;
// url을 urlencode 를 2번이상하면 parse_url 에서 scheme와 host 값을 가져올수 없는 취약점이 존재함
if ( $is_redirect && ! isset ( $p [ 'host' ]) && urldecode ( $url ) != $url ) {
$i = 0 ;
while ( $i <= 3 ) {
$url = urldecode ( $url );
if ( urldecode ( $url ) == $url )
break ;
$i ++ ;
}
2024-09-19 20:46:45 +09:00
2024-09-19 20:57:55 +09:00
if ( urldecode ( $url ) == $url ) {
$p = @ parse_url ( $url );
} else {
$is_host_check = true ;
}
2024-09-19 20:46:45 +09:00
}
2024-09-19 20:57:55 +09:00
// if(stripos($url, 'http:') !== false) {
// if(!isset($p['scheme']) || !$p['scheme'] || !isset($p['host']) || !$p['host'])
// alert('url 정보가 올바르지 않습니다.', $return_url);
// }
//php 5.6.29 이하 버전에서는 parse_url 버그가 존재함
//php 7.0.1 ~ 7.0.5 버전에서는 parse_url 버그가 존재함
if ( $is_redirect && ( isset ( $p [ 'host' ]) && $p [ 'host' ])) {
$bool_ch = false ;
foreach ( array ( 'user' , 'host' ) as $key ) {
if ( isset ( $p [ $key ]) && strpbrk ( $p [ $key ], ':/?#@' )) {
$bool_ch = true ;
}
}
if ( $bool_ch ) {
$regex = '/https?\:\/\/' . $host . '/i' ;
if ( ! preg_match ( $regex , $url )) {
$is_host_check = true ;
}
}
}
if (( isset ( $p [ 'scheme' ]) && $p [ 'scheme' ]) || ( isset ( $p [ 'host' ]) && $p [ 'host' ]) || $is_host_check ) {
2024-09-19 20:46:45 +09:00
//if ($p['host'].(isset($p['port']) ? ':'.$p['port'] : '') != $_SERVER['HTTP_HOST']) {
2024-09-19 20:57:55 +09:00
if ( run_replace ( 'check_same_url_host' , (( $p [ 'host' ] != $host ) || $is_host_check ), $p , $host , $is_host_check , $return_url , $is_redirect )) {
2024-09-19 20:46:45 +09:00
echo '<script>' . PHP_EOL ;
echo 'alert("url에 타 도메인을 지정할 수 없습니다.");' . PHP_EOL ;
echo 'document.location.href = "' . $return_url . '";' . PHP_EOL ;
echo '</script>' . PHP_EOL ;
echo '<noscript>' . PHP_EOL ;
echo '<p>' . $msg . '</p>' . PHP_EOL ;
echo '<p><a href="' . $return_url . '">돌아가기</a></p>' . PHP_EOL ;
echo '</noscript>' . PHP_EOL ;
exit ;
}
}
2022-09-17 20:50:50 +09:00
}
// QUERY STRING 에 포함된 XSS 태그 제거
2024-09-19 20:46:45 +09:00
function clean_query_string ( $query , $amp = true )
{
$qstr = trim ( $query );
parse_str ( $qstr , $out );
if ( is_array ( $out )) {
$q = array ();
foreach ( $out as $key => $val ) {
$key = strip_tags ( trim ( $key ));
$val = trim ( $val );
switch ( $key ) {
case 'wr_id' :
$val = ( int ) preg_replace ( '/[^0-9]/' , '' , $val );
$q [ $key ] = $val ;
break ;
case 'sca' :
$val = clean_xss_tags ( $val );
$q [ $key ] = $val ;
break ;
case 'sfl' :
$val = preg_replace ( " /[ \ < \ > \ ' \" \\ \ ' \\ \" \ % \ = \ ( \ ) \ s]/ " , " " , $val );
$q [ $key ] = $val ;
break ;
case 'stx' :
$val = get_search_string ( $val );
$q [ $key ] = $val ;
break ;
case 'sst' :
$val = preg_replace ( " /[ \ < \ > \ ' \" \\ \ ' \\ \" \ % \ = \ ( \ ) \ s]/ " , " " , $val );
$q [ $key ] = $val ;
break ;
case 'sod' :
$val = preg_match ( " /^(asc|desc) $ /i " , $val ) ? $val : '' ;
$q [ $key ] = $val ;
break ;
case 'sop' :
$val = preg_match ( " /^(or|and) $ /i " , $val ) ? $val : '' ;
$q [ $key ] = $val ;
break ;
case 'spt' :
$val = ( int ) preg_replace ( '/[^0-9]/' , '' , $val );
$q [ $key ] = $val ;
break ;
case 'page' :
$val = ( int ) preg_replace ( '/[^0-9]/' , '' , $val );
$q [ $key ] = $val ;
break ;
case 'w' :
$val = substr ( $val , 0 , 2 );
$q [ $key ] = $val ;
break ;
case 'bo_table' :
$val = preg_replace ( '/[^a-z0-9_]/i' , '' , $val );
$val = substr ( $val , 0 , 20 );
$q [ $key ] = $val ;
break ;
case 'gr_id' :
$val = preg_replace ( '/[^a-z0-9_]/i' , '' , $val );
$q [ $key ] = $val ;
break ;
default :
$val = clean_xss_tags ( $val );
$q [ $key ] = $val ;
break ;
}
}
if ( $amp )
$sep = '&' ;
else
$sep = '&' ;
$str = http_build_query ( $q , '' , $sep );
} else {
$str = clean_xss_tags ( $qstr );
}
return $str ;
2022-09-17 20:50:50 +09:00
}
function get_device_change_url ()
{
2024-09-19 20:46:45 +09:00
$p = @ parse_url ( G5_URL );
$href = $p [ 'scheme' ] . '://' . $p [ 'host' ];
if ( isset ( $p [ 'port' ]) && $p [ 'port' ])
$href .= ':' . $p [ 'port' ];
$href .= $_SERVER [ 'SCRIPT_NAME' ];
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$q = array ();
$device = 'device=' . ( G5_IS_MOBILE ? 'pc' : 'mobile' );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $_SERVER [ 'QUERY_STRING' ]) {
foreach ( $_GET as $key => $val ) {
if ( $key == 'device' )
continue ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$key = strip_tags ( $key );
$val = strip_tags ( $val );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( $key && $val )
$q [ $key ] = $val ;
}
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! empty ( $q )) {
$query = http_build_query ( $q , '' , '&' );
$href .= '?' . $query . '&' . $device ;
} else {
$href .= '?' . $device ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $href ;
2022-09-17 20:50:50 +09:00
}
// 스킨 path
function get_skin_path ( $dir , $skin )
{
2024-09-19 20:46:45 +09:00
global $config ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$skin_path = G5_SKIN_PATH . '/' . $dir . '/' . $skin ;
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $skin_path ;
2022-09-17 20:50:50 +09:00
}
// 스킨 url
function get_skin_url ( $dir , $skin )
{
2024-09-19 20:46:45 +09:00
$skin_path = get_skin_path ( $dir , $skin );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return str_replace ( G5_PATH , G5_URL , $skin_path );
2022-09-17 20:50:50 +09:00
}
// 발신번호 유효성 체크
2024-09-19 20:46:45 +09:00
function check_vaild_callback ( $callback )
{
$_callback = preg_replace ( '/[^0-9]/' , '' , $callback );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
/**
2022-09-17 20:50:50 +09:00
* 1588 로시작하면 총8자리인데 7 자리라 차단
* 02 로시작하면 총9자리 또는 10 자리인데 11 자리라차단
* 1366 은 그자체가 원번호이기에 다른게 붙으면 차단
* 030 으로 시작하면 총10자리 또는 11 자리인데 9 자리라차단
*/
2024-09-19 20:46:45 +09:00
if ( substr ( $_callback , 0 , 4 ) == '1588' ) if ( strlen ( $_callback ) != 8 )
return false ;
if ( substr ( $_callback , 0 , 2 ) == '02' ) if ( strlen ( $_callback ) != 9 && strlen ( $_callback ) != 10 )
return false ;
if ( substr ( $_callback , 0 , 3 ) == '030' ) if ( strlen ( $_callback ) != 10 && strlen ( $_callback ) != 11 )
return false ;
if (
! preg_match ( " /^(02|0[3-6] \ d|01(0|1|3|5|6|7|8|9)|070|080|007) \ -? \ d { 3,4} \ -? \ d { 4,5} $ / " , $_callback ) &&
! preg_match ( " /^(15|16|18) \ d { 2} \ -? \ d { 4,5} $ / " , $_callback )
) {
return false ;
} else if ( preg_match ( " /^(02|0[3-6] \ d|01(0|1|3|5|6|7|8|9)|070|080) \ -?0 { 3,4} \ -? \ d { 4} $ / " , $_callback )) {
return false ;
} else {
return true ;
}
2022-09-17 20:50:50 +09:00
}
// 문자열 암복호화
class str_encrypt
{
2024-09-19 20:46:45 +09:00
var $salt ;
2024-09-19 20:52:06 +09:00
var $length = 0 ;
2024-09-19 20:46:45 +09:00
function __construct ( $salt = '' )
{
if ( ! $salt )
$this -> salt = md5 ( G5_MYSQL_PASSWORD );
else
$this -> salt = $salt ;
$this -> length = strlen ( $this -> salt );
}
function encrypt ( $str )
{
$length = strlen ( $str );
$result = '' ;
for ( $i = 0 ; $i < $length ; $i ++ ) {
$char = substr ( $str , $i , 1 );
$keychar = substr ( $this -> salt , ( $i % $this -> length ) - 1 , 1 );
$char = chr ( ord ( $char ) + ord ( $keychar ));
$result .= $char ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return base64_encode ( $result );
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
function decrypt ( $str )
{
$result = '' ;
$str = base64_decode ( $str );
$length = strlen ( $str );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
for ( $i = 0 ; $i < $length ; $i ++ ) {
$char = substr ( $str , $i , 1 );
$keychar = substr ( $this -> salt , ( $i % $this -> length ) - 1 , 1 );
$char = chr ( ord ( $char ) - ord ( $keychar ));
$result .= $char ;
}
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $result ;
}
2022-09-17 20:50:50 +09:00
}
// 불법접근을 막도록 토큰을 생성하면서 토큰값을 리턴
function get_write_token ( $bo_table )
{
2024-09-19 20:46:45 +09:00
$token = md5 ( uniqid ( rand (), true ));
set_session ( 'ss_write_' . $bo_table . '_token' , $token );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return $token ;
2022-09-17 20:50:50 +09:00
}
// POST로 넘어온 토큰과 세션에 저장된 토큰 비교
function check_write_token ( $bo_table )
{
2024-09-19 20:46:45 +09:00
/* if ( ! $bo_table )
alert ( '올바른 방법으로 이용해 주십시오.' , G5_URL );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
$token = get_session ( 'ss_write_' . $bo_table . '_token' );
set_session ( 'ss_write_' . $bo_table . '_token' , '' );
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
if ( ! $token || ! $_REQUEST [ 'token' ] || $token != $_REQUEST [ 'token' ]) {
alert ( '올바른 방법으로 이용해 주십시오.' , G5_URL );
} */
2022-09-17 20:50:50 +09:00
2024-09-19 20:46:45 +09:00
return true ;
2022-09-17 20:50:50 +09:00
}
// include 하는 경로에 data file 경로가 포함되어 있는지 체크합니다.
2024-09-19 20:46:45 +09:00
function is_include_path_check ( $path = '' )
2022-09-17 20:50:50 +09:00
{
2024-09-19 20:46:45 +09:00
if ( ! $path || preg_match ( '/\/data\/(file|editor)\/[A-Za-z0-9_]{1,20}\//' , $path )) {
return false ;
}
return true ;
2022-09-17 20:50:50 +09:00
}