/spb3/sinc/lib/function_default.php
sitePHPbasic 디버그 모드 : WARNING
[2] file(http://spb3.staredong.com/spb3_diff_source.php?md5_path=%2Fspb3%2Fsinc%2Flib%2Ffunction_default.php): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
Line : 89 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(),
#1 file() 함수사용, line(89), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => file(http://spb3.staredong.com/spb3_diff_source.php?md5_path=%2Fspb3%2Fsinc%2Flib%2Ffunction_default.php): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 89 [arr] => Array ( [0] => Array ( [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => file(http://spb3.staredong.com/spb3_diff_source.php?md5_path=%2Fspb3%2Fsinc%2Flib%2Ffunction_default.php): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 89 [4] => Array ( [_GET] => Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) [_POST] => Array ( ) [_COOKIE] => Array ( ) [_FILES] => Array ( ) [_SERVER] => Array ( [HTTP_USER_AGENT] => CCBot/2.0 (https://commoncrawl.org/faq/) [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 [HTTP_ACCEPT_LANGUAGE] => en-US,en;q=0.5 [HTTP_ACCEPT_ENCODING] => br,gzip [HTTP_HOST] => kamprs.or.kr [HTTP_CONNECTION] => Keep-Alive [PATH] => /sbin:/usr/sbin:/bin:/usr/bin [SERVER_SIGNATURE] =>
Apache/2.2.3 (CentOS) Server at kamprs.or.kr Port 80
[SERVER_SOFTWARE] => Apache/2.2.3 (CentOS) [SERVER_NAME] => kamprs.or.kr [SERVER_ADDR] => 61.14.208.190 [SERVER_PORT] => 80 [REMOTE_ADDR] => 18.204.2.231 [DOCUMENT_ROOT] => /wecan/cc/cc.sdong.kr [SERVER_ADMIN] => root@localhost [SCRIPT_FILENAME] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [REMOTE_PORT] => 36416 [GATEWAY_INTERFACE] => CGI/1.1 [SERVER_PROTOCOL] => HTTP/1.1 [REQUEST_METHOD] => GET [QUERY_STRING] => md5_path=%2Fspb3%2Fsinc%2Flib%2Ffunction_default.php [REQUEST_URI] => /spb3/sadmin/util/svn/spb3_diff.php?md5_path=%2Fspb3%2Fsinc%2Flib%2Ffunction_default.php [SCRIPT_NAME] => /spb3/sadmin/util/svn/spb3_diff.php [PHP_SELF] => /spb3/sadmin/util/svn/spb3_diff.php [REQUEST_TIME_FLOAT] => 1634532360.947 [REQUEST_TIME] => 1634532360 ) [GLOBALS] => Array *RECURSION* [SITE] => Array ( [database] => [th] => spb3_ [uh] => /spb3/ [home] => /spb3/ [name] => sitePHPbasic [company] => 뉴21커뮤니티(주) [webmaster] => spb@sdong.kr [hp] => 16449501 [version] => 3.2.0 [debug] => 2 [home_path] => /wecan/cc/cc.sdong.kr/ [spb3_path] => /wecan/cc/cc.sdong.kr/spb3/ [html_path] => /wecan/cc/cc.sdong.kr/spb3/sinc/skin/ [lib_path] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/ ) [_SESSION] => Array ( ) [spb_error_checktime_time] => class_spb_checktime Object ( [vars] => Array ( ) ) [thisPath] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/ [file_source] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [http_response_header] => Array ( [0] => HTTP/1.1 404 Not Found [1] => Date: Mon, 18 Oct 2021 04:46:02 GMT [2] => Server: Apache/2.2.3 (CentOS) [3] => Content-Length: 301 [4] => Connection: close [5] => Content-Type: text/html; charset=iso-8859-1 ) ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 89 [function] => file [args] => Array ( [0] => http://spb3.staredong.com/spb3_diff_source.php?md5_path=%2Fspb3%2Fsinc%2Flib%2Ffunction_default.php ) ) ) [key] => 1 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 89 [function] => file [args] => Array ( [0] => http://spb3.staredong.com/spb3_diff_source.php?md5_path=%2Fspb3%2Fsinc%2Flib%2Ffunction_default.php ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] file(): Filename cannot be empty
Line : 119 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(),
#1 file() 함수사용, line(119), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#4 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => file(): Filename cannot be empty [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 119 [arr] => Array ( [0] => Array ( [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => file(): Filename cannot be empty [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 119 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 119 [function] => file [args] => Array ( [0] => ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [4] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 4 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] array_keys() expects parameter 1 to be array, boolean given
Line : 122 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(),
#1 array_keys() 함수사용, line(122), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#4 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => array_keys() expects parameter 1 to be array, boolean given [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 122 [arr] => Array ( [0] => Array ( [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => array_keys() expects parameter 1 to be array, boolean given [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 122 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => 0 ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 122 [function] => array_keys [args] => Array ( [0] => [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [4] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 4 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] Invalid argument supplied for foreach()
Line : 123 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(123), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#1 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => Invalid argument supplied for foreach() [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 123 [arr] => Array ( [0] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 123 [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => Invalid argument supplied for foreach() [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 123 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => 0 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 3 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] array_keys() expects parameter 1 to be array, boolean given
Line : 122 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(),
#1 array_keys() 함수사용, line(122), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#4 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => array_keys() expects parameter 1 to be array, boolean given [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 122 [arr] => Array ( [0] => Array ( [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => array_keys() expects parameter 1 to be array, boolean given [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 122 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => //======================================================= [oindex] => 1 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 122 [function] => array_keys [args] => Array ( [0] => [1] => //======================================================= ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [4] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 4 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] Invalid argument supplied for foreach()
Line : 123 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(123), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#1 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => Invalid argument supplied for foreach() [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 123 [arr] => Array ( [0] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 123 [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => Invalid argument supplied for foreach() [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 123 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => //======================================================= [oindex] => 1 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 3 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] array_keys() expects parameter 1 to be array, boolean given
Line : 122 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(),
#1 array_keys() 함수사용, line(122), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#4 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => array_keys() expects parameter 1 to be array, boolean given [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 122 [arr] => Array ( [0] => Array ( [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => array_keys() expects parameter 1 to be array, boolean given [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 122 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [oindex] => 2 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 122 [function] => array_keys [args] => Array ( [0] => [1] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [4] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 4 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] Invalid argument supplied for foreach()
Line : 123 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(123), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#1 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => Invalid argument supplied for foreach() [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 123 [arr] => Array ( [0] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 123 [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => Invalid argument supplied for foreach() [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 123 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [oindex] => 2 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 3 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] array_keys() expects parameter 1 to be array, boolean given
Line : 122 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(),
#1 array_keys() 함수사용, line(122), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#4 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => array_keys() expects parameter 1 to be array, boolean given [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 122 [arr] => Array ( [0] => Array ( [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => array_keys() expects parameter 1 to be array, boolean given [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 122 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [oindex] => 3 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 122 [function] => array_keys [args] => Array ( [0] => [1] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [4] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 4 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] Invalid argument supplied for foreach()
Line : 123 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(123), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#1 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => Invalid argument supplied for foreach() [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 123 [arr] => Array ( [0] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 123 [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => Invalid argument supplied for foreach() [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 123 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [oindex] => 3 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 3 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] array_keys() expects parameter 1 to be array, boolean given
Line : 122 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(),
#1 array_keys() 함수사용, line(122), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#4 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => array_keys() expects parameter 1 to be array, boolean given [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 122 [arr] => Array ( [0] => Array ( [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => array_keys() expects parameter 1 to be array, boolean given [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 122 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [oindex] => 4 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 122 [function] => array_keys [args] => Array ( [0] => [1] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [4] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 4 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] Invalid argument supplied for foreach()
Line : 123 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(123), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#1 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => Invalid argument supplied for foreach() [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 123 [arr] => Array ( [0] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 123 [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => Invalid argument supplied for foreach() [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 123 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [oindex] => 4 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 3 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] array_keys() expects parameter 1 to be array, boolean given
Line : 122 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(),
#1 array_keys() 함수사용, line(122), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#4 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => array_keys() expects parameter 1 to be array, boolean given [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 122 [arr] => Array ( [0] => Array ( [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => array_keys() expects parameter 1 to be array, boolean given [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 122 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => // Project: sitePHPbasic [oindex] => 5 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 122 [function] => array_keys [args] => Array ( [0] => [1] => // Project: sitePHPbasic ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [4] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 4 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] Invalid argument supplied for foreach()
Line : 123 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(123), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#1 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => Invalid argument supplied for foreach() [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 123 [arr] => Array ( [0] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 123 [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => Invalid argument supplied for foreach() [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 123 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => // Project: sitePHPbasic [oindex] => 5 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 3 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] array_keys() expects parameter 1 to be array, boolean given
Line : 122 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(),
#1 array_keys() 함수사용, line(122), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#4 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => array_keys() expects parameter 1 to be array, boolean given [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 122 [arr] => Array ( [0] => Array ( [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => array_keys() expects parameter 1 to be array, boolean given [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 122 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => // ChangeLog [oindex] => 6 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 122 [function] => array_keys [args] => Array ( [0] => [1] => // ChangeLog ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [4] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 4 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] Invalid argument supplied for foreach()
Line : 123 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(123), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#1 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => Invalid argument supplied for foreach() [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 123 [arr] => Array ( [0] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 123 [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => Invalid argument supplied for foreach() [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 123 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => // ChangeLog [oindex] => 6 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 3 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] array_keys() expects parameter 1 to be array, boolean given
Line : 122 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(),
#1 array_keys() 함수사용, line(122), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#4 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => array_keys() expects parameter 1 to be array, boolean given [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 122 [arr] => Array ( [0] => Array ( [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => array_keys() expects parameter 1 to be array, boolean given [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 122 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => // DATE 수정인 수정 내용 [oindex] => 7 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 122 [function] => array_keys [args] => Array ( [0] => [1] => // DATE 수정인 수정 내용 ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [4] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 4 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] Invalid argument supplied for foreach()
Line : 123 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(123), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#1 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => Invalid argument supplied for foreach() [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 123 [arr] => Array ( [0] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 123 [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => Invalid argument supplied for foreach() [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 123 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => // DATE 수정인 수정 내용 [oindex] => 7 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 3 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] array_keys() expects parameter 1 to be array, boolean given
Line : 122 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(),
#1 array_keys() 함수사용, line(122), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#4 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => array_keys() expects parameter 1 to be array, boolean given [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 122 [arr] => Array ( [0] => Array ( [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => array_keys() expects parameter 1 to be array, boolean given [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 122 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => // -------- ------ -------------------------------------- [oindex] => 8 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 122 [function] => array_keys [args] => Array ( [0] => [1] => // -------- ------ -------------------------------------- ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [4] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 4 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] Invalid argument supplied for foreach()
Line : 123 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(123), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#1 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => Invalid argument supplied for foreach() [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 123 [arr] => Array ( [0] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 123 [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => Invalid argument supplied for foreach() [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 123 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => // -------- ------ -------------------------------------- [oindex] => 8 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 3 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] array_keys() expects parameter 1 to be array, boolean given
Line : 122 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(),
#1 array_keys() 함수사용, line(122), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#4 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => array_keys() expects parameter 1 to be array, boolean given [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 122 [arr] => Array ( [0] => Array ( [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => array_keys() expects parameter 1 to be array, boolean given [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 122 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => // 07/04/07 박선민 bugfix - prifAuth() [oindex] => 9 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 122 [function] => array_keys [args] => Array ( [0] => [1] => // 07/04/07 박선민 bugfix - prifAuth() ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [4] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 4 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] Invalid argument supplied for foreach()
Line : 123 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(123), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#1 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => Invalid argument supplied for foreach() [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 123 [arr] => Array ( [0] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 123 [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => Invalid argument supplied for foreach() [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 123 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [381] => } [382] => } [383] => [384] => return $str; [385] => */ [386] => } [387] => [388] => /****************************************************************************** [389] => 함수명 header_security(array $SECURITY, int $server_ip, int $domain, int $version) [390] => 설명 해더를 컨파일하더라도 그 해더를 복사하여 다른 서버에서 사용할 수 있기에 [391] => 서버 IP, 도메인, 해더 버전을 확인하여 해킹을 일부 방지함 [392] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [393] => ******************************************************************************/ [394] => function header_security() { [395] => global $HEADER, $SECURITY; [396] => [397] => if(($SECURITY['server_ip'] and $_SERVER['SERVER_ADDR']!=$SECURITY['server_ip']) || [398] => ($SECURITY['domain'] and ($_SERVER['HTTP_HOST']!=$SECURITY['domain'] and $_SERVER['HTTP_HOST']!='www.'.$SECURITY['domain']) ) || [399] => ($SECURITY['version'] and ($HEADER['version'] != $SECURITY['header_version']))){ [400] => back('해더파일을 사용할 수 없습니다.\\n관리자에게 문의 주시기 바랍니다.'); [401] => exit; [402] => } [403] => } [404] => [405] => /****************************************************************************** [406] => 함수명 page_security(string $grant_method, string $referer) [407] => 설명 페이지의 GET/POST중 하나만을 허락하는 경우와 외부 링크시 접속 제안 [408] => 주의점 $version은 $HEADER['ver']를 넘기기 바람 [409] => ******************************************************************************/ [410] => function page_security($grant_method='', $referer='') { [411] => if($grant_method) { [412] => $grant_method=trim(strtolower($grant_method)); [413] => if($grant_method=='get' && count($_POST)) // get만 허락할때 [414] => back('Don\'t Support Method'); [415] => elseif(count($_GET))// post만 허락할때 [416] => back('Don\'t Support Method'); [417] => } [418] => if($referer) { [419] => if(!stristr(getenv('HTTP_REFERER'),$referer)) [420] => back('Don\'t Access From your site\\n' . getenv('HTTP_REFERER')); [421] => } [422] => } [423] => /* [424] => [425] => debugmail($var='',$exit=0, $echo=0,$GLOBALS['SITE']['webmaster']); [426] => */ [427] => [428] => function debugmail($var='',$exit=0, $echo=0,$email='sdong@sdong.kr') { // 08/06/15 박선민 [429] => // Debug By Sunmin Park) [430] => //ob_start(); // 버퍼링 시작(Debug By Sunmin Park) [431] => //phpinfo(); [432] => //echo "\n\n변수\n"; [433] => //print_r(get_defined_vars()); [434] => //$body=ob_get_contents(); //버퍼링된 내용을 변수화 [435] => //ob_end_clean();//버퍼링비움 [436] => [437] => if($var) { [438] => $body = str_replace('array (',' array(',var_export($var,true)); [439] => $body .= ";\n"; [440] => } [441] => [442] => $globals = $GLOBALS; [443] => foreach($globals as $k => $v) { [444] => if($k=='GLOBALS') continue; [445] => $body .= "\n\n\$$k = "; [446] => $body .= str_replace('array (',' array(',var_export($v,true)); [447] => $body .= ";\n"; [448] => } [449] => //$body .= str_replace('array (',' array(',var_export($globals,true)); [450] => [451] => mail($email,$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $body); [452] => [453] => if($echo) echo '
',$body,'
'; [454] => if($exit) exit("EXIT: debugmail()"); [455] => } [456] => ?> ) [new] => [ovalue] => // 07/04/07 박선민 bugfix - prifAuth() [oindex] => 9 [nkeys] => ) ) ) [1] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 142 [function] => doDiff [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [2] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 197 [function] => diffWrap [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => ) ) [3] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) ) [key] => 3 [value] => Array ( [file] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [line] => 92 [function] => inline [class] => diff [object] => diff Object ( [changes] => Array ( ) [diff] => Array ( ) [linepadding] => 2 ) [type] => -> [args] => Array ( [0] => /wecan/cc/cc.sdong.kr/spb3/sinc/lib/function_default.php [1] => [2] => 2 ) ) )
sitePHPbasic 디버그 모드 : WARNING
[2] array_keys() expects parameter 1 to be array, boolean given
Line : 122 (file:/wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php)
- 디버그 추적(debug_backtrace)
#0 spb_error_handler() 함수사용, line(),
#1 array_keys() 함수사용, line(122), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#2 doDiff() 함수사용, line(142), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#3 diffWrap() 함수사용, line(197), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php
#4 inline() 함수사용, line(92), /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php




사용변수들 ...
$_GET = Array ( [md5_path] => /spb3/sinc/lib/function_default.php ) $_POST = Array ( ) $_COOKIE = Array ( ) Array ( [errno] => 2 [errstr] => array_keys() expects parameter 1 to be array, boolean given [errfile] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [errline] => 122 [arr] => Array ( [0] => Array ( [function] => spb_error_handler [args] => Array ( [0] => 2 [1] => array_keys() expects parameter 1 to be array, boolean given [2] => /wecan/cc/cc.sdong.kr/spb3/sadmin/util/svn/spb3_diff.php [3] => 122 [4] => Array ( [old] => Array ( [0] => //======================================================= [2] => // $Id: function_default.php 160 2009-03-13 01:03:57Z sponsor $ [3] => // 설 명 : 기본함수 : 웹상의 에러메시지 출력 함수 모음 (function_default.php) [4] => // 책임자 : 박선민 (sponsor@new21.com), 검수: 05/04/07 [5] => // Project: sitePHPbasic [6] => // ChangeLog [7] => // DATE 수정인 수정 내용 [8] => // -------- ------ -------------------------------------- [9] => // 07/04/07 박선민 bugfix - prifAuth() [10] => // 07/11/03 박선민 back(), back_close()에서 href에 'opener_close'넘어오면 오픈창 reload 기능추가 [11] => // 08/06/16 박선민 debugmail() 함수 추가 [12] => // 09/06/28 박선민 privAuth()에서 &loginskin=??? 로 로그인 스킨 바꾸는 기능 추가 [13] => // 09/06/30 박선민 cut_string() utf-8 지원 관련 소스 삽입 [14] => // 09/09/27 박선민 bugfix - href_qs() [15] => // 10/01/06 박선민 privAuth() - $_SESSION[sePOST] 기능 구현 [16] => // 11/06/22 박선민 utf-8에 맞추어서 소스 수정 [17] => //======================================================= [18] => /* 포함함수 [19] => + 인증 체크 [20] => privAuth(&$dbinfo, $auth_priv, $go_loginpage=0) [21] => + QueryString 관련함수 [22] => href_qs($appendQueryString='',$queryString='',$output_formhidden=0) [23] => + 페이지 이동 함수 [24] => back(String $msg, URL $href=0) // 메시지 박스로 알리고 이동 [25] => back_close(String $msg, URL $href=0) // 오픈 페이지시 사용 [26] => go_url($url, $second=0) // 메타테크 이용 [27] => + misc [28] => header_security(array $SECURITY, int $server_ip, int $domain, int $version) // 해더 해킹 검사 [29] => */ [30] => [31] => // 04/12/20 박선민 priv,level 인증 함수 [32] => /** [33] => * 인증 함수 (logon.priv, logon.level, joininfo.priv, joininfo.level) [34] => * [35] => - root 권한자, 관리자(bid), 카테고리관리자(cid)이면 무조건 통과 [36] => - bid=0이 아니면 운영자도 무조건 통과 [37] => '운영자,회원' : priv가 운영자이거나 회원이면 OK [38] => '운영자+회원' : priv가 운영자이고 회원이면 OK [39] => '회원^2 : level이 2이상인 회원이면 OK [40] => '#park,운영자' : 아이디가 park이거나 운영자이면 OK [41] => '@4,@45^2 : '그룹UID가 4인 회원'이거나, '그룹UID가 45인회원중 그룹내 priv가 2레벨이상'인 회원이면 OK [42] => gid=4, '운영팀,개발팀' : 그룹UID가 4인 그룹내 priv가 운영팀이거나 개발팀이면 OK [43] => gid=4, '운영팀^5,개발팀+팀장' : 그룹UID가 4인 그룹내 priv가 '5레벨이상운영팀'이거나 '개발팀이면서팀장'이면 OK [44] => */ [45] => function privAuth(&$dbinfo, $auth_priv, $go_loginpage=0,$bid=0) { [46] => if(!$dbinfo[$auth_priv]) return true; // '0'이거나 NULL, 혹은 설정이 되어있지 않으면, 무조건 OK [47] => [48] => if( $_SESSION['seUid'] ) { // 로그인 여부 [49] => if( isset($_SESSION['sePriv']['root']) // root 권한자는 모든 권한 [50] => or ( $dbinfo['bid']==$_SESSION['seUid'] ) // 관리자(bid)는 모든 권한 [51] => // 카테고리 관리자(cid)도 모든 권한을 [52] => or ( isset($dbinfo['cid']) and $dbinfo['cid']==$_SESSION['seUid']) [53] => // 넘오온 $bid가 권한 'nobid'로 설정되지 않으면 모든 권한 [54] => or ( $bid==$_SESSION['seUid'] and 'nobid'!=substr($dbinfo[$auth_priv],0,5)) ) { [55] => return true; [56] => } [57] => elseif($dbinfo[$auth_priv]=='root' and !isset($_SESSION['sePriv']['root']) and $dbinfo['gid']==0) [58] => return false; // 권한없음!! - root 권한이어야만 함 (좀더 빨리 거부) [59] => //elseif( isset($_SESSION['sePriv']['운영자']) and !( isset($dbinfo['bid']) and $dbinfo['bid']==0 ) ) { [60] => // return true; // 운영자라면 모든 권한. 단, bid가 0이면 권한 없음. [61] => //} [62] => elseif( isset($dbinfo['gid']) and $dbinfo['gid']>0 ) { // 그룹 권한이면, [63] => if( isset($_SESSION['seGroup'][$dbinfo['gid']]['root']) ) { // 그룹개설자이면 무조건 통과 [64] => return true; [65] => } [66] => [67] => $checkPriv = &$_SESSION['seGroup'][$dbinfo['gid']]; // 그룹 권한으로 체크 [68] => } [69] => else $checkPriv = &$_SESSION['sePriv']; // 회원 권한으로 체크 [70] => [71] => // 권한 검사!! [72] => $aPriv = explode(',',$dbinfo[$auth_priv]); [73] => foreach($aPriv as $v) { [74] => settype($v, "string"); [75] => if($v[0]=='#') { // #userid 해당 회원이면 [76] => if($_SESSION['seUserid']==substr($v,1)) return true; [77] => continue; [78] => } [79] => elseif($v[0]=='@') { // @gid 해당 그룹회원이면 [80] => $v = substr($v,1); [81] => if(strpos($v,'^')) { // 레벨제한 - 예)@gid^7 (해당그룹 7레벨이상만) [82] => list($tPriv,$tLevel) = explode('^',$v,2); [83] => if($tLevel <=$_SESSION['seGroup'][$tPriv]['level']) return true; [84] => } [85] => elseif( isset($_SESSION['seGroup'][$v]['level']) ) return true; [86] => continue; [87] => } [88] => [89] => if(strpos($v,'+')) { [90] => $aPriv2 = explode('+',$v); [91] => $okPriv = 1; [92] => foreach($aPriv2 as $v2) { [93] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [94] => list($tPriv,$tLevel) = explode('^',$v2,2); [95] => if($tLevel > $checkPriv[$tPriv]) { [96] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [97] => break; [98] => } [99] => } [100] => elseif( !isset($checkPriv[$v2]) ) { [101] => $okPriv = 0; // 권한없음!! (복수권한에 들어있지 않음) [102] => break; [103] => } [104] => } [105] => if($noPriv) return true; [106] => } [107] => else { [108] => if(strpos($v,'^')) { // 레벨제한 - 예)회원^7 (7레벨이상회원만) [109] => list($tPriv,$tLevel) = explode('^',$v,2); [110] => if($tLevel <=$checkPriv[$tPriv]) return true; [111] => } [112] => elseif( isset($checkPriv[$v]) ) return true; [113] => } [114] => } // end foreach [115] => [116] => return false; // 권한없음!! [117] => } [118] => else { // 로그인되지 않았을 경우 [119] => if($go_loginpage) { // 로그인 페이지로 이동 [120] => /* 로그인 전후 $_POST를 세션으로 저장 - $_SESSION[sePOST] 기능 구현 [121] => // 로그인 전후 세션에 저장한 $_POST 값 설정 [122] => if($_SESSION['sePOST']) { [123] => $_POST = $_SESSION['sePOST']; [124] => $_REQUEST = array_merge($_REQUEST,$_POST); [125] => unset($_SESSION['sePOST']); [126] => } [127] => */ [128] => if(isset($_POST)) $_SESSION['sePOST'] = $_POST; [129] => [130] => $_SESSION['seREQUEST_URI'] = $_SERVER['REQUEST_URI']; [131] => session_write_close(); [132] => if($_GET['loginskin']) $goto = '/spb3/sjoin/login.php?skin='.$_GET['loginskin']; [133] => else $goto = '/spb3/sjoin/login.php'; [134] => //go_url($goto,0,'로그인이 필요합니다.\\n\\n로그인 페이지로 이동합니다.'); [135] => go_url($goto,0); [136] => exit; [137] => } // end if [138] => return false; // 권한없음!! - 로그인하지 않았으니 [139] => } // end if.. else.. [140] => } // end func siteAuth(&dbinfo, $auth_priv) [141] => [142] => // 03/09/17 query_string 만들어주는 함수 [143] => /* [144] => href_qs(); // 넘어온 QueryString을 그대로 리턴 [145] => href_qs('page=3'); // 넘어온 QueryString에 page=3 추가 [146] => href_qs('page=3','db=free'); // db=free&page=3 이 된다. [147] => href_qs('page=4','db=free&page=3'); // db=free&page=4 가 된다. [148] => href_qs('page=','db=free&page=3'); // db=free 가 된다. [149] => href_qs('page=4&block=&uid=3','db=free&page=3&block=2'); // db=free&page=4&uid=3 이 된다. [150] => href_qs('page=4','db=free&page=3',1); 다음의 이 리턴된다. [151] => [152] => [153] => */ [154] => function href_qs($appendQueryString='',$queryString=NULL,$output_formhidden=0){ [155] => if($queryString===NULL) $queryString=$_SERVER['QUERY_STRING']; [156] => if($appendQueryString) { [157] => parse_str($queryString,$qs1); [158] => parse_str($appendQueryString,$qs2); [159] => $qs=array_merge($qs1,$qs2); [160] => } [161] => else parse_str($queryString,$qs); [162] => [163] => foreach ($qs as $key => $value) { [164] => if( $key && (strlen($value)>0) ) { [165] => if($output_formhidden) [166] => $newquery.="\n '; // 필히 '> '여야함 [167] => else { [168] => if(!is_array($value)) $newquery.=urlencode($key) . '=' . urlencode($value) . '&'; [169] => else { [170] => foreach($value as $k => $v) { [171] => $newquery.=urlencode($key.'['.$k.']') . '=' . urlencode($v) . '&'; [172] => } [173] => } [174] => } [175] => } [176] => } [177] => [178] => return substr($newquery,0,-1); [179] => } [180] => [181] => /****************************************************************************** [182] => 함수명 back(String $msg, URL $href=0) [183] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 $href 페이지로 이동 [184] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [185] => [186] => back('메세지','opener_reload'); 오픈창이면 오픈창닫고, 부모창 reload [187] => back('메세지','back'); 이전페이지로 [188] => ******************************************************************************/ [189] => /* [190] => [193] => */ [194] => function back( $msg='', $href='', $exit=0) { [195] => if($href) { [196] => if($href=='opener_reload') [197] => $go = ' if(opener) opener.location.reload(); self.close();'; [198] => elseif($href=='back') $go = 'history.go(-1);'; [199] => else $go = "window.location='$href'"; [200] => } [201] => else $go = 'history.go(-1);'; [202] => [203] => if(!$exit and $_SERVER['REQUEST_METHOD']) { // 웹에서 동작된다면... [204] => echo ' '; [208] => } [209] => else { // Command Shell 상에서 동작된다면... [210] => echo "\n*********** 에러발생 ***************\n"; [211] => echo "$msg"; [212] => echo "\n------------------------------------\n"; [213] => } [214] => exit; [215] => } [216] => [217] => /****************************************************************************** [218] => 함수명 back_close(String $msg, URL $href=0) [219] => 설명 $msg를 메시지박스로 보이고, 확인을 누를 경우 오픈 페이지를 닫고 [220] => 부모 페이지를 $href 페이지로 이동 [221] => (단, $href 페이지가 없을 경우 이전 페이지로 이동) [222] => *에러가능성 : $href=0인 경우에 부모 페이지의 이전 페이지로 이동할지 테스트하지 못함 [223] => // 04/03/25 박선민 오픈창이 아니면, 해당 페이지로 페이지 이동 [224] => [225] => back_close('메세지','opener_reload'); 오픈창닫고, 부모창 reload [226] => ******************************************************************************/ [227] => function back_close($msg='', $href=0) { [228] => $go = $href ? "opener.location='$href';" : 'history.go(-1);'; [229] => [230] => echo ' '; [239] => exit; [240] => } [241] => [242] => /****************************************************************************** [243] => 함수명 go_url(URL $url, int $second=0) [244] => 설명 메타테크를 이용하여 $second 이후에 $url로 페이지 이동 [245] => ******************************************************************************/ [246] => function go_url($url, $second=0, $msg='',$parent='window') { [247] => $url = str_replace(' ','%20',$url); [248] => if( $second or headers_sent() or $msg) { [249] => echo ' '; [256] => echo " "; [257] => echo ''; [258] => } [259] => else { [260] => echo " {$parent}.location='$url'"; // $parent='parent.window' [261] => echo ' '; [262] => } [263] => } [264] => else [265] => header('Location: '.$url); [266] => exit; [267] => } [268] => [269] => /** [270] => * 문자열 자르기 - 한글도 정확히 자르기 [271] => * [272] => * @since 07/10/24 [273] => * @auther Sunmin Park [274] => * @param string $str string 자를 문자열 [275] => * @param int $length int 최대 문자 byte [276] => * @param bool $htmlToText bool html에서 텍스트를 추출하고 자름 [277] => * @param string $tailjum 길었을 때 '…'등을 붙일 경우 [278] => * [279] => * @return string 잘라진 문자 리턴 [280] => */ [281] => function cut_string($str, $length=50, $htmlTotext=0, $tailjum='...') { [282] => // HTML 테그가 있다면 테그를 모두 없애고, text만 가지고 자름 [283] => if($htmlTotext) $str=strip_tags($str); [284] => [285] => if(strlen($str) <= $length or $length < 4) [286] => return $str; [287] => /* [288] => // euc-kr의 경우 [289] => for($i = $length; $i >=1; $i--) { [290] => # 끝에서부터 한글 byte수를 센다. [291] => $char=ord($str[$i-1]); [292] => if($char >= 0xa1 && $char <= 0xfe) $hangul++; [293] => else break; [294] => } [295] => if ($hangul) { [296] => # byte수가 홀수이면, 한글의 첫번째 바이트이다. [297] => # 한글의 첫번째 바이트일 때 깨지는 것을 막기 위해 지정된 길이를 한 [298] => # 바이트 줄임 [299] => if ($hangul%2) $length--; [300] => $str = chop(substr($str, 0, $length)); [301] => } [302] => else { # 문자열의 끝이 한글이 아닐 경우 [303] => for($i = 1; $i <= $length; $i++) { [304] => # 대문자의 갯수를 기록 [305] => $char=ord($str[$i-1]); [306] => if($char >= 0x41 && $char <= 0x5a) $alpha++; [307] => # 마지막 한글이 나타난 위치 기록 [308] => [309] => $char=ord($str[$i-1]); [310] => if($char >= 0xa1 && $char <= 0xfe) $last_han=$i; [311] => } [312] => [313] => # 지정된 길이로 문자열을 자르고 문자열 끝의 공백 문자를 삭제함 [314] => # 대문자의 길이는 1.3으로 계산한다. 문자열 마지막의 영문 문자열이 [315] => # 빼야할 전체 길이보다 크면 초과된 만큼 뺀다. [316] => $capitals = intval($alpha * 0.5); [317] => if ( ($length-$last_han) <= $capitals) $capitals=0; [318] => $str = chop(substr($str, 0, $length - $capitals)); [319] => } [320] => return $str . $tailjum; [321] => */ [322] => // UTF-8 cut_string [323] => return mb_strimwidth($str,0,$length,$tailjum,"UTF-8"); [324] => [325] => /* [326] => // UTF-8 cut_string (mb_strimwidth 지원안할경우) [327] => $len = $length; [328] => $pad = $tailjum; [329] => [330] => $i = 0; [331] => $j = 0; [332] => $len = $len - strlen($pad); [333] => [334] => while($j < $len) [335] => { [336] => $j++; [337] => $ch = ord($str[$i++]); [338] => [339] => if(($ch & 0x80) != 0) [340] => { [341] => $j++; [342] => [343] => if($j >= $len) [344] => { [345] => //echo "ret1: {$j}
\n"; [346] => return substr($str, 0, $i-1).$pad; [347] => } [348] => [349] => $ch = $ch & 0x3f; [350] => [351] => if(($ch & 0x20) != 0) [352] => { [353] => $ch = ord($str[$i++]); [354] => [355] => if(($ch & 0xc0) != 0x80) [356] => { // error [357] => //echo "error 1
\n"; [358] => return substr($str, 0, $i-2).$pad; [359] => } [360] => [361] => if($j >= $len) [362] => { [363] => //echo "ret2: {$j}
\n"; [364] => return substr($str, 0, $i-2).$pad; [365] => } [366] => } [367] => [368] => $ch = ord($str[$i++]); [369] => [370] => if(($ch & 0xc0) != 0x80) [371] => { // error [372] => //echo "error 2
\n"; [373] => return substr($str, 0, $i-3).$pad; [374] => } [375] => } [376] => [377] => if($j >= $len) [378] => { [379] => //echo "ret3: {$j}
\n"; [380] => return substr($str, 0, $i).$pad; [38