You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

326 lines
12 KiB

7 years ago
7 years ago
  1. <?php
  2. defined('BASEPATH') OR exit('No direct script access allowed');
  3. /**
  4. *
  5. * HookPostControllerConstructor.php
  6. *
  7. * 컨트롤러가 인스턴스화 직후 가동되는 후킹 클래스.
  8. *
  9. */
  10. class HookPostControllerConstructor {
  11. protected $CI;
  12. /************************************************
  13. * 후킹 초기 실행 지점
  14. ***********************************************/
  15. function init() {
  16. // 인스턴스화 된 컨트롤러를 불러와 참조시킨다.
  17. $this->CI =& get_instance();
  18. if( PAGE_INSTALL ) return;
  19. $install_file = APPPATH . '..'.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'no_install.php';
  20. if( file_exists($install_file) && (! isset($_SERVER['WB_ENV']) OR $_SERVER['WB_ENV'] !== 'DEV'))
  21. {
  22. include_once $install_file;
  23. exit;
  24. }
  25. $this->load_config();
  26. $this->setup_device_view();
  27. $this->autologin_check();
  28. $this->member_status_check();
  29. $this->admin_check();
  30. $this->statics();
  31. $this->ip_block();
  32. $this->lang_set();
  33. }
  34. /************************************************
  35. * 환경설정 파일을 로드한다.
  36. ***********************************************/
  37. function load_config()
  38. {
  39. $this->CI->config->set_item('base_url', BASE_URL);
  40. $this->CI->config->set_item('cookie_domain', COOKIE_DOMAIN);
  41. $this->CI->load->database();
  42. $this->CI->load->helper(array('url','form','cookie','common','thumbnail','widgets','statics','lang'));
  43. $this->CI->load->helper('language');
  44. $this->CI->load->library('site');
  45. $this->CI->load->library('session');
  46. $this->CI->load->library('member');
  47. $this->CI->load->library('user_agent');
  48. $this->CI->load->library('banner');
  49. if( PAGE_ADMIN )
  50. {
  51. $this->CI->load->helper('admin');
  52. }
  53. }
  54. /************************************************
  55. * 현재 접속한 기기정보와, 보기 모드 설정들을 정의한다.
  56. ***********************************************/
  57. function setup_device_view()
  58. {
  59. // 모바일 접속여부에 따라 device 정보 확인
  60. $device = $viewmode = $this->CI->agent->is_mobile() ? DEVICE_MOBILE : DEVICE_DESKTOP;
  61. // 해당 모드로 보기 쿠키가 존재한다면 해당 보기 모드로
  62. if( get_cookie( COOKIE_VIEWMODE ) && ( get_cookie( COOKIE_VIEWMODE ) == DEVICE_DESKTOP OR get_cookie( COOKIE_VIEWMODE ) == DEVICE_MOBILE) )
  63. {
  64. $viewmode = get_cookie(COOKIE_VIEWMODE);
  65. }
  66. // 사이트 정보에 저장
  67. $this->CI->site->device = $device;
  68. $this->CI->site->viewmode = $viewmode;
  69. }
  70. /**************************************************
  71. * 자동로그인 체크
  72. ***********************************************/
  73. function autologin_check()
  74. {
  75. if( PAGE_INSTALL ) return;
  76. if( $this->CI->agent->is_robot() ) return; // 로봇일경우도 건너뛴다.
  77. if( $this->CI->member->is_login() ) return; // 로그인중이라면 건너뛴다.
  78. // 자동로그인 쿠키가 있다면
  79. if($aul_key = get_cookie(COOKIE_AUTOLOGIN))
  80. {
  81. // DB에 저장된 자동로그인 데이타가 있는지 확인한다.
  82. $result =
  83. $this->CI->db
  84. ->where('aul_key', $aul_key)
  85. ->where('aul_ip', ip2long( $this->CI->input->ip_address() ))
  86. ->limit(1)
  87. ->get('member_autologin');
  88. $autologin = $result->row_array();
  89. if( ! $autologin )
  90. {
  91. // DB에 데이타가 없다면 쿠키삭제
  92. delete_cookie(COOKIE_AUTOLOGIN);
  93. return FALSE;
  94. }
  95. else if( strtotime($autologin['aul_regtime']) + (60*60*24*30) < time() )
  96. {
  97. $this->CI->member->remove_autologin($autologin['mem_idx']);
  98. return FALSE;
  99. }
  100. else
  101. {
  102. $member_info = $this->CI->member->get_member( $autologin['mem_idx'], "mem_idx" );
  103. if(! $member_info)
  104. {
  105. // 회원정보가 없다면 삭제
  106. $this->CI->member->remove_autologin($autologin['mem_idx']);
  107. return FALSE;
  108. }
  109. else if( $member_info['mem_status'] != 'Y' )
  110. {
  111. // 회원상태가 '정상'이 아닌경우도 자동로그인 삭제
  112. $this->CI->member->remove_autologin($autologin['mem_idx']);
  113. return FALSE;
  114. }
  115. else
  116. {
  117. $this->CI->member->login_process( $member_info, TRUE, TRUE );
  118. }
  119. }
  120. }
  121. }
  122. function member_status_check()
  123. {
  124. if(! $this->CI->member->is_login()) return;
  125. if( PAGE_AJAX ) return;
  126. $member = $this->CI->member->get_member( $this->CI->member->is_login(), "mem_idx" );
  127. if( $member['mem_status'] == 'H' )
  128. {
  129. if( strtolower($this->CI->uri->segment(1)) != 'members' OR ( strtolower($this->CI->uri->segment(2)) != 'activation' && strtolower($this->CI->uri->segment(2)) != 'logout' )) {
  130. redirect(base_url('members/activation'));
  131. exit;
  132. }
  133. }
  134. }
  135. /**************************************************
  136. * 관리자 페이지인 경우,
  137. * 로그인 체크및 관리자 권한을 체크합니다.
  138. ***********************************************/
  139. function admin_check()
  140. {
  141. if( ! PAGE_ADMIN ) return;
  142. if( $this->CI->uri->segment(2) == 'members' && $this->CI->uri->segment(3) == 'login' ) return;
  143. if( ! $this->CI->member->is_login() )
  144. {
  145. alert_login("admin/members/login");
  146. exit;
  147. }
  148. else
  149. {
  150. if(! $this->CI->member->is_super())
  151. {
  152. alert('해당 페이지에 접근할 권한이 없습니다.', base_url());
  153. exit;
  154. }
  155. }
  156. }
  157. /**************************************************
  158. * 통계데이타 기록
  159. ***********************************************/
  160. function statics()
  161. {
  162. if ( PAGE_INSTALL || PAGE_ADMIN ) return;
  163. if ( $this->CI->input->is_ajax_request() ) return; // AJAX 요청인경우도 리턴
  164. if ( $this->CI->agent->is_robot() ) return; // 검색봇의 경우도 리턴
  165. if ( get_cookie(COOKIE_STATICS) ) return; // 방문자 쿠키가 있는경우 리턴
  166. if( $this->CI->input->ip_address() == '127.0.0.1' OR $this->CI->input->ip_address() == '0.0.0.0' ) return; // 접속IP가 정확하지 않을경우 리턴
  167. $sta_data['sta_regtime'] = date('Y-m-d H:i:s');
  168. $sta_data['sta_browser'] = $this->CI->agent->browser();
  169. $sta_data['sta_version'] = $this->CI->agent->version();
  170. $sta_data['sta_is_mobile'] = $this->CI->agent->is_mobile() ? 'Y':'N';
  171. $sta_data['sta_mobile'] = $this->CI->agent->mobile();
  172. $sta_data['sta_platform'] = $this->CI->agent->platform();
  173. $sta_data['sta_referrer'] = "";
  174. $sta_data['sta_referrer_host'] = "";
  175. $sta_data['sta_keyword'] = "";
  176. $sta_data['sta_ip'] = ip2long($this->CI->input->ip_address());
  177. $sta_data['sta_country'] = "";
  178. $sta_data['sta_country_code'] = "";
  179. $sta_data['sta_addr'] = "";
  180. $sta_data['sta_org'] = "";
  181. $sta_data['sta_agent'] = $this->CI->agent->agent_string();
  182. // 브라우져가 없다면 로봇으로 파악하고 return
  183. if( empty($sta_data['sta_browser']) ) return;
  184. // 플랫폼이 Unknown Platform 이라면 로봇일 가능성이크므로 리턴
  185. if( $sta_data['sta_platform'] == 'Unknown Platform' ) return;
  186. if( $this->CI->agent->is_referral() )
  187. {
  188. $sta_data['sta_referrer'] = $this->CI->agent->referrer();
  189. // 리퍼러에서 호스트와 패러미터 추출
  190. $referrer = parse_url($sta_data['sta_referrer']);
  191. $sta_data['sta_referrer_host'] = (isset($referrer['host'])) ? $referrer['host'] : "";
  192. // 검색키워드 분석
  193. $keyword = '';
  194. if(isset($referrer['query']) && $referrer['query'])
  195. {
  196. $queries = explode('&', $referrer['query']);
  197. foreach ($queries as $query) {
  198. if (preg_match('/^(query|q|p)=(.+)$/i', $query, $matches)) {
  199. $keyword = urldecode($matches[2]);
  200. break;
  201. }
  202. }
  203. }
  204. $sta_data['sta_keyword'] = trim($keyword);
  205. }
  206. // 집계 DB에 저장
  207. $result = $this->CI->db->insert("statics", $sta_data);
  208. // 통계 DB에도 저장
  209. $query = " INSERT INTO {$this->CI->db->dbprefix}statics_date SET `std_date` = '".date('Y-m-d')."', `std_count` = 1 ";
  210. if( $this->CI->agent->is_mobile() ) $query .= ", `std_mobile` = 1 ";
  211. $query .= ' ON DUPLICATE KEY UPDATE `std_count` = `std_count` + 1';
  212. if( $this->CI->agent->is_mobile() ) $query .= ", `std_mobile` = `std_mobile` + 1";
  213. $this->CI->db->query($query);
  214. $expire = strtotime(date('Y-m-d 23:59:59')) - time();
  215. set_cookie(COOKIE_STATICS, ip2long($this->CI->input->ip_address()), $expire );
  216. }
  217. /**************************************************
  218. * IP접근 금지
  219. ***********************************************/
  220. function ip_block()
  221. {
  222. if( $this->CI->site->config('deny_ip') )
  223. {
  224. $blacklist = $this->CI->site->config('deny_ip');
  225. $blacklist = preg_replace("/[\r|\n|\r\n]+/", ',', $blacklist);
  226. $blacklist = preg_replace("/\s+/", '', $blacklist);
  227. if (preg_match('/(<\?|<\?php|\?>)/xsm', $blacklist)) {
  228. $blacklist = '';
  229. }
  230. if ($blacklist) {
  231. $blacklist = explode(',', trim($blacklist, ','));
  232. $blacklist = array_unique($blacklist);
  233. if (is_array($blacklist)) {
  234. $this->CI->load->library('Ipfilter');
  235. $ipfilter = new Ipfilter();
  236. if ($ipfilter->filter($blacklist)) {
  237. $title = 'Not Allowed IP';
  238. show_error("Access Denied", '500', $title);
  239. exit;
  240. }
  241. }
  242. }
  243. }
  244. }
  245. /**************************************************
  246. * 다국어 설정
  247. ***********************************************/
  248. function lang_set()
  249. {
  250. // 사용할 언어 리스트
  251. $accept_lang = $this->CI->site->config('accept_languages');
  252. $accept_lang = explode(',', $accept_lang);
  253. // 다국어 사용설정이 FALSE 면 리턴
  254. if( $this->CI->site->config('use_localize') != 'Y' )
  255. {
  256. unset($accept_lang);
  257. $accept_lang = array();
  258. $accept_lang[] = $this->CI->site->config('default_language');
  259. }
  260. // Default 값으로 언어중 가장 첫번째값
  261. $lang = $this->CI->site->config('default_language');
  262. // 현재 브라우져에서 ACCEPT_LANG에 정의된 언어셋값이 있는지 확인한다.
  263. foreach($accept_lang as $lng)
  264. {
  265. if( preg_match('/'.$lng.'/', isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) && $_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : '')
  266. {
  267. $lang = $lng;
  268. }
  269. }
  270. // 쿠키에 저장된 언어값이 있는지 확인하고, 저장된 언어값이 있다면 그언어를 불러온다.
  271. $cookie_lang = get_cookie('site_lang');
  272. if( ! empty($cookie_lang) && in_array($cookie_lang, $accept_lang) )
  273. {
  274. $lang = $cookie_lang;
  275. }
  276. // 만약 GET 값으로 lang 값이 넘어왔고, 이값이 언어 리스트에 있다면
  277. $get_lang = $this->CI->input->get('lang', TRUE);
  278. if( ! empty($get_lang) && in_array($get_lang, $accept_lang) )
  279. {
  280. set_cookie("site_lang", $get_lang, 60*60*24*30 );
  281. $lang = $get_lang;
  282. }
  283. // 언어를 define
  284. define('LANG', $lang);
  285. $this->CI->site->lang = $lang;
  286. }
  287. }