캡차이미지와 캡챠음성파일을 미리 만들어 놓고 img src 에 노출하는 방식으로 변경
This commit is contained in:
@ -1,7 +1,7 @@
|
|||||||
<?
|
<?
|
||||||
|
define('_CAPTCHA_', 1);
|
||||||
include_once('./_common.php');
|
include_once('./_common.php');
|
||||||
include_once($g4['path'].'/lib/register.lib.php');
|
include_once($g4['path'].'/lib/register.lib.php');
|
||||||
if ($captcha->lib) include_once($captcha->lib);
|
|
||||||
|
|
||||||
// 불법접근을 막도록 토큰생성
|
// 불법접근을 막도록 토큰생성
|
||||||
$token = md5(uniqid(rand(), true));
|
$token = md5(uniqid(rand(), true));
|
||||||
@ -102,7 +102,6 @@ if ($w == "") {
|
|||||||
// 회원아이콘 경로
|
// 회원아이콘 경로
|
||||||
$mb_icon = $g4['path'].'/data/member/'.substr($member['mb_id'],0,2).'/'.$member['mb_id'].'.gif';
|
$mb_icon = $g4['path'].'/data/member/'.substr($member['mb_id'],0,2).'/'.$member['mb_id'].'.gif';
|
||||||
$member_skin_path = $g4['path'].'/skin/member/'.$config['cf_member_skin'];
|
$member_skin_path = $g4['path'].'/skin/member/'.$config['cf_member_skin'];
|
||||||
$g4['js_file'][] = "{$g4['path']}/plugin/captcha/captcha.js";
|
|
||||||
|
|
||||||
include_once('./_head.php');
|
include_once('./_head.php');
|
||||||
|
|
||||||
|
|||||||
@ -13,6 +13,10 @@ $g4['bbs_path'] = $g4['path'] . '/' . $g4['bbs'];
|
|||||||
$g4['bbs_img'] = 'img';
|
$g4['bbs_img'] = 'img';
|
||||||
$g4['bbs_img_path'] = $g4['path'] . '/' . $g4['bbs'] . '/' . $g4['bbs_img'];
|
$g4['bbs_img_path'] = $g4['path'] . '/' . $g4['bbs'] . '/' . $g4['bbs_img'];
|
||||||
|
|
||||||
|
$g4['data_dir'] = 'data';
|
||||||
|
$g4['cache_dir'] = 'cache';
|
||||||
|
$g4['captcha_dir'] = 'captcha';
|
||||||
|
|
||||||
$g4['admin'] = 'adm';
|
$g4['admin'] = 'adm';
|
||||||
$g4['admin_path'] = $g4['path'] . '/' . $g4['admin'];
|
$g4['admin_path'] = $g4['path'] . '/' . $g4['admin'];
|
||||||
|
|
||||||
|
|||||||
@ -2,12 +2,17 @@
|
|||||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||||
|
|
||||||
if (defined('_CAPTCHA_')) {
|
if (defined('_CAPTCHA_')) {
|
||||||
$captcha = (object)array(
|
$captcha = (object)Array(
|
||||||
'lib' => $g4['path']."/plugin/captcha/captcha.lib.php",
|
'lib' => $g4['path']."/plugin/captcha/captcha.lib.php",
|
||||||
'js' => $g4['path']."/plugin/captcha/captcha.js"
|
'js' => $g4['path']."/plugin/captcha/captcha.js",
|
||||||
|
'fonts' => $g4['path']."/plugin/captcha/fonts"
|
||||||
);
|
);
|
||||||
|
|
||||||
include_once($captcha->lib);
|
include_once($captcha->lib);
|
||||||
|
$g4['js_file'][] = $captcha->js;
|
||||||
|
|
||||||
|
$captcha_obj = new captcha();
|
||||||
|
$captcha_obj->run();
|
||||||
} else {
|
} else {
|
||||||
unset($_SESSION['ss_captcha_use']);
|
unset($_SESSION['ss_captcha_use']);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -79,9 +79,6 @@ if (defined('_EDITOR_')) {
|
|||||||
$g4['js_file'][] = $editor->js;
|
$g4['js_file'][] = $editor->js;
|
||||||
$g4['js_file'][] = $editor->config_js;
|
$g4['js_file'][] = $editor->config_js;
|
||||||
}
|
}
|
||||||
if (defined('_CAPTCHA_')) {
|
|
||||||
$g4['js_file'][] = $captcha->js;
|
|
||||||
}
|
|
||||||
?>
|
?>
|
||||||
<!--[if lte IE 8]>
|
<!--[if lte IE 8]>
|
||||||
<script src="<?=$g4['path']?>/js/html5.js"></script>
|
<script src="<?=$g4['path']?>/js/html5.js"></script>
|
||||||
|
|||||||
@ -1575,4 +1575,34 @@ function is_checked($field)
|
|||||||
{
|
{
|
||||||
return !empty($_POST[$field]);
|
return !empty($_POST[$field]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function mk_subdir($subdir)
|
||||||
|
{
|
||||||
|
global $g4;
|
||||||
|
$data_path = $g4['path'].'/'.$g4['data_dir'];
|
||||||
|
$data_subpath = $data_path.'/'.$subdir;
|
||||||
|
if (!is_dir($data_subpath)) {
|
||||||
|
@mkdir($data_subpath, 0707);
|
||||||
|
@chmod($data_subpath, 0707);
|
||||||
|
}
|
||||||
|
return $data_subpath;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 캡챠 파일의 상대 경로를 반환
|
||||||
|
function captcha_file_path($extension='.png')
|
||||||
|
{
|
||||||
|
global $g4;
|
||||||
|
mk_subdir($g4['cache_dir']);
|
||||||
|
$captcha_path = mk_subdir($g4['cache_dir'].'/'.$g4['captcha_dir']);
|
||||||
|
return $captcha_path.'/'.abs_ip2long().'_'.$_COOKIE['PHPSESSID'].$extension;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function abs_ip2long($ip='')
|
||||||
|
{
|
||||||
|
$ip = $ip ? $ip : $_SERVER['REMOTE_ADDR'];
|
||||||
|
return abs(ip2long($ip));
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
@ -76,7 +76,9 @@ class captcha
|
|||||||
return mt_rand($from, $to);
|
return mt_rand($from, $to);
|
||||||
}
|
}
|
||||||
|
|
||||||
function run() {
|
function run()
|
||||||
|
{
|
||||||
|
global $captcha;
|
||||||
|
|
||||||
// The text to draw
|
// The text to draw
|
||||||
$captcha_key = $this->get_captcha_key();
|
$captcha_key = $this->get_captcha_key();
|
||||||
@ -85,7 +87,7 @@ class captcha
|
|||||||
set_session('ss_captcha_cnt', 0);
|
set_session('ss_captcha_cnt', 0);
|
||||||
|
|
||||||
// Set the content-type
|
// Set the content-type
|
||||||
header('Content-Type: image/gif');
|
//header('Content-Type: image/png');
|
||||||
// Create the image
|
// Create the image
|
||||||
$im = imagecreatetruecolor($this->width, $this->height);
|
$im = imagecreatetruecolor($this->width, $this->height);
|
||||||
|
|
||||||
@ -97,7 +99,7 @@ class captcha
|
|||||||
|
|
||||||
// Replace path by your own font path
|
// Replace path by your own font path
|
||||||
$fonts = Array();
|
$fonts = Array();
|
||||||
foreach (glob('fonts/*.ttf') as $filename) {
|
foreach (glob($captcha->fonts.'/*.ttf') as $filename) {
|
||||||
$fonts[] = $filename;
|
$fonts[] = $filename;
|
||||||
}
|
}
|
||||||
$font = $fonts[mt_rand(0, count($fonts)-1)];
|
$font = $fonts[mt_rand(0, count($fonts)-1)];
|
||||||
@ -117,9 +119,10 @@ class captcha
|
|||||||
imagettftext($im, $size, $angle, $x-2, $y-2, $grey, $font, $captcha_key);
|
imagettftext($im, $size, $angle, $x-2, $y-2, $grey, $font, $captcha_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Using imagepng() results in clearer text compared with imagejpeg()
|
imagepng($im, captcha_file_path('.png'), 0, NULL);
|
||||||
imagegif($im);
|
|
||||||
imagedestroy($im);
|
imagedestroy($im);
|
||||||
|
|
||||||
|
make_wav();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,9 +150,9 @@ function captcha_html($input_name, $captcha_id_suffix='')
|
|||||||
$html = '<fieldset id="captcha'.$captcha_id_suffix.'" class="captcha">';
|
$html = '<fieldset id="captcha'.$captcha_id_suffix.'" class="captcha">';
|
||||||
$html .= '<legend class="sound_only">자동등록방지</legend>';
|
$html .= '<legend class="sound_only">자동등록방지</legend>';
|
||||||
//$html .= '<img src="" id="captcha" alt="자동등록방지 이미지" title="이미지를 클릭하시면 숫자가 바뀝니다.">';
|
//$html .= '<img src="" id="captcha" alt="자동등록방지 이미지" title="이미지를 클릭하시면 숫자가 바뀝니다.">';
|
||||||
$html .= '<iframe id="captcha_iframe" name="captcha_iframe" src="'.$g4['path'].'/plugin/captcha/run.php" scrolling="no" marginwidth="0" marginheight="0" title="자동등록방지숫자"></iframe>';
|
$html .= '<iframe id="captcha_iframe" name="captcha_iframe" src="'.captcha_file_path('.png').'" scrolling="no" marginwidth="0" marginheight="0" title="자동등록방지숫자"></iframe>';
|
||||||
$html .= '<a href="'.$g4['path'].'/plugin/captcha/run.php" target="captcha_iframe">새로고침</a>';
|
//$html .= '<a href="'.$g4['path'].'/plugin/captcha/run.php" target="captcha_iframe">새로고침</a>';
|
||||||
$html .= '<a href="'.$g4['path'].'/plugin/captcha/wav.php" id="captcha_wav">음성듣기</a>';
|
$html .= '<a href="'.captcha_file_path('.wav').'" id="captcha_wav">음성듣기</a>';
|
||||||
$html .= '<label for="captcha_key">자동등록방지 입력</label>';
|
$html .= '<label for="captcha_key">자동등록방지 입력</label>';
|
||||||
$html .= '<input type="text" id="captcha_key" name="'.$input_name.'" class="captcha_box fieldset_input" size="5" maxlength="5" required title="자동등록방지 입력">';
|
$html .= '<input type="text" id="captcha_key" name="'.$input_name.'" class="captcha_box fieldset_input" size="5" maxlength="5" required title="자동등록방지 입력">';
|
||||||
$html .= '<p class="sound_only">이미지의 숫자를 순서대로 입력하세요. 새로고침을 클릭하시면 새로운 숫자가 나타납니다.</p>';
|
$html .= '<p class="sound_only">이미지의 숫자를 순서대로 입력하세요. 새로고침을 클릭하시면 새로운 숫자가 나타납니다.</p>';
|
||||||
@ -175,4 +178,68 @@ function captcha_js($element)
|
|||||||
{
|
{
|
||||||
return "if (!check_captcha({$element})) { return false; }";
|
return "if (!check_captcha({$element})) { return false; }";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function make_wav()
|
||||||
|
{
|
||||||
|
global $g4;
|
||||||
|
$wavs_dir = $g4['path'].'/plugin/captcha/wavs/';
|
||||||
|
$number = (string)$_SESSION['ss_captcha_key'];
|
||||||
|
$wavs = array();
|
||||||
|
for($i=0;$i<strlen($number);$i++){
|
||||||
|
$file = $wavs_dir.$number[$i].'.wav';
|
||||||
|
$wavs[] = $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
$wav_filepath = captcha_file_path('.wav');
|
||||||
|
$fp = fopen($wav_filepath, 'w+');
|
||||||
|
fwrite($fp, joinwavs($wavs));
|
||||||
|
fclose($fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
function joinwavs($wavs)
|
||||||
|
{
|
||||||
|
$fields = join('/',array( 'H8ChunkID', 'VChunkSize', 'H8Format',
|
||||||
|
'H8Subchunk1ID', 'VSubchunk1Size',
|
||||||
|
'vAudioFormat', 'vNumChannels', 'VSampleRate',
|
||||||
|
'VByteRate', 'vBlockAlign', 'vBitsPerSample' ));
|
||||||
|
$data = '';
|
||||||
|
$info = array();
|
||||||
|
foreach($wavs as $wav){
|
||||||
|
$fp = fopen($wav,'rb');
|
||||||
|
$header = fread($fp,36);
|
||||||
|
$info = unpack($fields,$header);
|
||||||
|
|
||||||
|
// read optional extra stuff
|
||||||
|
if($info['Subchunk1Size'] > 16){
|
||||||
|
$header .= fread($fp,($info['Subchunk1Size']-16));
|
||||||
|
}
|
||||||
|
|
||||||
|
// read SubChunk2ID
|
||||||
|
$header .= fread($fp,4);
|
||||||
|
|
||||||
|
// read Subchunk2Size
|
||||||
|
$size = unpack('vsize',fread($fp, 4));
|
||||||
|
$size = $size['size'];
|
||||||
|
|
||||||
|
// read data
|
||||||
|
$data .= fread($fp,$size);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ''
|
||||||
|
.pack('a4', 'RIFF')
|
||||||
|
.pack('V', strlen($data) + 36)
|
||||||
|
.pack('a4', 'WAVE')
|
||||||
|
.pack('a4', 'fmt ')
|
||||||
|
.pack('V', $info['Subchunk1Size']) // 16
|
||||||
|
.pack('v', $info['AudioFormat']) // 1
|
||||||
|
.pack('v', $info['NumChannels']) // 1
|
||||||
|
.pack('V', $info['SampleRate']) // 8000
|
||||||
|
.pack('V', $info['ByteRate']) // 8000
|
||||||
|
.pack('v', $info['BlockAlign']) // 1
|
||||||
|
.pack('v', $info['BitsPerSample']) // 8
|
||||||
|
.pack('a4', 'data')
|
||||||
|
.pack('V', strlen($data))
|
||||||
|
.$data;
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
|
|||||||
@ -15,6 +15,7 @@ header('Content-Disposition: attachment;filename=captcha.wav');
|
|||||||
|
|
||||||
echo joinwavs($wavs);
|
echo joinwavs($wavs);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Join multiple wav files
|
* Join multiple wav files
|
||||||
*
|
*
|
||||||
|
|||||||
@ -162,7 +162,7 @@ var member_skin_path = "<?=$member_skin_path?>";
|
|||||||
</tr>
|
</tr>
|
||||||
<? } ?>
|
<? } ?>
|
||||||
|
|
||||||
<? if (isset($member['mb_open_date']) && $member['mb_open_date'] <= date("Y-m-d", $g4['server_time'] - ($config['cf_open_modify'] * 86400)) || !$member['mb_open_date']) { // 정보공개 수정일이 지났다면 수정가능 ?>
|
<? if (isset($member['mb_open_date']) && $member['mb_open_date'] <= date("Y-m-d", $g4['server_time'] - ($config['cf_open_modify'] * 86400)) || empty($member['mb_open_date'])) { // 정보공개 수정일이 지났다면 수정가능 ?>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row"><label for="reg_mb_open">정보공개</label></th>
|
<th scope="row"><label for="reg_mb_open">정보공개</label></th>
|
||||||
<td>
|
<td>
|
||||||
@ -195,7 +195,7 @@ var member_skin_path = "<?=$member_skin_path?>";
|
|||||||
<? } ?>
|
<? } ?>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<?=$captcha_html?>
|
<?=captcha_html('wr_key');?>
|
||||||
|
|
||||||
<div class="btn_confirm">
|
<div class="btn_confirm">
|
||||||
<input type="submit" class="btn_submit" value="회원가입" accesskey="s">
|
<input type="submit" class="btn_submit" value="회원가입" accesskey="s">
|
||||||
|
|||||||
39
test.php
39
test.php
@ -1,39 +1,4 @@
|
|||||||
<?
|
<?
|
||||||
$str = "xx";
|
include_once('./_common.php');
|
||||||
$len = 2;
|
echo abs_ip2long();
|
||||||
//echo ord($str{$len});
|
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<!doctype html>
|
|
||||||
<html lang="ko">
|
|
||||||
<head>
|
|
||||||
<title>테스트</title>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<style>
|
|
||||||
input {
|
|
||||||
border-radius:7px; /*모서리 깍이는 정도*/
|
|
||||||
border:1px solid #dedede; /*선두께, 스타일(점선), 컬러*/
|
|
||||||
background-color:#f7f7f7; /*배경 컬러*/
|
|
||||||
padding:5px;
|
|
||||||
box-shadow:0 0 10px silver;
|
|
||||||
}
|
|
||||||
input:focus {
|
|
||||||
border-radius:7px; /*모서리 깍이는 정도*/
|
|
||||||
border:1px solid #ff3061; /*선두께, 스타일(점선), 컬러*/
|
|
||||||
background-color:#f7f7f7; /*배경 컬러*/
|
|
||||||
padding:5px;
|
|
||||||
box-shadow:0 0 10px #ff3061;
|
|
||||||
outline:0;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
|
|
||||||
<label for="text">테스트 필수</label>
|
|
||||||
<input type="text" id="text" title="테스트">
|
|
||||||
|
|
||||||
<input type="checkbox">
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
Reference in New Issue
Block a user