Compare commits

...
37 Commits
Author SHA1 Message Date
thisgun a90a38f096 Merge branch 'master' of github.com:gnuboard/g5 2017-12-20 12:05:17 +09:00
thisgun 68f8836cfb 5.2.9.8 버전 수정 2017-12-20 11:59:10 +09:00
thisgun 1e41f6a8ff 파일 업로드 취약점 수정 2017-12-18 12:21:23 +09:00
thisgun 875a326344 그누보드 CSRF 취약점(KVE-2017-0883,0884,0923) 수정 2017-12-12 11:59:10 +09:00
thisgun 7f9664af0a 그누보드 Reflected XSS 취약점 (891, 906, 908, 910) 수정 2017-12-11 17:52:20 +09:00
thisgun 8755c8ece7 Open Redirect 취약점 수정 2017-12-11 14:34:01 +09:00
thisgun 66358414f2 pht 파일 업로드 취약점 수정 adm1nkyj(김용진, http://adm1nkyj.kr) 님 제보 2017-12-08 11:27:37 +09:00
thisgun bc68c4bc70 Merge branch 'master' of github.com:gnuboard/g5 2017-12-07 11:18:09 +09:00
thisgun 82279c376b 5.2.9.7 버전 수정 2017-12-07 11:16:48 +09:00
thisgun 8b096e770c 스팸글댓글 유입을 줄이려고 링크에 nofollow 추가함 2017-12-07 11:02:10 +09:00
thisgun 6bf57bd4c6 최신글 캐시 파일 삭제 취약점 수정 2017-12-06 18:31:36 +09:00
thisgun ea55f3880e 그누보드4 가져오기 코드에 게시판 모바일 설정 추가 적용 2017-12-06 16:11:24 +09:00
thisgun 19e0ea60a7 php 잘못된 숏태그 수정 2017-12-05 19:10:41 +09:00
thisgun 7831d9dfb6 가비아 호스팅에서 설치시 에러 문제 수정 2017-12-05 17:10:55 +09:00
thisgun 907db24187 htmlpurifier 4.9.3 버전의 변경 2017-12-05 14:41:49 +09:00
thisgun 5a424d5977 Merge branch 'master' of github.com:gnuboard/g5 2017-12-04 16:02:42 +09:00
thisgun 6c4353fffe php 7.2 버전에서 오류 나는 코드 수정 2017-12-04 15:56:59 +09:00
thisgun fd1ec11ad1 그누보드4 import 코드 수정 2017-12-04 14:26:12 +09:00
thisgun 9f89455b3c 그누보드 XSS 취약점 (17-876, 17-879) 수정 2017-11-28 17:23:50 +09:00
thisgun 7d8e2e4fdd Merge branch 'master' of github.com:gnuboard/g5 2017-11-07 10:11:55 +09:00
thisgun 0aa4ae0b96 5.2.9.6 버전 수정 2017-11-07 10:04:47 +09:00
thisgun 04620f2475 thumbnail 생성 처리 일부 수정 2017-11-07 09:55:36 +09:00
thisgun 6cfb34ab22 영카트 Reflected XSS (17-0789) 취약점 수정 2017-11-06 16:47:24 +09:00
thisgun e46af305a9 sql_real_escape_string 함수 수정 2017-10-18 17:01:08 +09:00
thisgun 2fe00e5e96 자바스크립트 함수 number_format 수정 2017-10-16 11:12:54 +09:00
thisgun 2c7f9bd449 로그인 상태에서 회원정보 찾을시 리다이렉트 순환 오류 수정 2017-10-16 09:14:42 +09:00
thisgun d1ee1eb4e1 lgu 본인인증 기록 관련 수정 2017-10-12 17:21:51 +09:00
thisgun f9dd7644cc Merge branch 'master' of github.com:gnuboard/g5 2017-10-11 09:06:51 +09:00
thisgun 3f94d86db4 5.2.9.5 버전 수정 2017-10-10 11:47:30 +09:00
thisgun 9882234645 관리자 하단에 버전정보 표시 구문 수정 2017-10-10 11:44:38 +09:00
thisgun 838f1a0678 검색순위 관리자 페이지 잘못된 소스 수정 2017-10-10 11:39:32 +09:00
thisgun c111b2beaf 새글 선택내용삭제 과정중 잘못된 변수명 수정 2017-10-10 11:36:55 +09:00
thisgun ebad7240cc 그누보드 RCE 취약점 수정 adm1nkyj(김용진, http://adm1nkyj.kr) 님 제보 2017-10-10 11:26:11 +09:00
thisgun 8ed85a5fb4 게시판 글 쓰기 토큰 적용 이미지 버튼 추가 2017-10-10 11:25:04 +09:00
thisgun 3beaf71e16 동일한 게시판으로 글 복사시 파일 복사 처리 수정 ( 제이프로 님 제안 ) 2017-09-29 12:19:50 +09:00
thisgun 38f1e838a5 그누보드, 영카트 관리자페이지 파일 삭제 취약점 (17-664) 수정 2017-09-29 10:36:32 +09:00
thisgun 0f4ec77ac0 그누보드 다중 취약점 (17-0295, 334, 355) 수정 2017-09-28 20:23:28 +09:00
53 changed files with 998 additions and 267 deletions

No files matched your search

+12 -3
View File
@@ -176,7 +176,7 @@ function get_theme_config_value($dir, $key='*')
$tconfig = array(); $tconfig = array();
$theme_config_file = G5_PATH.'/'.G5_THEME_DIR.'/'.$dir.'/theme.config.php'; $theme_config_file = G5_PATH.'/'.G5_THEME_DIR.'/'.$dir.'/theme.config.php';
if(is_file) { if(is_file($theme_config_file)) {
include($theme_config_file); include($theme_config_file);
if($key == '*') { if($key == '*') {
@@ -382,15 +382,24 @@ function admin_referer_check($return=false)
} }
$p = @parse_url($referer); $p = @parse_url($referer);
$host = preg_replace('/:[0-9]+$/', '', $_SERVER['HTTP_HOST']); $host = preg_replace('/:[0-9]+$/', '', $_SERVER['HTTP_HOST']);
$msg = '';
if($host != $p['host']) { if($host != $p['host']) {
$msg = '올바른 방법으로 이용해 주십시오.'; $msg = '올바른 방법으로 이용해 주십시오.';
}
if($return) if( $p['path'] && ! preg_match( '/\/'.preg_quote(G5_ADMIN_DIR).'\//i', $p['path'] ) ){
$msg = '올바른 방법으로 이용해 주십시오';
}
if( $msg ){
if($return) {
return $msg; return $msg;
else } else {
alert($msg, G5_URL); alert($msg, G5_URL);
}
} }
} }
+1 -1
View File
@@ -1,7 +1,7 @@
<?php <?php
if (!defined('_GNUBOARD_')) exit; if (!defined('_GNUBOARD_')) exit;
$print_version = (defined('G5_IS_SHOP_ADMIN_PAGE') && defined('G5_YOUNGCART_VER')) ? 'Cart Version '.G5_YOUNGCART_VER : 'Version '.G5_GNUBOARD_VER; $print_version = defined('G5_YOUNGCART_VER') ? 'YoungCart Version '.G5_YOUNGCART_VER : 'Version '.G5_GNUBOARD_VER;
?> ?>
<noscript> <noscript>
+4 -4
View File
@@ -21,7 +21,7 @@ if ($file = $_POST['bo_include_head']) {
$purl = parse_url($file); $purl = parse_url($file);
$file = $purl['path']; $file = $purl['path'];
if (!preg_match("/\.(php|htm['l']?)$/i", $file)) { if (!preg_match("/\.(php|htm['l']?)$/i", $file)) {
alert('상단 파일 경로가 php, html 파일이 아닙니다.'); alert('상단 파일 경로의 확장자는 php, html 만 허용합니다.');
} }
$_POST['bo_include_head'] = $file; $_POST['bo_include_head'] = $file;
} }
@@ -30,16 +30,16 @@ if ($file = $_POST['bo_include_tail']) {
$purl = parse_url($file); $purl = parse_url($file);
$file = $purl['path']; $file = $purl['path'];
if (!preg_match("/\.(php|htm['l']?)$/i", $file)) { if (!preg_match("/\.(php|htm['l']?)$/i", $file)) {
alert('하단 파일 경로가 php, html 파일이 아닙니다.'); alert('하단 파일 경로의 확장자는 php, html 만 허용합니다.');
} }
$_POST['bo_include_tail'] = $file; $_POST['bo_include_tail'] = $file;
} }
if(!is_include_path_check($_POST['bo_include_head'])) { if(!is_include_path_check($_POST['bo_include_head'], 1)) {
alert('/data/file/ 또는 /data/editor/ 포함된 문자를 상단 파일 경로에 포함시킬수 없습니다.'); alert('/data/file/ 또는 /data/editor/ 포함된 문자를 상단 파일 경로에 포함시킬수 없습니다.');
} }
if(!is_include_path_check($_POST['bo_include_tail'])) { if(!is_include_path_check($_POST['bo_include_tail'], 1)) {
alert('/data/file/ 또는 /data/editor/ 포함된 문자를 하단 파일 경로에 포함시킬수 없습니다.'); alert('/data/file/ 또는 /data/editor/ 포함된 문자를 하단 파일 경로에 포함시킬수 없습니다.');
} }
+4 -1
View File
@@ -62,7 +62,10 @@ if ($_POST['act_button'] == "선택수정") {
// include 전에 $bo_table 값을 반드시 넘겨야 함 // include 전에 $bo_table 값을 반드시 넘겨야 함
$tmp_bo_table = trim($_POST['board_table'][$k]); $tmp_bo_table = trim($_POST['board_table'][$k]);
include ('./board_delete.inc.php');
if( preg_match("/^[A-Za-z0-9_]+$/", $tmp_bo_table) ){
include ('./board_delete.inc.php');
}
} }
+16
View File
@@ -20,6 +20,22 @@ if ($co_timg_del) @unlink(G5_DATA_PATH."/content/{$co_id}_t");
$error_msg = ''; $error_msg = '';
if( $co_include_head ){
$purl = parse_url($co_include_head);
$file = $purl['path'];
if (!preg_match("/\.(php|htm['l']?)$/i", $file)) {
alert('상단 파일 경로의 확장자는 php, html 만 허용합니다.');
}
}
if( $co_include_tail ){
$purl = parse_url($co_include_tail);
$file = $purl['path'];
if (!preg_match("/\.(php|htm['l']?)$/i", $file)) {
alert('하단 파일 경로의 확장자는 php, html 만 허용합니다.');
}
}
if( $co_include_head && ! is_include_path_check($co_include_head) ){ if( $co_include_head && ! is_include_path_check($co_include_head) ){
$co_include_head = ''; $co_include_head = '';
$error_msg = '/data/file/ 또는 /data/editor/ 포함된 문자를 상단 파일 경로에 포함시킬수 없습니다.'; $error_msg = '/data/file/ 또는 /data/editor/ 포함된 문자를 상단 파일 경로에 포함시킬수 없습니다.';
+1 -1
View File
@@ -106,7 +106,7 @@ include_once('./admin.head.php');
<?php } ?> <?php } ?>
</tbody> </tbody>
</table> </table>
<textarea name="ma_list" style="display:none"><?=$ma_list?></textarea> <textarea name="ma_list" style="display:none"><?php echo $ma_list?></textarea>
</div> </div>
<div class="btn_confirm01 btn_confirm"> <div class="btn_confirm01 btn_confirm">
+2
View File
@@ -10,6 +10,8 @@ if (!count($_POST['chk'])) {
auth_check($auth[$sub_menu], 'w'); auth_check($auth[$sub_menu], 'w');
check_admin_token();
if ($_POST['act_button'] == "선택수정") { if ($_POST['act_button'] == "선택수정") {
for ($i=0; $i<count($_POST['chk']); $i++) for ($i=0; $i<count($_POST['chk']); $i++)
+2
View File
@@ -8,6 +8,8 @@ if ($is_admin != 'super')
$g5['title'] = '메뉴 추가'; $g5['title'] = '메뉴 추가';
include_once(G5_PATH.'/head.sub.php'); include_once(G5_PATH.'/head.sub.php');
$code = isset($code) ? preg_replace('/[^0-9a-zA-Z]/', '', strip_tags($code)) : '';
// 코드 // 코드
if($new == 'new' || !$code) { if($new == 'new' || !$code) {
$code = base_convert(substr($code,0, 2), 36, 10); $code = base_convert(substr($code,0, 2), 36, 10);
+2
View File
@@ -4,6 +4,8 @@ include_once('./_common.php');
auth_check($auth[$sub_menu], 'w'); auth_check($auth[$sub_menu], 'w');
$po_id = isset($po_id) ? (int) $po_id : 0;
$html_title = '투표'; $html_title = '투표';
if ($w == '') if ($w == '')
$html_title .= ' 생성'; $html_title .= ' 생성';
+1 -1
View File
@@ -7,7 +7,7 @@ auth_check($auth[$sub_menu], 'r');
if (empty($fr_date) || ! preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $fr_date) ) $fr_date = G5_TIME_YMD; if (empty($fr_date) || ! preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $fr_date) ) $fr_date = G5_TIME_YMD;
if (empty($to_date) || ! preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $to_date) ) $to_date = G5_TIME_YMD; if (empty($to_date) || ! preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $to_date) ) $to_date = G5_TIME_YMD;
$qstr = "fr_date={$fr_date}{&amp;to_date}={$to_date}"; $qstr = "fr_date={$fr_date}&amp;to_date={$to_date}";
$sql_common = " from {$g5['popular_table']} a "; $sql_common = " from {$g5['popular_table']} a ";
$sql_search = " where trim(pp_word) <> '' and pp_date between '{$fr_date}' and '{$to_date}' "; $sql_search = " where trim(pp_word) <> '' and pp_date between '{$fr_date}' and '{$to_date}' ";
+18 -2
View File
@@ -10,12 +10,28 @@ check_admin_token();
$error_msg = ''; $error_msg = '';
if( $qa_include_head && ! is_include_path_check($qa_include_head) ){ if( $qa_include_head ){
$purl = parse_url($qa_include_head);
$file = $purl['path'];
if (!preg_match("/\.(php|htm['l']?)$/i", $file)) {
alert('상단 파일 경로의 확장자는 php, html 만 허용합니다.');
}
}
if( $qa_include_tail ){
$purl = parse_url($qa_include_tail);
$file = $purl['path'];
if (!preg_match("/\.(php|htm['l']?)$/i", $file)) {
alert('하단 파일 경로의 확장자는 php, html 만 허용합니다.');
}
}
if( $qa_include_head && ! is_include_path_check($qa_include_head, 1) ){
$qa_include_head = ''; $qa_include_head = '';
$error_msg = '/data/file/ 또는 /data/editor/ 포함된 문자를 상단 파일 경로에 포함시킬수 없습니다.'; $error_msg = '/data/file/ 또는 /data/editor/ 포함된 문자를 상단 파일 경로에 포함시킬수 없습니다.';
} }
if( $qa_include_tail && ! is_include_path_check($qa_include_tail) ){ if( $qa_include_tail && ! is_include_path_check($qa_include_tail, 1) ){
$qa_include_tail = ''; $qa_include_tail = '';
$error_msg = '/data/file/ 또는 /data/editor/ 포함된 문자를 하단 파일 경로에 포함시킬수 없습니다.'; $error_msg = '/data/file/ 또는 /data/editor/ 포함된 문자를 하단 파일 경로에 포함시킬수 없습니다.';
} }
+28 -17
View File
@@ -13,26 +13,37 @@ $g5['title'] = '메일 테스트';
include_once('./admin.head.php'); include_once('./admin.head.php');
if (isset($_POST['email'])) { if (isset($_POST['email'])) {
$_POST['email'] = strip_tags($_POST['email']);
$email = explode(',', $_POST['email']); $email = explode(',', $_POST['email']);
for ($i=0; $i<count($email); $i++)
mailer($config['cf_admin_email_name'], $config['cf_admin_email'], trim($email[$i]), '[메일검사] 제목', '<span style="font-size:9pt;">[메일검사] 내용<p>이 내용이 제대로 보인다면 보내는 메일 서버에는 이상이 없는것입니다.<p>'.G5_TIME_YMDHIS.'<p>이 메일 주소로는 회신되지 않습니다.</span>', 1);
echo '<section>'; $real_email = array();
echo '<h2>결과메세지</h2>';
echo '<div class="local_desc01 local_desc"><p>'; for ($i=0; $i<count($email); $i++){
echo '다음 '.count($email).'개의 메일 주소로 테스트 메일 발송이 완료되었습니다.';
echo '</p></div>'; if (!preg_match("/([0-9a-zA-Z_-]+)@([0-9a-zA-Z_-]+)\.([0-9a-zA-Z_-]+)/", $email[$i])) continue;
echo '<ul>';
for ($i=0;$i<count($email);$i++) { $real_email[] = $email[$i];
echo '<li>'.$email[$i].'</li>'; mailer($config['cf_admin_email_name'], $config['cf_admin_email'], trim($email[$i]), '[메일검사] 제목', '<span style="font-size:9pt;">[메일검사] 내용<p>이 내용이 제대로 보인다면 보내는 메일 서버에는 이상이 없는것입니다.<p>'.G5_TIME_YMDHIS.'<p>이 메일 주소로는 회신되지 않습니다.</span>', 1);
}
if( $real_email ){
echo '<section>';
echo '<h2>결과메세지</h2>';
echo '<div class="local_desc01 local_desc"><p>';
echo '다음 '.count($real_email).'개의 메일 주소로 테스트 메일 발송이 완료되었습니다.';
echo '</p></div>';
echo '<ul>';
for ($i=0;$i<count($real_email);$i++) {
echo '<li>'.$real_email[$i].'</li>';
}
echo '</ul>';
echo '<div class="local_desc02 local_desc"><p>';
echo '해당 주소로 테스트 메일이 도착했는지 확인해 주십시오.<br>';
echo '만약, 테스트 메일이 오지 않는다면 더 다양한 계정의 메일 주소로 메일을 보내 보십시오.<br>';
echo '그래도 메일이 하나도 도착하지 않는다면 메일 서버(sendmail server)의 오류일 가능성이 높으니, 웹 서버관리자에게 문의하여 주십시오.<br>';
echo '</p></div>';
echo '</section>';
} }
echo '</ul>';
echo '<div class="local_desc02 local_desc"><p>';
echo '해당 주소로 테스트 메일이 도착했는지 확인해 주십시오.<br>';
echo '만약, 테스트 메일이 오지 않는다면 더 다양한 계정의 메일 주소로 메일을 보내 보십시오.<br>';
echo '그래도 메일이 하나도 도착하지 않는다면 메일 서버(sendmail server)의 오류일 가능성이 높으니, 웹 서버관리자에게 문의하여 주십시오.<br>';
echo '</p></div>';
echo '</section>';
} }
?> ?>
+9 -5
View File
@@ -10,9 +10,9 @@ if ($w == 'u') // 업데이트
{ {
// 실제 번호를 넘김 // 실제 번호를 넘김
$k = $_POST['chk'][$i]; $k = $_POST['chk'][$i];
$fg_no = $_POST['fg_no'][$k]; $fg_no = (int) $_POST['fg_no'][$k];
$fg_name = $_POST['fg_name'][$k]; $fg_name = strip_tags($_POST['fg_name'][$k]);
$fg_member = $_POST['fg_member'][$k]; $fg_member = strip_tags($_POST['fg_member'][$k]);
if (!is_numeric($fg_no)) if (!is_numeric($fg_no))
alert('그룹 고유번호가 없습니다.'); alert('그룹 고유번호가 없습니다.');
@@ -38,7 +38,7 @@ else if ($w == 'de') // 그룹삭제
{ {
// 실제 번호를 넘김 // 실제 번호를 넘김
$k = $_POST['chk'][$i]; $k = $_POST['chk'][$i];
$fg_no = $_POST['fg_no'][$k]; $fg_no = (int) $_POST['fg_no'][$k];
if (!is_numeric($fg_no)) if (!is_numeric($fg_no))
alert('그룹 고유번호가 없습니다.'); alert('그룹 고유번호가 없습니다.');
@@ -57,7 +57,7 @@ else if ($w == 'em')
{ {
// 실제 번호를 넘김 // 실제 번호를 넘김
$k = $_POST['chk'][$i]; $k = $_POST['chk'][$i];
$fg_no = $_POST['fg_no'][$k]; $fg_no = (int) $_POST['fg_no'][$k];
if ($fg_no == 'no') $fg_no = 0; if ($fg_no == 'no') $fg_no = 0;
@@ -71,6 +71,8 @@ else if ($w == 'no')
{ {
if ($fg_no == 'no') $fg_no = 0; if ($fg_no == 'no') $fg_no = 0;
$fg_no = (int) $fg_no;
if ($fg_no) if ($fg_no)
sql_query("update {$g5['sms5_form_group_table']} set fg_count = 0 where fg_no = '$fg_no'"); sql_query("update {$g5['sms5_form_group_table']} set fg_count = 0 where fg_no = '$fg_no'");
@@ -81,6 +83,8 @@ else // 등록
if (!strlen(trim($fg_name))) if (!strlen(trim($fg_name)))
alert('그룹명을 입력해주세요'); alert('그룹명을 입력해주세요');
$fg_name = strip_tags($fg_name);
$res = sql_fetch("select fg_name from {$g5['sms5_form_group_table']} where fg_name = '$fg_name'"); $res = sql_fetch("select fg_name from {$g5['sms5_form_group_table']} where fg_name = '$fg_name'");
if ($res) if ($res)
alert('같은 그룹명이 존재합니다.'); alert('같은 그룹명이 존재합니다.');
+3
View File
@@ -4,6 +4,9 @@ include_once("./_common.php");
auth_check($auth[$sub_menu], "w"); auth_check($auth[$sub_menu], "w");
$fo_name = isset($fo_name) ? strip_tags($fo_name) : '';
$fo_content = isset($fo_content) ? strip_tags($fo_content) : '';
$g5['title'] = "이모티콘 업데이트"; $g5['title'] = "이모티콘 업데이트";
if ($w == 'u') // 업데이트 if ($w == 'u') // 업데이트
+6 -4
View File
@@ -10,8 +10,8 @@ if ($w == 'u') // 업데이트
{ {
// 실제 번호를 넘김 // 실제 번호를 넘김
$k = $_POST['chk'][$i]; $k = $_POST['chk'][$i];
$bg_no = $_POST['bg_no'][$k]; $bg_no = (int) $_POST['bg_no'][$k];
$bg_name = $_POST['bg_name'][$k]; $bg_name = strip_tags($_POST['bg_name'][$k]);
if (!is_numeric($bg_no)) if (!is_numeric($bg_no))
alert('그룹 고유번호가 없습니다.'); alert('그룹 고유번호가 없습니다.');
@@ -36,7 +36,7 @@ else if ($w == 'de') // 그룹삭제
{ {
// 실제 번호를 넘김 // 실제 번호를 넘김
$k = $_POST['chk'][$i]; $k = $_POST['chk'][$i];
$bg_no = $_POST['bg_no'][$k]; $bg_no = (int) $_POST['bg_no'][$k];
if (!is_numeric($bg_no)) if (!is_numeric($bg_no))
alert('그룹 고유번호가 없습니다.'); alert('그룹 고유번호가 없습니다.');
@@ -55,7 +55,7 @@ else if ($w == 'em') // 비우기
{ {
// 실제 번호를 넘김 // 실제 번호를 넘김
$k = $_POST['chk'][$i]; $k = $_POST['chk'][$i];
$bg_no = $_POST['bg_no'][$k]; $bg_no = (int) $_POST['bg_no'][$k];
sql_query("update {$g5['sms5_book_group_table']} set bg_count = 0, bg_member = 0, bg_nomember = 0, bg_receipt = 0, bg_reject = 0 where bg_no='$bg_no'"); sql_query("update {$g5['sms5_book_group_table']} set bg_count = 0, bg_member = 0, bg_nomember = 0, bg_receipt = 0, bg_reject = 0 where bg_no='$bg_no'");
sql_query("delete from {$g5['sms5_book_table']} where bg_no='$bg_no'"); sql_query("delete from {$g5['sms5_book_table']} where bg_no='$bg_no'");
@@ -63,6 +63,8 @@ else if ($w == 'em') // 비우기
} }
else // 등록 else // 등록
{ {
$bg_name = strip_tags($bg_name);
if (!strlen(trim($bg_name))) if (!strlen(trim($bg_name)))
alert('그룹명을 입력해주세요'); alert('그룹명을 입력해주세요');
+1 -1
View File
@@ -15,7 +15,7 @@ $listall = '<a href="'.$_SERVER['SCRIPT_NAME'].'">처음</a>'; //페이지 처
<div class="local_sch local_sch01"> <div class="local_sch local_sch01">
<form name="fvisit" method="get" onsubmit="return fvisit_submit(this);"> <form name="fvisit" method="get" onsubmit="return fvisit_submit(this);">
<?=$listall?> <?php echo $listall?>
<label for="sch_sort" class="sound_only">검색분류</label> <label for="sch_sort" class="sound_only">검색분류</label>
<select name="sfl" id="sch_sort" class="search_sort"> <select name="sfl" id="sch_sort" class="search_sort">
<option value="vi_ip"<?php echo get_selected($sfl, 'vi_ip'); ?>>IP</option> <option value="vi_ip"<?php echo get_selected($sfl, 'vi_ip'); ?>>IP</option>
+2 -2
View File
@@ -28,9 +28,9 @@ include_once(G5_LIB_PATH.'/latest.lib.php');
<?php <?php
// 최신글 // 최신글
$sql = " select bo_table, bo_subject $sql = " select bo_table, bo_subject
from {$g5[board_table]} from {$g5['board_table']}
where gr_id = '{$gr_id}' where gr_id = '{$gr_id}'
and bo_list_level <= '{$member[mb_level]}' and bo_list_level <= '{$member['mb_level']}'
and bo_device <> 'mobile' "; and bo_device <> 'mobile' ";
if(!$is_admin) if(!$is_admin)
$sql .= " and bo_use_cert = '' "; $sql .= " and bo_use_cert = '' ";
+4 -1
View File
@@ -11,7 +11,10 @@ set_cookie('ck_auto', '', 0);
// 자동로그인 해제 end -------------------------------- // 자동로그인 해제 end --------------------------------
if ($url) { if ($url) {
$p = @parse_url($url); if ( substr($url, 0, 2) == '//' )
$url = 'http:' . $url;
$p = @parse_url(urldecode($url));
if ($p['scheme'] || $p['host']) { if ($p['scheme'] || $p['host']) {
alert('url에 도메인을 지정할 수 없습니다.'); alert('url에 도메인을 지정할 수 없습니다.');
} }
+4 -2
View File
@@ -4,10 +4,12 @@ include_once('./_common.php');
if ($is_guest) if ($is_guest)
alert_close('회원만 이용하실 수 있습니다.'); alert_close('회원만 이용하실 수 있습니다.');
set_session('ss_memo_delete_token', $token = uniqid(time()));
$g5['title'] = '내 쪽지함'; $g5['title'] = '내 쪽지함';
include_once(G5_PATH.'/head.sub.php'); include_once(G5_PATH.'/head.sub.php');
if (!$kind) $kind = 'recv'; $kind = $kind ? clean_xss_tags(strip_tags($kind)) : 'recv';
if ($kind == 'recv') if ($kind == 'recv')
$unkind = 'send'; $unkind = 'send';
@@ -65,7 +67,7 @@ for ($i=0; $row=sql_fetch_array($result); $i++)
$list[$i]['send_datetime'] = $send_datetime; $list[$i]['send_datetime'] = $send_datetime;
$list[$i]['read_datetime'] = $read_datetime; $list[$i]['read_datetime'] = $read_datetime;
$list[$i]['view_href'] = './memo_view.php?me_id='.$row['me_id'].'&amp;kind='.$kind; $list[$i]['view_href'] = './memo_view.php?me_id='.$row['me_id'].'&amp;kind='.$kind;
$list[$i]['del_href'] = './memo_delete.php?me_id='.$row['me_id'].'&amp;kind='.$kind; $list[$i]['del_href'] = './memo_delete.php?me_id='.$row['me_id'].'&amp;token='.$token.'&amp;kind='.$kind;
} }
include_once($member_skin_path.'/memo.skin.php'); include_once($member_skin_path.'/memo.skin.php');
+6
View File
@@ -4,6 +4,12 @@ include_once('./_common.php');
if (!$is_member) if (!$is_member)
alert('회원만 이용하실 수 있습니다.'); alert('회원만 이용하실 수 있습니다.');
$delete_token = get_session('ss_memo_delete_token');
set_session('ss_memo_delete_token', '');
if (!($token && $delete_token == $token))
alert('토큰 에러로 삭제 불가합니다.');
$me_id = (int)$_REQUEST['me_id']; $me_id = (int)$_REQUEST['me_id'];
$sql = " select * from {$g5['memo_table']} where me_id = '{$me_id}' "; $sql = " select * from {$g5['memo_table']} where me_id = '{$me_id}' ";
+4 -2
View File
@@ -115,7 +115,9 @@ while ($row = sql_fetch_array($result))
if ($row3['bf_file']) if ($row3['bf_file'])
{ {
// 원본파일을 복사하고 퍼미션을 변경 // 원본파일을 복사하고 퍼미션을 변경
@copy($src_dir.'/'.$row3['bf_file'], $dst_dir.'/'.$row3['bf_file']); // 제이프로님 코드제안 적용
$copy_file_name = ($bo_table !== $move_bo_table) ? $row3['bf_file'] : $row2['wr_id'].'_copy_'.$insert_id.'_'.$row3['bf_file'];
@copy($src_dir.'/'.$row3['bf_file'], $dst_dir.'/'.$copy_file_name);
@chmod($dst_dir/$row3['bf_file'], G5_FILE_PERMISSION); @chmod($dst_dir/$row3['bf_file'], G5_FILE_PERMISSION);
} }
@@ -124,7 +126,7 @@ while ($row = sql_fetch_array($result))
wr_id = '$insert_id', wr_id = '$insert_id',
bf_no = '{$row3['bf_no']}', bf_no = '{$row3['bf_no']}',
bf_source = '".addslashes($row3['bf_source'])."', bf_source = '".addslashes($row3['bf_source'])."',
bf_file = '{$row3['bf_file']}', bf_file = '$copy_file_name',
bf_download = '{$row3['bf_download']}', bf_download = '{$row3['bf_download']}',
bf_content = '".addslashes($row3['bf_content'])."', bf_content = '".addslashes($row3['bf_content'])."',
bf_filesize = '{$row3['bf_filesize']}', bf_filesize = '{$row3['bf_filesize']}',
+1 -1
View File
@@ -69,7 +69,7 @@ for($i=0;$i<count($_POST['chk_bn_id']);$i++)
if ($pressed == '선택내용삭제') { if ($pressed == '선택내용삭제') {
// 게시글 내용만 삭제 // 게시글 내용만 삭제
sql_query(" update $write_table set wr_subject = '{$g5['time_ymdhis']} - 본인 요청으로 인한 삭제 (냉무) ☆', wr_content = '', wr_name='본인요청삭제☆' where wr_id = '{$write['wr_id']}' "); sql_query(" update $write_table set wr_subject = '".G5_TIME_YMDHIS." - 본인 요청으로 인한 삭제 (냉무) ☆', wr_content = '', wr_name='본인요청삭제☆' where wr_id = '{$write['wr_id']}' ");
} else { } else {
// 게시글 삭제 // 게시글 삭제
sql_query(" delete from $write_table where wr_parent = '{$write['wr_id']}' "); sql_query(" delete from $write_table where wr_parent = '{$write['wr_id']}' ");
+1 -1
View File
@@ -4,7 +4,7 @@ include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
include_once(G5_LIB_PATH.'/mailer.lib.php'); include_once(G5_LIB_PATH.'/mailer.lib.php');
if ($is_member) { if ($is_member) {
alert('이미 로그인중입니다.'); alert_close('이미 로그인중입니다.', G5_URL);
} }
if (!chk_captcha()) { if (!chk_captcha()) {
+6
View File
@@ -4,6 +4,12 @@ include_once('./_common.php');
if($is_guest) if($is_guest)
alert('회원이시라면 로그인 후 이용해 주십시오.', G5_URL); alert('회원이시라면 로그인 후 이용해 주십시오.', G5_URL);
$delete_token = get_session('ss_qa_delete_token');
set_session('ss_qa_delete_token', '');
if (!($token && $delete_token == $token))
alert('토큰 에러로 삭제 불가합니다.');
$tmp_array = array(); $tmp_array = array();
if ($qa_id) // 건별삭제 if ($qa_id) // 건별삭제
$tmp_array[0] = $qa_id; $tmp_array[0] = $qa_id;
+2 -1
View File
@@ -109,7 +109,8 @@ if(is_file($skin_file)) {
*/ */
if(($view['qa_type'] && $is_admin) || (!$view['qa_type'] && $view['qa_status'] == 0)) { if(($view['qa_type'] && $is_admin) || (!$view['qa_type'] && $view['qa_status'] == 0)) {
$update_href = G5_BBS_URL.'/qawrite.php?w=u&amp;qa_id='.$view['qa_id'].$qstr; $update_href = G5_BBS_URL.'/qawrite.php?w=u&amp;qa_id='.$view['qa_id'].$qstr;
$delete_href = G5_BBS_URL.'/qadelete.php?qa_id='.$view['qa_id'].$qstr; set_session('ss_qa_delete_token', $token = uniqid(time()));
$delete_href = G5_BBS_URL.'/qadelete.php?qa_id='.$view['qa_id'].'&amp;token='.$token.$qstr;
} }
// 질문글이고 등록된 답변이 있다면 // 질문글이고 등록된 답변이 있다면
+1 -1
View File
@@ -200,7 +200,7 @@ for ($i=1; $i<=count($_FILES['bf_file']['name']); $i++) {
$upload[$i]['filesize'] = $filesize; $upload[$i]['filesize'] = $filesize;
// 아래의 문자열이 들어간 파일은 -x 를 붙여서 웹경로를 알더라도 실행을 하지 못하도록 함 // 아래의 문자열이 들어간 파일은 -x 를 붙여서 웹경로를 알더라도 실행을 하지 못하도록 함
$filename = preg_replace("/\.(php|phtm|htm|cgi|pl|exe|jsp|asp|inc)/i", "$0-x", $filename); $filename = preg_replace("/\.(php|pht|phtm|htm|cgi|pl|exe|jsp|asp|inc)/i", "$0-x", $filename);
shuffle($chars_array); shuffle($chars_array);
$shuffle = implode('', $chars_array); $shuffle = implode('', $chars_array);
+1 -1
View File
@@ -524,7 +524,7 @@ for ($i=0; $i<count($_FILES['bf_file']['name']); $i++) {
$upload[$i]['filesize'] = $filesize; $upload[$i]['filesize'] = $filesize;
// 아래의 문자열이 들어간 파일은 -x 를 붙여서 웹경로를 알더라도 실행을 하지 못하도록 함 // 아래의 문자열이 들어간 파일은 -x 를 붙여서 웹경로를 알더라도 실행을 하지 못하도록 함
$filename = preg_replace("/\.(php|phtm|htm|cgi|pl|exe|jsp|asp|inc)/i", "$0-x", $filename); $filename = preg_replace("/\.(php|pht|phtm|htm|cgi|pl|exe|jsp|asp|inc)/i", "$0-x", $filename);
shuffle($chars_array); shuffle($chars_array);
$shuffle = implode('', $chars_array); $shuffle = implode('', $chars_array);
+4 -3
View File
@@ -29,7 +29,8 @@ for ($i=0; $i<$ext_cnt; $i++) {
function g5_path() function g5_path()
{ {
$result['path'] = str_replace('\\', '/', dirname(__FILE__)); $chroot = substr($_SERVER['SCRIPT_FILENAME'], 0, strpos($_SERVER['SCRIPT_FILENAME'], dirname(__FILE__)));
$result['path'] = str_replace('\\', '/', $chroot.dirname(__FILE__));
$tilde_remove = preg_replace('/^\/\~[^\/]+(.*)$/', '$1', $_SERVER['SCRIPT_NAME']); $tilde_remove = preg_replace('/^\/\~[^\/]+(.*)$/', '$1', $_SERVER['SCRIPT_NAME']);
$document_root = str_replace($tilde_remove, '', $_SERVER['SCRIPT_FILENAME']); $document_root = str_replace($tilde_remove, '', $_SERVER['SCRIPT_FILENAME']);
$pattern = '/' . preg_quote($document_root, '/') . '/i'; $pattern = '/' . preg_quote($document_root, '/') . '/i';
@@ -139,7 +140,7 @@ if (file_exists($dbconfig_file)) {
sql_set_charset('utf8', $connect_db); sql_set_charset('utf8', $connect_db);
if(defined('G5_MYSQL_SET_MODE') && G5_MYSQL_SET_MODE) sql_query("SET SESSION sql_mode = ''"); if(defined('G5_MYSQL_SET_MODE') && G5_MYSQL_SET_MODE) sql_query("SET SESSION sql_mode = ''");
if (defined(G5_TIMEZONE)) sql_query(" set time_zone = '".G5_TIMEZONE."'"); if (defined('G5_TIMEZONE')) sql_query(" set time_zone = '".G5_TIMEZONE."'");
} else { } else {
?> ?>
@@ -485,7 +486,7 @@ if(isset($config['cf_theme']) && trim($config['cf_theme'])) {
// 테마 설정 로드 // 테마 설정 로드
if(is_file(G5_THEME_PATH.'/theme.config.php')) if(defined('G5_THEME_PATH') && is_file(G5_THEME_PATH.'/theme.config.php'))
include_once(G5_THEME_PATH.'/theme.config.php'); include_once(G5_THEME_PATH.'/theme.config.php');
//===================================================================================== //=====================================================================================
+1 -1
View File
@@ -5,7 +5,7 @@
********************/ ********************/
define('G5_VERSION', '그누보드5'); define('G5_VERSION', '그누보드5');
define('G5_GNUBOARD_VER', '5.2.9.3'); define('G5_GNUBOARD_VER', '5.2.9.8');
// 이 상수가 정의되지 않으면 각각의 개별 페이지는 별도로 실행될 수 없음 // 이 상수가 정의되지 않으면 각각의 개별 페이지는 별도로 실행될 수 없음
define('_GNUBOARD_', true); define('_GNUBOARD_', true);
+5
View File
@@ -125,6 +125,7 @@ if($is_admin != 'super')
<p>프로그램을 실행하시려면 그누보드4의 config.php 파일 경로를 입력하신 후 확인을 클릭해 주십시오.</p> <p>프로그램을 실행하시려면 그누보드4의 config.php 파일 경로를 입력하신 후 확인을 클릭해 주십시오.</p>
<form name="fimport" method="post" action="./g4_import_run.php" onsubmit="return fimport_submit(this);"> <form name="fimport" method="post" action="./g4_import_run.php" onsubmit="return fimport_submit(this);">
<input type="hidden" name="token" value="" >
<div id="g4_import_frm"> <div id="g4_import_frm">
<label for="file_path">config.php 파일 경로</label> <label for="file_path">config.php 파일 경로</label>
<input type="text" name="file_path" id="file_path" required class="frm_input required"> <input type="text" name="file_path" id="file_path" required class="frm_input required">
@@ -142,6 +143,10 @@ if($is_admin != 'super')
<script> <script>
function fimport_submit(f) function fimport_submit(f)
{ {
var token = get_write_token('g4_import');
f.token.value = token;
return confirm('그누보드4의 DB 데이터를 이전하시겠습니까?'); return confirm('그누보드4의 DB 데이터를 이전하시겠습니까?');
} }
</script> </script>
+51 -1
View File
@@ -17,6 +17,13 @@ echo '<link rel="stylesheet" href="'.G5_URL.'/g4_import.css">';
if(empty($_POST)) if(empty($_POST))
alert('올바른 방법으로 이용해 주십시오.', G5_URL); alert('올바른 방법으로 이용해 주십시오.', G5_URL);
if (!preg_match("/^http['s']?:\/\/".$_SERVER['HTTP_HOST']."/", $_SERVER['HTTP_REFERER'])){
alert("제대로 된 접근이 아닌것 같습니다.", G5_URL);
}
// 토큰체크
check_write_token('g4_import');
if(get_session('tables_copied') == 'done') if(get_session('tables_copied') == 'done')
alert('DB 데이터 변환을 이미 실행하였습니다. 중복 실행시 오류가 발생할 수 있습니다.', G5_URL); alert('DB 데이터 변환을 이미 실행하였습니다. 중복 실행시 오류가 발생할 수 있습니다.', G5_URL);
@@ -165,7 +172,7 @@ document.onkeydown = noRefresh ;
flush(); flush();
// g4의 confing.php // g4의 confing.php
require($g4_config_file); require('./'.$g4_config_file);
if(preg_replace('/[^a-z]/', '', strtolower($g4['charset'])) == 'euckr') if(preg_replace('/[^a-z]/', '', strtolower($g4['charset'])) == 'euckr')
$is_euckr = true; $is_euckr = true;
@@ -372,10 +379,53 @@ document.onkeydown = noRefresh ;
$comma = ''; $comma = '';
$sql_common = ''; $sql_common = '';
// 모바일 스킨 디렉토리
if( ! isset($row['bo_mobile_skin']) ){
$row['bo_mobile_skin'] = 'basic';
}
// 모바일 제목 길이
if( ! isset($row['bo_mobile_subject_len']) ){
$row['bo_mobile_subject_len'] = '30';
}
// 모바일 페이지당 목록 수
if( ! isset($row['bo_mobile_page_rows']) ){
$row['bo_mobile_page_rows'] = '15';
}
// 갤러리 이미지 폭 ( 리스트 )
if( ! isset($row['bo_gallery_width']) ){
$row['bo_gallery_width'] = '174';
}
// 갤러리 이미지 높이 ( 리스트 )
if( ! isset($row['bo_gallery_height']) ){
$row['bo_gallery_height'] = '124';
}
// 모바일 갤러리 이미지 폭 ( 리스트 )
if( ! isset($row['bo_mobile_gallery_width']) ){
$row['bo_mobile_gallery_width'] = '125';
}
// 모바일 갤러리 이미지 높이 ( 리스트 )
if( ! isset($row['bo_mobile_gallery_height']) ){
$row['bo_mobile_gallery_height'] = '100';
}
foreach($row as $key=>$val) { foreach($row as $key=>$val) {
if(!in_array($key, $columns)) if(!in_array($key, $columns))
continue; continue;
if($key === 'bo_notice'){
$val = str_replace("\n", ",", $val);
if( substr($val, -1) === ',' ){
$val = substr($val, 0, -1);
}
}
$sql_common .= $comma . " $key = '".addslashes($val)."' "; $sql_common .= $comma . " $key = '".addslashes($val)."' ";
$comma = ','; $comma = ',';
+1 -1
View File
@@ -287,7 +287,7 @@ fclose($f);
// data 디렉토리 및 하위 디렉토리에서는 .htaccess .htpasswd .php .phtml .html .htm .inc .cgi .pl 파일을 실행할수 없게함. // data 디렉토리 및 하위 디렉토리에서는 .htaccess .htpasswd .php .phtml .html .htm .inc .cgi .pl 파일을 실행할수 없게함.
$f = fopen($data_path.'/.htaccess', 'w'); $f = fopen($data_path.'/.htaccess', 'w');
$str = <<<EOD $str = <<<EOD
<FilesMatch "\.(htaccess|htpasswd|[Pp][Hh][Pp]|[Pp]?[Hh][Tt][Mm][Ll]?|[Ii][Nn][Cc]|[Cc][Gg][Ii]|[Pp][Ll])"> <FilesMatch "\.(htaccess|htpasswd|[Pp][Hh][Pp]|[Pp][Hh][Tt]|[Pp]?[Hh][Tt][Mm][Ll]?|[Ii][Nn][Cc]|[Cc][Gg][Ii]|[Pp][Ll])">
Order allow,deny Order allow,deny
Deny from all Deny from all
</FilesMatch> </FilesMatch>
+8 -1
View File
@@ -70,6 +70,8 @@ function number_format(data)
var comma = ','; var comma = ',';
var i; var i;
data = data + '';
var sign = data.match(/^[\+\-]/); var sign = data.match(/^[\+\-]/);
if(sign) { if(sign) {
data = data.replace(/^[\+\-]/, ""); data = data.replace(/^[\+\-]/, "");
@@ -721,8 +723,13 @@ function get_write_token(bo_table)
} }
$(function() { $(function() {
$(document).on("click", "form[name=fwrite] input:submit, form[name=fwrite] button:submit", function() { $(document).on("click", "form[name=fwrite] input:submit, form[name=fwrite] button:submit, form[name=fwrite] input:image", function() {
var f = this.form; var f = this.form;
if (typeof(f.bo_table) == "undefined") {
return;
}
var bo_table = f.bo_table.value; var bo_table = f.bo_table.value;
var token = get_write_token(bo_table); var token = get_write_token(bo_table);
+74 -42
View File
@@ -153,7 +153,7 @@ function alert($msg='', $url='', $error=true, $post=false)
global $g5, $config, $member; global $g5, $config, $member;
global $is_admin; global $is_admin;
if (!$msg) $msg = '올바른 방법으로 이용해 주십시오.'; $msg = $msg ? strip_tags($msg, '<br>') : '올바른 방법으로 이용해 주십시오.';
$header = ''; $header = '';
if (isset($g5['title'])) { if (isset($g5['title'])) {
@@ -169,6 +169,8 @@ function alert_close($msg, $error=true)
{ {
global $g5; global $g5;
$msg = strip_tags($msg, '<br>');
$header = ''; $header = '';
if (isset($g5['title'])) { if (isset($g5['title'])) {
$header = $g5['title']; $header = $g5['title'];
@@ -214,11 +216,12 @@ function url_auto_link($str)
// 140326 유창화님 제안코드로 수정 // 140326 유창화님 제안코드로 수정
// http://sir.kr/pg_lecture/461 // http://sir.kr/pg_lecture/461
// http://sir.kr/pg_lecture/463 // http://sir.kr/pg_lecture/463
$attr_nofollow = (function_exists('check_html_link_nofollow') && check_html_link_nofollow('url_auto_link')) ? ' rel="nofollow"' : '';
$str = str_replace(array("&lt;", "&gt;", "&amp;", "&quot;", "&nbsp;", "&#039;"), array("\t_lt_\t", "\t_gt_\t", "&", "\"", "\t_nbsp_\t", "'"), $str); $str = str_replace(array("&lt;", "&gt;", "&amp;", "&quot;", "&nbsp;", "&#039;"), array("\t_lt_\t", "\t_gt_\t", "&", "\"", "\t_nbsp_\t", "'"), $str);
//$str = preg_replace("`(?:(?:(?:href|src)\s*=\s*(?:\"|'|)){0})((http|https|ftp|telnet|news|mms)://[^\"'\s()]+)`", "<A HREF=\"\\1\" TARGET='{$config['cf_link_target']}'>\\1</A>", $str); //$str = preg_replace("`(?:(?:(?:href|src)\s*=\s*(?:\"|'|)){0})((http|https|ftp|telnet|news|mms)://[^\"'\s()]+)`", "<A HREF=\"\\1\" TARGET='{$config['cf_link_target']}'>\\1</A>", $str);
$str = preg_replace("/([^(href=\"?'?)|(src=\"?'?)]|\(|^)((http|https|ftp|telnet|news|mms):\/\/[a-zA-Z0-9\.-]+\.[가-힣\xA1-\xFEa-zA-Z0-9\.:&#!=_\?\/~\+%@;\-\|\,\(\)]+)/i", "\\1<A HREF=\"\\2\" TARGET=\"{$config['cf_link_target']}\">\\2</A>", $str); $str = preg_replace("/([^(href=\"?'?)|(src=\"?'?)]|\(|^)((http|https|ftp|telnet|news|mms):\/\/[a-zA-Z0-9\.-]+\.[가-힣\xA1-\xFEa-zA-Z0-9\.:&#!=_\?\/~\+%@;\-\|\,\(\)]+)/i", "\\1<A HREF=\"\\2\" TARGET=\"{$config['cf_link_target']}\" $attr_nofollow>\\2</A>", $str);
$str = preg_replace("/(^|[\"'\s(])(www\.[^\"'\s()]+)/i", "\\1<A HREF=\"http://\\2\" TARGET=\"{$config['cf_link_target']}\">\\2</A>", $str); $str = preg_replace("/(^|[\"'\s(])(www\.[^\"'\s()]+)/i", "\\1<A HREF=\"http://\\2\" TARGET=\"{$config['cf_link_target']}\" $attr_nofollow>\\2</A>", $str);
$str = preg_replace("/[0-9a-z_-]+@[a-z0-9._-]{4,}/i", "<a href=\"mailto:\\0\">\\0</a>", $str); $str = preg_replace("/[0-9a-z_-]+@[a-z0-9._-]{4,}/i", "<a href=\"mailto:\\0\" $attr_nofollow>\\0</a>", $str);
$str = str_replace(array("\t_nbsp_\t", "\t_lt_\t", "\t_gt_\t", "'"), array("&nbsp;", "&lt;", "&gt;", "&#039;"), $str); $str = str_replace(array("\t_nbsp_\t", "\t_lt_\t", "\t_gt_\t", "'"), array("&nbsp;", "&lt;", "&gt;", "&#039;"), $str);
/* /*
@@ -536,6 +539,9 @@ function conv_content($content, $html, $filter=true)
return $content; return $content;
} }
function check_html_link_nofollow($type=''){
return true;
}
// http://htmlpurifier.org/ // http://htmlpurifier.org/
// Standards-Compliant HTML Filtering // Standards-Compliant HTML Filtering
@@ -559,6 +565,7 @@ function html_purifier($html)
$safeiframe = implode('|', $domains); $safeiframe = implode('|', $domains);
include_once(G5_PLUGIN_PATH.'/htmlpurifier/HTMLPurifier.standalone.php'); include_once(G5_PLUGIN_PATH.'/htmlpurifier/HTMLPurifier.standalone.php');
include_once(G5_PLUGIN_PATH.'/htmlpurifier/extend.video.php');
$config = HTMLPurifier_Config::createDefault(); $config = HTMLPurifier_Config::createDefault();
// data/cache 디렉토리에 CSS, HTML, URI 디렉토리 등을 만든다. // data/cache 디렉토리에 CSS, HTML, URI 디렉토리 등을 만든다.
$config->set('Cache.SerializerPath', G5_DATA_PATH.'/cache'); $config->set('Cache.SerializerPath', G5_DATA_PATH.'/cache');
@@ -566,8 +573,13 @@ function html_purifier($html)
$config->set('HTML.SafeObject', false); $config->set('HTML.SafeObject', false);
$config->set('Output.FlashCompat', false); $config->set('Output.FlashCompat', false);
$config->set('HTML.SafeIframe', true); $config->set('HTML.SafeIframe', true);
if( (function_exists('check_html_link_nofollow') && check_html_link_nofollow('html_purifier')) ){
$config->set('HTML.Nofollow', true); // rel=nofollow 으로 스팸유입을 줄임
}
$config->set('URI.SafeIframeRegexp','%^(https?:)?//('.$safeiframe.')%'); $config->set('URI.SafeIframeRegexp','%^(https?:)?//('.$safeiframe.')%');
$config->set('Attr.AllowedFrameTargets', array('_blank')); $config->set('Attr.AllowedFrameTargets', array('_blank'));
//유튜브, 비메오 전체화면 가능하게 하기
$config->set('Filter.Custom', array(new HTMLPurifier_Filter_Iframevideo()));
$purifier = new HTMLPurifier($config); $purifier = new HTMLPurifier($config);
return $purifier->purify($html); return $purifier->purify($html);
} }
@@ -1211,8 +1223,8 @@ function get_sideview($mb_id, $name='', $email='', $homepage='')
$tmp_name = ""; $tmp_name = "";
if ($mb_id) { if ($mb_id) {
//$tmp_name = "<a href=\"".G5_BBS_URL."/profile.php?mb_id=".$mb_id."\" class=\"sv_member\" title=\"$name 자기소개\" target=\"_blank\" onclick=\"return false;\">$name</a>"; //$tmp_name = "<a href=\"".G5_BBS_URL."/profile.php?mb_id=".$mb_id."\" class=\"sv_member\" title=\"$name 자기소개\" rel="nofollow" target=\"_blank\" onclick=\"return false;\">$name</a>";
$tmp_name = '<a href="'.G5_BBS_URL.'/profile.php?mb_id='.$mb_id.'" class="sv_member" title="'.$name.' 자기소개" target="_blank" onclick="return false;">'; $tmp_name = '<a href="'.G5_BBS_URL.'/profile.php?mb_id='.$mb_id.'" class="sv_member" title="'.$name.' 자기소개" target="_blank" rel="nofollow" onclick="return false;">';
if ($config['cf_use_member_icon']) { if ($config['cf_use_member_icon']) {
$mb_dir = substr($mb_id,0,2); $mb_dir = substr($mb_id,0,2);
@@ -1239,7 +1251,7 @@ function get_sideview($mb_id, $name='', $email='', $homepage='')
if(!$bo_table) if(!$bo_table)
return $name; return $name;
$tmp_name = '<a href="'.G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&amp;sca='.$sca.'&amp;sfl=wr_name,1&amp;stx='.$name.'" title="'.$name.' 이름으로 검색" class="sv_guest" onclick="return false;">'.$name.'</a>'; $tmp_name = '<a href="'.G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&amp;sca='.$sca.'&amp;sfl=wr_name,1&amp;stx='.$name.'" title="'.$name.' 이름으로 검색" class="sv_guest" rel="nofollow" onclick="return false;">'.$name.'</a>';
$title_mb_id = '[비회원]'; $title_mb_id = '[비회원]';
} }
@@ -2020,7 +2032,11 @@ function sql_real_escape_string($str, $link=null)
if(!$link) if(!$link)
$link = $g5['connect_db']; $link = $g5['connect_db'];
return mysqli_real_escape_string($link, $str); if(function_exists('mysqli_connect') && G5_MYSQLI_USE) {
return mysqli_real_escape_string($link, $str);
}
return mysql_real_escape_string($str, $link);
} }
function escape_trim($field) function escape_trim($field)
@@ -2131,6 +2147,10 @@ function check_device($device)
// 게시판 최신글 캐시 파일 삭제 // 게시판 최신글 캐시 파일 삭제
function delete_cache_latest($bo_table) function delete_cache_latest($bo_table)
{ {
if (!preg_match("/^([A-Za-z0-9_]{1,20})$/", $bo_table)) {
return;
}
$files = glob(G5_DATA_PATH.'/cache/latest-'.$bo_table.'-*'); $files = glob(G5_DATA_PATH.'/cache/latest-'.$bo_table.'-*');
if (is_array($files)) { if (is_array($files)) {
foreach ($files as $filename) foreach ($files as $filename)
@@ -2932,9 +2952,13 @@ function replace_filename($name)
@session_start(); @session_start();
$ss_id = session_id(); $ss_id = session_id();
$usec = get_microtime(); $usec = get_microtime();
$ext = array_pop(explode('.', $name)); $file_path = pathinfo($name);
$ext = $file_path['extension'];
$return_filename = sha1($ss_id.$_SERVER['REMOTE_ADDR'].$usec);
if( $ext )
$return_filename .= '.'.$ext;
return sha1($ss_id.$_SERVER['REMOTE_ADDR'].$usec).'.'.$ext; return $return_filename;
} }
// 아이코드 사용자정보 // 아이코드 사용자정보
@@ -3302,46 +3326,54 @@ function get_call_func_cache($func, $args=array()){
} }
// include 하는 경로에 data file 경로가 포함되어 있는지 체크합니다. // include 하는 경로에 data file 경로가 포함되어 있는지 체크합니다.
function is_include_path_check($path='') function is_include_path_check($path='', $is_input='')
{ {
if( $path ){ if( $path ){
try { if ($is_input){
// whether $path is unix or not try {
$unipath = strlen($path)==0 || $path{0}!='/'; // whether $path is unix or not
$unc = substr($path,0,2)=='\\\\'?true:false; $unipath = strlen($path)==0 || $path{0}!='/';
// attempts to detect if path is relative in which case, add cwd $unc = substr($path,0,2)=='\\\\'?true:false;
if(strpos($path,':') === false && $unipath && !$unc){ // attempts to detect if path is relative in which case, add cwd
$path=getcwd().DIRECTORY_SEPARATOR.$path; if(strpos($path,':') === false && $unipath && !$unc){
if($path{0}=='/'){ $path=getcwd().DIRECTORY_SEPARATOR.$path;
$unipath = false; if($path{0}=='/'){
$unipath = false;
}
} }
// resolve path parts (single dot, double dot and double delimiters)
$path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path);
$parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
$absolutes = array();
foreach ($parts as $part) {
if ('.' == $part){
continue;
}
if ('..' == $part) {
array_pop($absolutes);
} else {
$absolutes[] = $part;
}
}
$path = implode(DIRECTORY_SEPARATOR, $absolutes);
// resolve any symlinks
// put initial separator that could have been lost
$path = !$unipath ? '/'.$path : $path;
$path = $unc ? '\\\\'.$path : $path;
} catch (Exception $e) {
//echo 'Caught exception: ', $e->getMessage(), "\n";
return false;
} }
// resolve path parts (single dot, double dot and double delimiters) if( preg_match('/\/data\/(file|editor)\/[A-Za-z0-9_]{1,20}\//', $path) ){
$path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path); return false;
$parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
$absolutes = array();
foreach ($parts as $part) {
if ('.' == $part){
continue;
}
if ('..' == $part) {
array_pop($absolutes);
} else {
$absolutes[] = $part;
}
} }
$path = implode(DIRECTORY_SEPARATOR, $absolutes);
// resolve any symlinks
// put initial separator that could have been lost
$path = !$unipath ? '/'.$path : $path;
$path = $unc ? '\\\\'.$path : $path;
} catch (Exception $e) {
//echo 'Caught exception: ', $e->getMessage(), "\n";
return false;
} }
if( preg_match('/\/data\/(file|editor)\/[A-Za-z0-9_]{1,20}\//', $path) ){ $extension = pathinfo($path, PATHINFO_EXTENSION);
if($extension && preg_match('/(jpg|jpeg|png|gif|bmp|conf)$/', $extension)) {
return false; return false;
} }
} }
+18 -6
View File
@@ -284,6 +284,7 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h
$is_large = true; $is_large = true;
// width, height 설정 // width, height 설정
if($thumb_width) { if($thumb_width) {
if(!$thumb_height) { if(!$thumb_height) {
$thumb_height = round(($thumb_width * $size[1]) / $size[0]); $thumb_height = round(($thumb_width * $size[1]) / $size[0]);
@@ -348,7 +349,6 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h
} else { // 비율에 맞게 생성 } else { // 비율에 맞게 생성
$dst = imagecreatetruecolor($dst_w, $dst_h); $dst = imagecreatetruecolor($dst_w, $dst_h);
$bgcolor = imagecolorallocate($dst, 255, 255, 255); // 배경색 $bgcolor = imagecolorallocate($dst, 255, 255, 255); // 배경색
if($src_w > $src_h) { if($src_w > $src_h) {
$tmp_h = round(($dst_w * $src_h) / $src_w); $tmp_h = round(($dst_w * $src_h) / $src_w);
$dst_y = round(($dst_h - $tmp_h) / 2); $dst_y = round(($dst_h - $tmp_h) / 2);
@@ -384,8 +384,14 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h
if($src_w < $dst_w) { if($src_w < $dst_w) {
if($src_h >= $dst_h) { if($src_h >= $dst_h) {
$dst_x = round(($dst_w - $src_w) / 2); if( $src_h > $src_w ){
$src_h = $dst_h; $tmp_w = round(($dst_h * $src_w) / $src_h);
$dst_x = round(($dst_w - $tmp_w) / 2);
$dst_w = $tmp_w;
} else {
$dst_x = round(($dst_w - $src_w) / 2);
$src_h = $dst_h;
}
} else { } else {
$dst_x = round(($dst_w - $src_w) / 2); $dst_x = round(($dst_w - $src_w) / 2);
$dst_y = round(($dst_h - $src_h) / 2); $dst_y = round(($dst_h - $src_h) / 2);
@@ -394,9 +400,15 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h
} }
} else { } else {
if($src_h < $dst_h) { if($src_h < $dst_h) {
$dst_y = round(($dst_h - $src_h) / 2); if( $src_w > $dst_w ){
$dst_h = $src_h; $tmp_h = round(($dst_w * $src_h) / $src_w);
$src_w = $dst_w; $dst_y = round(($dst_h - $tmp_h) / 2);
$dst_h = $tmp_h;
} else {
$dst_y = round(($dst_h - $src_h) / 2);
$dst_h = $src_h;
$src_w = $dst_w;
}
} }
} }
+8 -2
View File
@@ -9,9 +9,15 @@ add_stylesheet('<link rel="stylesheet" href="'.$popular_skin_url.'/style.css">',
<div> <div>
<h2>인기검색어</h2> <h2>인기검색어</h2>
<ul> <ul>
<?php for ($i=0; $i<count($list); $i++) { ?> <?php
if( isset($list) && is_array($list) ){
for ($i=0; $i<count($list); $i++) {
?>
<li><a href="<?php echo G5_BBS_URL ?>/search.php?sfl=wr_subject&amp;sop=and&amp;stx=<?php echo urlencode($list[$i]['pp_word']) ?>"><?php echo get_text($list[$i]['pp_word']); ?></a></li> <li><a href="<?php echo G5_BBS_URL ?>/search.php?sfl=wr_subject&amp;sop=and&amp;stx=<?php echo urlencode($list[$i]['pp_word']) ?>"><?php echo get_text($list[$i]['pp_word']); ?></a></li>
<?php } ?> <?php
} //end for
} //end if
?>
</ul> </ul>
</div> </div>
</aside> </aside>
@@ -48,8 +48,8 @@
</div> </div>
</div> </div>
<script src="./js/jquery-1.8.3.min.js"></script> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="./js/jquery-ui.min.js"></script> <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js"></script>
<!-- The Iframe Transport is required for browsers without support for XHR file uploads --> <!-- The Iframe Transport is required for browsers without support for XHR file uploads -->
<script src="./js/jquery.iframe-transport.js"></script> <script src="./js/jquery.iframe-transport.js"></script>
@@ -1,2 +0,0 @@
/*! jQuery v1.8.3 jquery.com | jquery.org/license */
(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)v.event.add(t,n,u[n][r])}o.data&&(o.data=v.extend({},o.data))}function Ot(e,t){var n;if(t.nodeType!==1)return;t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),n==="object"?(t.parentNode&&(t.outerHTML=e.outerHTML),v.support.html5Clone&&e.innerHTML&&!v.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):n==="input"&&Et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):n==="option"?t.selected=e.defaultSelected:n==="input"||n==="textarea"?t.defaultValue=e.defaultValue:n==="script"&&t.text!==e.text&&(t.text=e.text),t.removeAttribute(v.expando)}function Mt(e){return typeof e.getElementsByTagName!="undefined"?e.getElementsByTagName("*"):typeof e.querySelectorAll!="undefined"?e.querySelectorAll("*"):[]}function _t(e){Et.test(e.type)&&(e.defaultChecked=e.checked)}function Qt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Jt.length;while(i--){t=Jt[i]+n;if(t in e)return t}return r}function Gt(e,t){return e=t||e,v.css(e,"display")==="none"||!v.contains(e.ownerDocument,e)}function Yt(e,t){var n,r,i=[],s=0,o=e.length;for(;s<o;s++){n=e[s];if(!n.style)continue;i[s]=v._data(n,"olddisplay"),t?(!i[s]&&n.style.display==="none"&&(n.style.display=""),n.style.display===""&&Gt(n)&&(i[s]=v._data(n,"olddisplay",nn(n.nodeName)))):(r=Dt(n,"display"),!i[s]&&r!=="none"&&v._data(n,"olddisplay",r))}for(s=0;s<o;s++){n=e[s];if(!n.style)continue;if(!t||n.style.display==="none"||n.style.display==="")n.style.display=t?i[s]||"":"none"}return e}function Zt(e,t,n){var r=Rt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function en(e,t,n,r){var i=n===(r?"border":"content")?4:t==="width"?1:0,s=0;for(;i<4;i+=2)n==="margin"&&(s+=v.css(e,n+$t[i],!0)),r?(n==="content"&&(s-=parseFloat(Dt(e,"padding"+$t[i]))||0),n!=="margin"&&(s-=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0)):(s+=parseFloat(Dt(e,"padding"+$t[i]))||0,n!=="padding"&&(s+=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0));return s}function tn(e,t,n){var r=t==="width"?e.offsetWidth:e.offsetHeight,i=!0,s=v.support.boxSizing&&v.css(e,"boxSizing")==="border-box";if(r<=0||r==null){r=Dt(e,t);if(r<0||r==null)r=e.style[t];if(Ut.test(r))return r;i=s&&(v.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+en(e,t,n||(s?"border":"content"),i)+"px"}function nn(e){if(Wt[e])return Wt[e];var t=v("<"+e+">").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write("<!doctype html><html><body>"),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u<a;u++)r=o[u],s=/^\+/.test(r),s&&(r=r.substr(1)||"*"),i=e[r]=e[r]||[],i[s?"unshift":"push"](n)}}function kn(e,n,r,i,s,o){s=s||n.dataTypes[0],o=o||{},o[s]=!0;var u,a=e[s],f=0,l=a?a.length:0,c=e===Sn;for(;f<l&&(c||!u);f++)u=a[f](n,r,i),typeof u=="string"&&(!c||o[u]?u=t:(n.dataTypes.unshift(u),u=kn(e,n,r,i,u,o)));return(c||!u)&&!o["*"]&&(u=kn(e,n,r,i,"*",o)),u}function Ln(e,n){var r,i,s=v.ajaxSettings.flatOptions||{};for(r in n)n[r]Line truncated
@@ -1,5 +0,0 @@
/*! jQuery UI - v1.10.1 - 2013-02-15
* http://jqueryui.com
* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.effect.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js, jquery.ui.menu.js, jquery.ui.position.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js
* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */
(function(e,t){function i(t,n){var r,i,o,u=t.nodeName.toLowerCase();return"area"===u?(r=t.parentNode,i=r.name,!t.href||!i||r.nodeName.toLowerCase()!=="map"?!1:(o=e("img[usemap=#"+i+"]")[0],!!o&&s(o))):(/input|select|textarea|button|object/.test(u)?!t.disabled:"a"===u?t.href||n:n)&&s(t)}function s(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return e.css(this,"visibility")==="hidden"}).length}var n=0,r=/^ui-id-\d+$/;e.ui=e.ui||{};if(e.ui.version)return;e.extend(e.ui,{version:"1.10.1",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({_focus:e.fn.focus,focus:function(t,n){return typeof t=="number"?this.each(function(){var r=this;setTimeout(function(){e(r).focus(),n&&n.call(r)},t)}):this._focus.apply(this,arguments)},scrollParent:function(){var t;return e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?t=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):t=this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(n){if(n!==t)return this.css("zIndex",n);if(this.length){var r=e(this[0]),i,s;while(r.length&&r[0]!==document){i=r.css("position");if(i==="absolute"||i==="relative"||i==="fixed"){s=parseInt(r.css("zIndex"),10);if(!isNaN(s)&&s!==0)return s}r=r.parent()}}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++n)})},removeUniqueId:function(){return this.each(function(){r.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(n){return!!e.data(n,t)}}):function(t,n,r){return!!e.data(t,r[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var n=e.attr(t,"tabindex"),r=isNaN(n);return(r||n>=0)&&i(t,!r)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(n,r){function u(t,n,r,s){return e.each(i,function(){n-=parseFloat(e.css(t,"padding"+this))||0,r&&(n-=parseFloat(e.css(t,"border"+this+"Width"))||0),s&&(n-=parseFloat(e.css(t,"margin"+this))||0)}),n}var i=r==="Width"?["Left","Right"]:["Top","Bottom"],s=r.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+r]=function(n){return n===t?o["inner"+r].call(this):this.each(function(){e(this).css(s,u(this,n)+"px")})},e.fn["outer"+r]=function(t,n){return typeof t!="number"?o["outer"+r].call(this,t):this.each(function(){e(this).css(s,u(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(n){return arguments.length?t.call(this,e.camelCase(n)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.support.selectstart="onselectstart"in document.createElement("div"),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,n,r){var i,s=e.ui[t].prototype;for(i in r)s.plugins[i]=s.plugins[i]||[],s.plugins[i].push([n,r[i]])},call:function(e,t,n){var r,i=e.plugins[t];if(!i||!e.element[0].parentNode||e.element[0].parentNode.nodeType===11)return;for(r=0;r<i.length;r++)e.options[i[r][0]]&&i[r][1].apply(e.element,n)}},hasScroll:function(t,n){if(e(t).css("overflow")==="hidden")return!1;var r=n&&n==="left"?"scrollLeft":"scrollTop",i=!1;return t[r]>0?!0:(t[r]=1,i=t[r]>0,t[r]=0,i)}})})(jQuery),function(e,t){var n=0,r=Array.prototype.slice,i=e.cleanData;e.cleanData=function(t){for(var n=0,r;(r=t[n])!=null;n++)try{e(r).triggerHandler("remove")}catch(s){}i(t)},e.widget=function(t,n,r){var i,s,o,u,a={},f=t.split(".")[0];t=t.split(".")[1],i=f+"-"+t,r||(r=n,n=e.Widget),e.expr[":"][i.toLowerCase()]=function(t){return!!e.data(t,i)},e[f]=e[f]||{},s=e[f][t],o=e[f][t]=function(e,t){if(!this._createWidget)return new o(e,t);arguments.length&&this._createWidget(e,t)},e.extend(o,s,{version:r.version,_proto:e.extend({},r),_childConstructors:[]}),u=new n,u.options=e.widget.extend({},u.options),e.each(r,function(t,r){if(!e.isFunction(r)){a[t]=r;return}a[t]=function(){var e=function(){return n.prototype[t].apply(this,arguments)},i=function(e){return n.prototype[t].apply(this,e)};return function(){var t=tLine truncated
File diff suppressed because it is too large. Load diff
+66
View File
@@ -0,0 +1,66 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
//https://stackoverflow.com/questions/4739284/htmlpurifier-iframe-vimeo-and-youtube-video
/**
* Based on: http://sachachua.com/blog/2011/08/drupal-html-purifier-embedding-iframes-youtube/
* Iframe filter that does some primitive whitelisting in a somewhat recognizable and tweakable way
*/
if( !class_exists('HTMLPurifier_Filter_Iframevideo') ){
class HTMLPurifier_Filter_iframevideo extends HTMLPurifier_Filter
{
public $name = 'Iframevideo';
/**
*
* @param string $html
* @param HTMLPurifier_Config $config
* @param HTMLPurifier_Context $context
* @return string
*/
public function preFilter($html, $config, $context)
{
$html = preg_replace('#<iframe#i', '<img class="Iframevideo"', $html);
$html = preg_replace('#</iframe>#i', '</img>', $html);
return $html;
}
/**
*
* @param string $html
* @param HTMLPurifier_Config $config
* @param HTMLPurifier_Context $context
* @return string
*/
public function postFilter($html, $config, $context)
{
$post_regex = '#<img class="Iframevideo"([^>]+?)>#';
return preg_replace_callback($post_regex, array($this, 'postFilterCallback'), $html);
}
/**
*
* @param array $matches
* @return string
*/
protected function postFilterCallback($matches)
{
// Domain Whitelist
$youTubeMatch = preg_match('#src="https?://www.youtube(-nocookie)?.com/#i', $matches[1]);
$vimeoMatch = preg_match('#src="http://player.vimeo.com/#i', $matches[1]);
if ($youTubeMatch || $vimeoMatch) {
$extra = ' frameborder="0"';
if ($youTubeMatch) {
$extra .= ' allowfullscreen';
} elseif ($vimeoMatch) {
$extra .= ' webkitAllowFullScreen mozallowfullscreen allowFullScreen';
}
return '<iframe ' . $matches[1] . $extra . '></iframe>';
} else {
return '';
}
}
}
}
?>
@@ -0,0 +1,16 @@
Core.AggressivelyRemoveScript
TYPE: bool
VERSION: 4.9.0
DEFAULT: true
--DESCRIPTION--
<p>
This directive enables aggressive pre-filter removal of
script tags. This is not necessary for security,
but it can help work around a bug in libxml where embedded
HTML elements inside script sections cause the parser to
choke. To revert to pre-4.9.0 behavior, set this to false.
This directive has no effect if %Core.Trusted is true,
%Core.RemoveScriptContents is false, or %Core.HiddenElements
does not contain script.
</p>
--# vim: et sw=4 sts=4
@@ -0,0 +1,36 @@
Core.LegacyEntityDecoder
TYPE: bool
VERSION: 4.9.0
DEFAULT: false
--DESCRIPTION--
<p>
Prior to HTML Purifier 4.9.0, entities were decoded by performing
a global search replace for all entities whose decoded versions
did not have special meanings under HTML, and replaced them with
their decoded versions. We would match all entities, even if they did
not have a trailing semicolon, but only if there weren't any trailing
alphanumeric characters.
</p>
<table>
<tr><th>Original</th><th>Text</th><th>Attribute</th></tr>
<tr><td>&amp;yen;</td><td>&yen;</td><td>&yen;</td></tr>
<tr><td>&amp;yen</td><td>&yen;</td><td>&yen;</td></tr>
<tr><td>&amp;yena</td><td>&amp;yena</td><td>&amp;yena</td></tr>
<tr><td>&amp;yen=</td><td>&yen;=</td><td>&yen;=</td></tr>
</table>
<p>
In HTML Purifier 4.9.0, we changed the behavior of entity parsing
to match entities that had missing trailing semicolons in less
cases, to more closely match HTML5 parsing behavior:
</p>
<table>
<tr><th>Original</th><th>Text</th><th>Attribute</th></tr>
<tr><td>&amp;yen;</td><td>&yen;</td><td>&yen;</td></tr>
<tr><td>&amp;yen</td><td>&yen;</td><td>&yen;</td></tr>
<tr><td>&amp;yena</td><td>&yen;a</td><td>&amp;yena</td></tr>
<tr><td>&amp;yen=</td><td>&yen;=</td><td>&amp;yen=</td></tr>
</table>
<p>
This flag reverts back to pre-HTML Purifier 4.9.0 behavior.
</p>
--# vim: et sw=4 sts=4
@@ -0,0 +1,10 @@
--# vim: et sw=4 sts=4
HTML.TargetNoopener
TYPE: bool
VERSION: 4.8.0
DEFAULT: TRUE
--DESCRIPTION--
If enabled, noopener rel attributes are added to links which have
a target attribute associated with them. This prevents malicious
destinations from overwriting the original window.
--# vim: et sw=4 sts=4
@@ -1,5 +1,5 @@
URI.DefaultScheme URI.DefaultScheme
TYPE: string TYPE: string/null
DEFAULT: 'http' DEFAULT: 'http'
--DESCRIPTION-- --DESCRIPTION--
@@ -7,4 +7,9 @@ DEFAULT: 'http'
Defines through what scheme the output will be served, in order to Defines through what scheme the output will be served, in order to
select the proper object validator when no scheme information is present. select the proper object validator when no scheme information is present.
</p> </p>
<p>
Starting with HTML Purifier 4.9.0, the default scheme can be null, in
which case we reject all URIs which do not have explicit schemes.
</p>
--# vim: et sw=4 sts=4 --# vim: et sw=4 sts=4
@@ -95,7 +95,10 @@ class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter
if ($tidy !== null) { if ($tidy !== null) {
$this->_tidy = $tidy; $this->_tidy = $tidy;
} }
$html = preg_replace_callback('#<style(?:\s.*)?>(.+)</style>#isU', array($this, 'styleCallback'), $html); // NB: this must be NON-greedy because if we have
// <style>foo</style> <style>bar</style>
// we must not grab foo</style> <style>bar
$html = preg_replace_callback('#<style(?:\s.*)?>(.*)<\/style>#isU', array($this, 'styleCallback'), $html);
$style_blocks = $this->_styleMatches; $style_blocks = $this->_styleMatches;
$this->_styleMatches = array(); // reset $this->_styleMatches = array(); // reset
$context->register('StyleBlocks', $style_blocks); // $context must not be reused $context->register('StyleBlocks', $style_blocks); // $context must not be reused
@@ -21,7 +21,7 @@ class HTMLPurifier_Lexer_PH5P extends HTMLPurifier_Lexer_DOMLex
public function tokenizeHTML($html, $config, $context) public function tokenizeHTML($html, $config, $context)
{ {
$new_html = $this->normalize($html, $config, $context); $new_html = $this->normalize($html, $config, $context);
$new_html = $this->wrapHTML($new_html, $config, $context); $new_html = $this->wrapHTML($new_html, $config, $context, false /* no div */);
try { try {
$parser = new HTML5($new_html); $parser = new HTML5($new_html);
$doc = $parser->save(); $doc = $parser->save();
@@ -34,9 +34,9 @@ class HTMLPurifier_Lexer_PH5P extends HTMLPurifier_Lexer_DOMLex
$tokens = array(); $tokens = array();
$this->tokenizeDOM( $this->tokenizeDOM(
$doc->getElementsByTagName('html')->item(0)-> // <html> $doc->getElementsByTagName('html')->item(0)-> // <html>
getElementsByTagName('body')->item(0) // <body> getElementsByTagName('body')->item(0) // <body>
, ,
$tokens $tokens, $config
); );
return $tokens; return $tokens;
} }
@@ -1515,6 +1515,7 @@ class HTML5
// Consume the maximum number of characters possible, with the // Consume the maximum number of characters possible, with the
// consumed characters case-sensitively matching one of the // consumed characters case-sensitively matching one of the
// identifiers in the first column of the entities table. // identifiers in the first column of the entities table.
$e_name = $this->characters('0-9A-Za-z;', $this->char + 1); $e_name = $this->characters('0-9A-Za-z;', $this->char + 1);
$len = strlen($e_name); $len = strlen($e_name);
@@ -1547,7 +1548,7 @@ class HTML5
// Return a character token for the character corresponding to the // Return a character token for the character corresponding to the
// entity name (as given by the second column of the entities table). // entity name (as given by the second column of the entities table).
return html_entity_decode('&' . $entity . ';', ENT_QUOTES, 'UTF-8'); return html_entity_decode('&' . rtrim($entity, ';') . ';', ENT_QUOTES, 'UTF-8');
} }
private function emitToken($token) private function emitToken($token)
+6 -5
View File
@@ -80,9 +80,6 @@ if ($xpay->TX()) {
echo "</p>"; echo "</p>";
*/ */
// 인증내역기록
@insert_cert_history($member['mb_id'], 'lg', 'hp');
if( "0000" == $xpay->Response_Code() ) { if( "0000" == $xpay->Response_Code() ) {
//인증요청 결과 성공 DB처리 //인증요청 결과 성공 DB처리
//echo "인증요청 결과 성공 DB처리하시기 바랍니다.<br>"; //echo "인증요청 결과 성공 DB처리하시기 바랍니다.<br>";
@@ -153,6 +150,10 @@ if ($xpay->TX()) {
set_session("ss_cert_birth", $birth_day); set_session("ss_cert_birth", $birth_day);
set_session("ss_cert_sex", $mb_sex); set_session("ss_cert_sex", $mb_sex);
set_session('ss_cert_dupinfo', $mb_dupinfo); set_session('ss_cert_dupinfo', $mb_dupinfo);
// 인증내역기록
@insert_cert_history($member['mb_id'], 'lg', 'hp');
} else { } else {
//인증요청 결과 실패 DB처리 //인증요청 결과 실패 DB처리
//echo "인증요청 결과 실패 DB처리하시기 바랍니다.<br>"; //echo "인증요청 결과 실패 DB처리하시기 바랍니다.<br>";
@@ -161,10 +162,10 @@ if ($xpay->TX()) {
echo '<script>'.PHP_EOL; echo '<script>'.PHP_EOL;
echo 'window.parent.$("#cert_info").css("display", "");'.PHP_EOL; echo 'window.parent.$("#cert_info").css("display", "");'.PHP_EOL;
echo 'window.parent.$("#lgu_cert" ).css("display", "none");'.PHP_EOL; echo 'window.parent.$("#lgu_cert" ).css("display", "none");'.PHP_EOL;
echo 'alert("인증요청이 실패하였습니다.\\n\\n코드 : '.$xpay->Response_Code().' '.$xpay->Response_Msg().'")'; echo 'alert("인증요청이 취소 또는 실패하였습니다.\\n\\n코드 : '.$xpay->Response_Code().' '.$xpay->Response_Msg().'")';
echo '</script>'.PHP_EOL; echo '</script>'.PHP_EOL;
} else { } else {
alert_close('인증요청이 실패하였습니다.\\n\\n코드 : '.$xpay->Response_Code().' '.$xpay->Response_Msg()); alert_close('인증요청이 취소 또는 실패하였습니다.\\n\\n코드 : '.$xpay->Response_Code().' '.$xpay->Response_Msg());
} }
exit; exit;
} }
+9 -3
View File
@@ -10,9 +10,15 @@ add_stylesheet('<link rel="stylesheet" href="'.$popular_skin_url.'/style.css">',
<div> <div>
<h2>인기검색어</h2> <h2>인기검색어</h2>
<ul> <ul>
<?php for ($i=0; $i<count($list); $i++) { ?> <?php
<li><a href="<?php echo G5_BBS_URL ?>/search.php?sfl=wr_subject&amp;sop=and&amp;stx=<?php echo urlencode($list[$i]['pp_word']) ?>"><?php echo get_text($list[$i]['pp_word']); ?></a></li> if( isset($list) && is_array($list) ){
<?php } ?> for ($i=0; $i<count($list); $i++) {
?>
<li><a href="<?php echo G5_BBS_URL ?>/search.php?sfl=wr_subject&amp;sop=and&amp;stx=<?php echo urlencode($list[$i]['pp_word']) ?>"><?php echo get_text($list[$i]['pp_word']); ?></a></li>
<?php
} //end for
} //end if
?>
</ul> </ul>
</div> </div>
</section> </section>
+2 -2
View File
@@ -19,9 +19,9 @@ include_once(G5_LIB_PATH.'/latest.lib.php');
<?php <?php
// 최신글 // 최신글
$sql = " select bo_table, bo_subject $sql = " select bo_table, bo_subject
from {$g5[board_table]} from {$g5['board_table']}
where gr_id = '{$gr_id}' where gr_id = '{$gr_id}'
and bo_list_level <= '{$member[mb_level]}' and bo_list_level <= '{$member['mb_level']}'
and bo_device <> 'mobile' "; and bo_device <> 'mobile' ";
if(!$is_admin) if(!$is_admin)
$sql .= " and bo_use_cert = '' "; $sql .= " and bo_use_cert = '' ";
@@ -9,9 +9,15 @@ add_stylesheet('<link rel="stylesheet" href="'.$popular_skin_url.'/style.css">',
<div> <div>
<h2>인기검색어</h2> <h2>인기검색어</h2>
<ul> <ul>
<?php for ($i=0; $i<count($list); $i++) { ?> <?php
if( isset($list) && is_array($list) ){
for ($i=0; $i<count($list); $i++) {
?>
<li><a href="<?php echo G5_BBS_URL ?>/search.php?sfl=wr_subject&amp;sop=and&amp;stx=<?php echo urlencode($list[$i]['pp_word']) ?>"><?php echo get_text($list[$i]['pp_word']); ?></a></li> <li><a href="<?php echo G5_BBS_URL ?>/search.php?sfl=wr_subject&amp;sop=and&amp;stx=<?php echo urlencode($list[$i]['pp_word']) ?>"><?php echo get_text($list[$i]['pp_word']); ?></a></li>
<?php } ?> <?php
} //end for
} //end if
?>
</ul> </ul>
</div> </div>
</aside> </aside>
@@ -10,9 +10,15 @@ add_stylesheet('<link rel="stylesheet" href="'.$popular_skin_url.'/style.css">',
<div> <div>
<h2>인기검색어</h2> <h2>인기검색어</h2>
<ul> <ul>
<?php for ($i=0; $i<count($list); $i++) { ?> <?php
<li><a href="<?php echo G5_BBS_URL ?>/search.php?sfl=wr_subject&amp;sop=and&amp;stx=<?php echo urlencode($list[$i]['pp_word']) ?>"><?php echo get_text($list[$i]['pp_word']); ?></a></li> if( isset($list) && is_array($list) ){
<?php } ?> for ($i=0; $i<count($list); $i++) {
?>
<li><a href="<?php echo G5_BBS_URL ?>/search.php?sfl=wr_subject&amp;sop=and&amp;stx=<?php echo urlencode($list[$i]['pp_word']) ?>"><?php echo get_text($list[$i]['pp_word']); ?></a></li>
<?php
} //end for
} //end if
?>
</ul> </ul>
</div> </div>
</section> </section>