KCAPTCHA 캡챠 플러그인 추가

This commit is contained in:
gnuboard
2013-10-10 15:48:07 +09:00
parent a253bea015
commit f2d63ee9be
77 changed files with 547 additions and 38 deletions

View File

@ -25,14 +25,17 @@ if (!isset($config['cf_mobile_new_skin'])) {
ADD `cf_mobile_member_skin` VARCHAR(255) NOT NULL AFTER `cf_mobile_connect_skin` ", true);
}
if(!isset($config['cf_gcaptcha_mp3'])) {
if (isset($config['cf_gcaptcha_mp3'])) {
sql_query(" ALTER TABLE `{$g5['config_table']}`
ADD `cf_gcaptcha_mp3` VARCHAR(255) NOT NULL DEFAULT '' AFTER `cf_mobile_member_skin` ", true);
CHANGE `cf_gcaptcha_mp3` `cf_captcha_mp3` VARCHAR(255) NOT NULL DEFAULT '' ", true);
} else if (!isset($config['cf_captcha_mp3'])) {
sql_query(" ALTER TABLE `{$g5['config_table']}`
ADD `cf_captcha_mp3` VARCHAR(255) NOT NULL DEFAULT '' AFTER `cf_mobile_member_skin` ", true);
}
if(!isset($config['cf_editor'])) {
sql_query(" ALTER TABLE `{$g5['config_table']}`
ADD `cf_editor` VARCHAR(255) NOT NULL DEFAULT '' AFTER `cf_gcaptcha_mp3` ", true);
ADD `cf_editor` VARCHAR(255) NOT NULL DEFAULT '' AFTER `cf_captcha_mp3` ", true);
}
if(!isset($config['cf_googl_shorturl_apikey'])) {
@ -338,15 +341,15 @@ $pg_anchor = '<ul class="anchor">
</td>
</tr>
<tr>
<th scope="row"><label for="cf_gcaptcha_mp3">음성캡챠 선택<strong class="sound_only">필수</strong></label></th>
<th scope="row"><label for="cf_captcha_mp3">음성캡챠 선택<strong class="sound_only">필수</strong></label></th>
<td colspan="3">
<?php echo help(G5_GCAPTCHA_URL.'/mp3 밑의 음성 폴더를 선택합니다.') ?>
<select name="cf_gcaptcha_mp3" id="cf_gcaptcha_mp3" required class="required">
<?php echo help(G5_CAPTCHA_URL.'/mp3 밑의 음성 폴더를 선택합니다.') ?>
<select name="cf_captcha_mp3" id="cf_captcha_mp3" required class="required">
<?php
$arr = get_skin_dir('mp3', G5_GCAPTCHA_PATH);
$arr = get_skin_dir('mp3', G5_CAPTCHA_PATH);
for ($i=0; $i<count($arr); $i++) {
if ($i == 0) echo "<option value=\"\">선택</option>";
echo "<option value=\"".$arr[$i]."\"".get_selected($config['cf_gcaptcha_mp3'], $arr[$i]).">".$arr[$i]."</option>\n";
echo "<option value=\"".$arr[$i]."\"".get_selected($config['cf_captcha_mp3'], $arr[$i]).">".$arr[$i]."</option>\n";
}
?>
</select>

View File

@ -107,7 +107,7 @@ $sql = " update {$g5['config_table']}
cf_mobile_search_skin = '{$_POST['cf_mobile_search_skin']}',
cf_mobile_connect_skin = '{$_POST['cf_mobile_connect_skin']}',
cf_mobile_member_skin = '{$_POST['cf_mobile_member_skin']}',
cf_gcaptcha_mp3 = '{$_POST['cf_gcaptcha_mp3']}',
cf_captcha_mp3 = '{$_POST['cf_captcha_mp3']}',
cf_editor = '{$_POST['cf_editor']}',
cf_cert_use = '{$_POST['cf_cert_use']}',
cf_cert_ipin = '{$_POST['cf_cert_ipin']}',

View File

@ -1,6 +1,6 @@
<?php
include_once('./_common.php');
include_once(G5_GCAPTCHA_PATH.'/gcaptcha.lib.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
if (!$config['cf_email_use'])
alert_close('환경설정에서 \"메일발송 사용\"에 체크하셔야 메일을 발송할 수 있습니다.\\n\\n관리자에게 문의하시기 바랍니다.');

View File

@ -1,6 +1,6 @@
<?php
include_once('./_common.php');
include_once(G5_GCAPTCHA_PATH.'/gcaptcha.lib.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
include_once(G5_LIB_PATH.'/mailer.lib.php');
if (!$config['cf_email_use'])

View File

@ -1,6 +1,6 @@
<?php
include_once('./_common.php');
include_once(G5_GCAPTCHA_PATH.'/gcaptcha.lib.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
if ($is_guest)
alert_close('회원만 이용하실 수 있습니다.');

View File

@ -1,6 +1,6 @@
<?php
include_once('./_common.php');
include_once(G5_GCAPTCHA_PATH.'/gcaptcha.lib.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
if ($is_guest)
alert('회원만 이용하실 수 있습니다.');

View File

@ -1,6 +1,6 @@
<?php
include_once('./_common.php');
include_once(G5_GCAPTCHA_PATH.'/gcaptcha.lib.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
if ($is_member) {
alert("이미 로그인중입니다.");

View File

@ -1,6 +1,6 @@
<?php
include_once('./_common.php');
include_once(G5_GCAPTCHA_PATH.'/gcaptcha.lib.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
include_once(G5_LIB_PATH.'/mailer.lib.php');
if ($is_member) {

View File

@ -1,6 +1,6 @@
<?php
include_once('./_common.php');
include_once(G5_GCAPTCHA_PATH.'/gcaptcha.lib.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
$po = sql_fetch(" select * from {$g5['poll_table']} where po_id = '{$po_id}' ");
if (!$po['po_id'])

View File

@ -1,6 +1,6 @@
<?php
include_once('./_common.php');
include_once(G5_GCAPTCHA_PATH.'/gcaptcha.lib.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
$sql = " select mb_email, mb_datetime, mb_email_certify from {$g5['member_table']} where mb_id = '{$mb_id}' ";
$mb = sql_fetch($sql);

View File

@ -1,6 +1,6 @@
<?php
include_once('./_common.php');
include_once(G5_GCAPTCHA_PATH.'/gcaptcha.lib.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
include_once(G5_LIB_PATH.'/mailer.lib.php');
$mb_id = escape_trim($_POST['mb_id']);

View File

@ -1,6 +1,6 @@
<?php
include_once('./_common.php');
include_once(G5_GCAPTCHA_PATH.'/gcaptcha.lib.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
include_once(G5_LIB_PATH.'/register.lib.php');
// 불법접근을 막도록 토큰생성
@ -118,8 +118,6 @@ $req_nick = !isset($member['mb_nick_date']) || (isset($member['mb_nick_date']) &
$required = ($w=='') ? 'required' : '';
$readonly = ($w=='u') ? 'readonly' : '';
$captcha_html = captcha_html();
include_once($member_skin_path.'/register_form.skin.php');
include_once('./_tail.php');
?>

View File

@ -1,6 +1,6 @@
<?php
include_once('./_common.php');
include_once(G5_GCAPTCHA_PATH.'/gcaptcha.lib.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
include_once(G5_LIB_PATH.'/register.lib.php');
include_once(G5_LIB_PATH.'/mailer.lib.php');

View File

@ -1,6 +1,6 @@
<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
include_once(G5_GCAPTCHA_PATH.'/gcaptcha.lib.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
$captcha_html = "";
if ($is_guest && $board['bo_comment_level'] < 2) {

View File

@ -1,7 +1,7 @@
<?php
include_once('./_common.php');
include_once(G5_EDITOR_LIB);
include_once(G5_GCAPTCHA_PATH.'/gcaptcha.lib.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
set_session('ss_bo_table', $_REQUEST['bo_table']);
set_session('ss_wr_id', $_REQUEST['wr_id']);

View File

@ -1,7 +1,7 @@
<?php
define('G5_CAPTCHA', true);
include_once('./_common.php');
include_once(G5_GCAPTCHA_PATH.'/gcaptcha.lib.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
// 090710
if (substr_count($wr_content, "&#") > 50) {

View File

@ -1,6 +1,6 @@
<?php
include_once('./_common.php');
include_once(G5_GCAPTCHA_PATH.'/gcaptcha.lib.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
$g5['title'] = '게시글 저장';

View File

@ -46,7 +46,7 @@ define('G5_JS_DIR', 'js');
define('G5_LIB_DIR', 'lib');
define('G5_PLUGIN_DIR', 'plugin');
define('G5_SKIN_DIR', 'skin');
define('G5_GCAPTCHA_DIR', 'gcaptcha');
define('G5_CAPTCHA_DIR', 'gcaptcha');
define('G5_EDITOR_DIR', 'editor');
define('G5_MOBILE_DIR', 'mobile');
define('G5_OKNAME_DIR', 'okname');
@ -81,7 +81,7 @@ define('G5_IMG_URL', G5_URL.'/'.G5_IMG_DIR);
define('G5_JS_URL', G5_URL.'/'.G5_JS_DIR);
define('G5_SKIN_URL', G5_URL.'/'.G5_SKIN_DIR);
define('G5_PLUGIN_URL', G5_URL.'/'.G5_PLUGIN_DIR);
define('G5_GCAPTCHA_URL', G5_PLUGIN_URL.'/'.G5_GCAPTCHA_DIR);
define('G5_CAPTCHA_URL', G5_PLUGIN_URL.'/'.G5_CAPTCHA_DIR);
define('G5_EDITOR_URL', G5_PLUGIN_URL.'/'.G5_EDITOR_DIR);
define('G5_OKNAME_URL', G5_PLUGIN_URL.'/'.G5_OKNAME_DIR);
define('G5_KCPCERT_URL', G5_PLUGIN_URL.'/'.G5_KCPCERT_DIR);
@ -98,7 +98,7 @@ define('G5_LIB_PATH', G5_PATH.'/'.G5_LIB_DIR);
define('G5_PLUGIN_PATH', G5_PATH.'/'.G5_PLUGIN_DIR);
define('G5_SKIN_PATH', G5_PATH.'/'.G5_SKIN_DIR);
define('G5_MOBILE_PATH', G5_PATH.'/'.G5_MOBILE_DIR);
define('G5_GCAPTCHA_PATH', G5_PLUGIN_PATH.'/'.G5_GCAPTCHA_DIR);
define('G5_CAPTCHA_PATH', G5_PLUGIN_PATH.'/'.G5_CAPTCHA_DIR);
define('G5_EDITOR_PATH', G5_PLUGIN_PATH.'/'.G5_EDITOR_DIR);
define('G5_OKNAME_PATH', G5_PLUGIN_PATH.'/'.G5_OKNAME_DIR);

View File

@ -0,0 +1,3 @@
<?php
require(dirname(__FILE__).'/gcaptcha.lib.php');
?>

View File

@ -6,7 +6,7 @@ function chk_captcha()
var captcha_result = false;
$.ajax({
type: "POST",
url: g5_gcaptcha_url+"/get.php",
url: g5_captcha_url+"/get.php",
data: {
"captcha_key": captcha_key.value
},
@ -19,6 +19,7 @@ function chk_captcha()
if (!captcha_result) {
alert("자동등록방지 숫자가 틀렸습니다.");
captcha_key.select();
captcha_key.focus();
return false;
}
return true;
@ -26,7 +27,7 @@ function chk_captcha()
$(function() {
$("#captcha").click(function(e) {
this.setAttribute("src", g5_url+"/plugin/gcaptcha/run.php?t="+(new Date).getTime());
this.setAttribute("src", g5_captcha_url+"/run.php?t="+(new Date).getTime());
var keycode = (e.keyCode ? e.keyCode : e.which);
// 첫 실행에서는 포커스를 주지 않음
if (typeof(keycode) != "undefined") {

View File

@ -100,7 +100,7 @@ class gcaptcha
// Replace path by your own font path
$fonts = Array();
foreach (glob(G5_GCAPTCHA_PATH.'/fonts/*.ttf') as $filename) {
foreach (glob(G5_CAPTCHA_PATH.'/fonts/*.ttf') as $filename) {
$fonts[] = $filename;
}
$font = $fonts[mt_rand(0, count($fonts)-1)];
@ -140,7 +140,7 @@ class gcaptcha
$number = (string)$_SESSION['ss_captcha_key'];
$mp3s = array();
for($i=0;$i<strlen($number);$i++){
$file = G5_GCAPTCHA_PATH.'/mp3/'.$config['cf_gcaptcha_mp3'].'/'.$number[$i].'.mp3';
$file = G5_CAPTCHA_PATH.'/mp3/'.$config['cf_captcha_mp3'].'/'.$number[$i].'.mp3';
$mp3s[] = $file;
}
@ -179,13 +179,13 @@ function captcha_html($class='captcha')
$jpg_file_url = G5_DATA_URL.'/cache/'.$obj->captcha_filename.'.jpg';
$mp3_file_url = G5_DATA_URL.'/cache/'.$obj->captcha_filename.'.mp3';
$html .= "\n".'<script>var g5_gcaptcha_url = "'.G5_GCAPTCHA_URL.'";</script>';
$html .= "\n".'<script src="'.G5_GCAPTCHA_URL.'/gcaptcha.js"></script>';
$html .= "\n".'<script>var g5_captcha_url = "'.G5_CAPTCHA_URL.'";</script>';
$html .= "\n".'<script src="'.G5_CAPTCHA_URL.'/gcaptcha.js"></script>';
$html .= '<fieldset id="captcha" class="'.$class.'">';
$html .= '<legend class="sound_only">자동등록방지</legend>';
if (G5_IS_MOBILE) $html .= '<audio src="'.$mp3_file_url.'?_='.$rand.'" controls></audio>';
$html .= '<img src="'.$jpg_file_url.'?_='.$rand.'" alt="">';
if (!G5_IS_MOBILE) $html .= '<a href="'.$mp3_file_url.'?_='.$rand.'" id="captcha_mp3" target="_blank"><img src="'.G5_GCAPTCHA_URL.'/img/sound.gif" alt="숫자를 음성으로 듣기"></a>';
if (!G5_IS_MOBILE) $html .= '<a href="'.$mp3_file_url.'?_='.$rand.'" id="captcha_mp3" target="_blank"><img src="'.G5_CAPTCHA_URL.'/img/sound.gif" alt="숫자를 음성으로 듣기"></a>';
$html .= '<label class="sound_only">자동등록방지 숫자 </label><input type="text" name="captcha_key" id="captcha_key" required class="captcha_box frm_input required" size="6" maxlength="6">';
$html .= '<p class="sound_only">자동등록방지 숫자를 순서대로 입력하세요.</p>';
$html .= '</fieldset>';

View File

@ -1,6 +1,6 @@
<?php
include_once("./_common.php");
include_once(G5_GCAPTCHA_PATH.'/gcaptcha.lib.php');
include_once(G5_CAPTCHA_PATH.'/captcha.lib.php');
echo chk_captcha();
?>

View File

@ -0,0 +1,3 @@
<?php
include_once('../../common.php');
?>

View File

@ -0,0 +1,3 @@
<?php
require(dirname(__FILE__).'/kcaptcha.lib.php');
?>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

BIN
plugin/kcaptcha/img/dot.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 B

View File

@ -0,0 +1,91 @@
$(function(){
$("#captcha_reload").bind("click", function(){
$.ajax({
type: 'POST',
url: g5_captcha_url+'/kcaptcha_session.php',
cache: false,
async: false,
success: function(text) {
$('#captcha_img').attr('src', g5_captcha_url+'/kcaptcha_image.php?t=' + (new Date).getTime());
}
});
}).trigger("click");
var mp3_url = "";
$("#captcha_mp3").click(function(){
$("body").css("cursor", "wait");
$.ajax({
type: 'POST',
url: g5_captcha_url+'/kcaptcha_mp3.php',
cache: false,
async: false,
success: function(url) {
if (url) {
mp3_url = url + "?t="+new Date().getTime();
}
}
});
var html5use = false;
var html5audio = document.createElement("audio");
if (html5audio.canPlayType && html5audio.canPlayType("audio/mpeg")) {
var wav = new Audio(mp3_url);
wav.id = "mp3_audio";
wav.autoplay = true;
wav.controls = false;
wav.autobuffer = false;
wav.loop = false;
if ($("#mp3_audio").length) $("#mp3_audio").remove();
$("#captcha_mp3").after(wav);
html5use = true;
}
if (!html5use) {
var object = '<object id="mp3_object" classid="clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95" height="0" width="0" style="width:0; height:0;">';
object += '<param name="AutoStart" value="1" />';
object += '<param name="Volume" value="0" />';
object += '<param name="PlayCount" value="1" />';
object += '<param name="FileName" value="' + mp3_url + '" />';
object += '<embed id="mp3_embed" src="' + mp3_url + '" autoplay="true" hidden="true" volume="100" type="audio/x-wav" style="display:inline;" />';
object += '</object>';
if ($("#mp3_object").length)
$("#mp3_object").remove();
$("#captcha_mp3").after(object);
}
$("body").css("cursor", "default");
return false;
}).css('cursor', 'pointer');
});
// 출력된 캡챠이미지의 키값과 입력한 키값이 같은지 비교한다.
function chk_captcha()
{
var captcha_result = false;
var captcha_key = document.getElementById('captcha_key');
$.ajax({
type: 'POST',
url: g5_captcha_url+'/kcaptcha_result.php',
data: {
'captcha_key': captcha_key.value
},
cache: false,
async: false,
success: function(text) {
captcha_result = text;
}
});
if (!captcha_result) {
alert('글자가 틀렸거나 입력 횟수가 넘었습니다.\n\n새로고침을 클릭하여 다시 입력해 주십시오.');
captcha_key.select();
captcha_key.focus();
return false;
}
return true;
}

View File

@ -0,0 +1,278 @@
<?php
# KCAPTCHA PROJECT VERSION 1.2.6
# Automatic test to tell computers and humans apart
# Copyright by Kruglov Sergei, 2006, 2007, 2008
# www.captcha.ru, www.kruglov.ru
# System requirements: PHP 4.0.6+ w/ GD
# KCAPTCHA is a free software. You can freely use it for building own site or software.
# If you use this software as a part of own sofware, you must leave copyright notices intact or add KCAPTCHA copyright notices to own.
# As a default configuration, KCAPTCHA has a small credits text at bottom of CAPTCHA image.
# You can remove it, but I would be pleased if you left it. ;)
# See kcaptcha_config.php for customization
class KCAPTCHA{
// generates keystring and image
function image(){
require(dirname(__FILE__).'/kcaptcha_config.php');
$fonts=array();
$fontsdir_absolute=dirname(__FILE__).'/'.$fontsdir;
if ($handle = opendir($fontsdir_absolute)) {
while (false !== ($file = readdir($handle))) {
if (preg_match('/\.png$/i', $file)) {
$fonts[]=$fontsdir_absolute.'/'.$file;
}
}
closedir($handle);
}
$alphabet_length=strlen($alphabet);
do{
/*
// generating random keystring
while(true){
$this->keystring='';
for($i=0;$i<$length;$i++){
$this->keystring.=$allowed_symbols{mt_rand(0,strlen($allowed_symbols)-1)};
}
if(!preg_match('/cp|cb|ck|c6|c9|rn|rm|mm|co|do|cl|db|qp|qb|dp|ww/', $this->keystring)) break;
}
*/
$font_file=$fonts[mt_rand(0, count($fonts)-1)];
$font=imagecreatefrompng($font_file);
imagealphablending($font, true);
$fontfile_width=imagesx($font);
$fontfile_height=imagesy($font)-1;
$font_metrics=array();
$symbol=0;
$reading_symbol=false;
// loading font
for($i=0;$i<$fontfile_width && $symbol<$alphabet_length;$i++){
$transparent = (imagecolorat($font, $i, 0) >> 24) == 127;
if(!$reading_symbol && !$transparent){
$font_metrics[$alphabet{$symbol}]=array('start'=>$i);
$reading_symbol=true;
continue;
}
if($reading_symbol && $transparent){
$font_metrics[$alphabet{$symbol}]['end']=$i;
$reading_symbol=false;
$symbol++;
continue;
}
}
$img=imagecreatetruecolor($width, $height);
imagealphablending($img, true);
$white=imagecolorallocate($img, 255, 255, 255);
$black=imagecolorallocate($img, 0, 0, 0);
imagefilledrectangle($img, 0, 0, $width-1, $height-1, $white);
// draw text
$x=1;
for($i=0;$i<strlen($this->keystring);$i++){
$m=$font_metrics[$this->keystring{$i}];
$y=mt_rand(-$fluctuation_amplitude, $fluctuation_amplitude)+($height-$fontfile_height)/2+2;
if($no_spaces){
$shift=0;
if($i>0){
$shift=10000;
for($sy=7;$sy<$fontfile_height-20;$sy+=1){
for($sx=$m['start']-1;$sx<$m['end'];$sx+=1){
$rgb=imagecolorat($font, $sx, $sy);
$opacity=$rgb>>24;
if($opacity<127){
$left=$sx-$m['start']+$x;
$py=$sy+$y;
if($py>$height) break;
for($px=min($left,$width-1);$px>$left-12 && $px>=0;$px-=1){
$color=imagecolorat($img, $px, $py) & 0xff;
if($color+$opacity<190){
if($shift>$left-$px){
$shift=$left-$px;
}
break;
}
}
break;
}
}
}
if($shift==10000){
$shift=mt_rand(4,6);
}
}
}else{
$shift=1;
}
imagecopy($img, $font, $x-$shift, $y, $m['start'], 1, $m['end']-$m['start'], $fontfile_height);
$x+=$m['end']-$m['start']-$shift;
}
}while($x>=$width-10); // while not fit in canvas
$center=$x/2;
// credits. To remove, see configuration file
$img2=imagecreatetruecolor($width, $height+($show_credits?12:0));
$foreground=imagecolorallocate($img2, $foreground_color[0], $foreground_color[1], $foreground_color[2]);
$background=imagecolorallocate($img2, $background_color[0], $background_color[1], $background_color[2]);
imagefilledrectangle($img2, 0, 0, $width-1, $height-1, $background);
imagefilledrectangle($img2, 0, $height, $width-1, $height+12, $foreground);
$credits=empty($credits)?$_SERVER['HTTP_HOST']:$credits;
imagestring($img2, 2, $width/2-imagefontwidth(2)*strlen($credits)/2, $height-2, $credits, $background);
// periods
$rand1=mt_rand(750000,1200000)/10000000;
$rand2=mt_rand(750000,1200000)/10000000;
$rand3=mt_rand(750000,1200000)/10000000;
$rand4=mt_rand(750000,1200000)/10000000;
// phases
$rand5=mt_rand(0,31415926)/10000000;
$rand6=mt_rand(0,31415926)/10000000;
$rand7=mt_rand(0,31415926)/10000000;
$rand8=mt_rand(0,31415926)/10000000;
// amplitudes
$rand9=mt_rand(330,420)/110;
$rand10=mt_rand(330,450)/110;
//wave distortion
for($x=0;$x<$width;$x++){
for($y=0;$y<$height;$y++){
if ($wave) {
$sx=$x+(sin($x*$rand1+$rand5)+sin($y*$rand3+$rand6))*$rand9-$width/2+$center+1;
$sy=$y+(sin($x*$rand2+$rand7)+sin($y*$rand4+$rand8))*$rand10;
}
else {
$sx=$x-$width/2+$center+1;
$sy=$y+(sin($x*$rand2+$rand7)+sin($y*$rand4+$rand8))*1.5;
}
if($sx<0 || $sy<0 || $sx>=$width-1 || $sy>=$height-1){
continue;
}else{
$color=imagecolorat($img, $sx, $sy) & 0xFF;
$color_x=imagecolorat($img, $sx+1, $sy) & 0xFF;
$color_y=imagecolorat($img, $sx, $sy+1) & 0xFF;
$color_xy=imagecolorat($img, $sx+1, $sy+1) & 0xFF;
}
if($color==255 && $color_x==255 && $color_y==255 && $color_xy==255){
continue;
}else if($color==0 && $color_x==0 && $color_y==0 && $color_xy==0){
$newred=$foreground_color[0];
$newgreen=$foreground_color[1];
$newblue=$foreground_color[2];
}else{
$frsx=$sx-floor($sx);
$frsy=$sy-floor($sy);
$frsx1=1-$frsx;
$frsy1=1-$frsy;
$newcolor=(
$color*$frsx1*$frsy1+
$color_x*$frsx*$frsy1+
$color_y*$frsx1*$frsy+
$color_xy*$frsx*$frsy);
if($newcolor>255) $newcolor=255;
$newcolor=$newcolor/255;
$newcolor0=1-$newcolor;
$newred=$newcolor0*$foreground_color[0]+$newcolor*$background_color[0];
$newgreen=$newcolor0*$foreground_color[1]+$newcolor*$background_color[1];
$newblue=$newcolor0*$foreground_color[2]+$newcolor*$background_color[2];
}
imagesetpixel($img2, $x, $y, imagecolorallocate($img2, $newred, $newgreen, $newblue));
}
}
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');
if(function_exists("imagejpeg")){
header("Content-Type: image/jpeg");
imagejpeg($img2, null, $jpeg_quality);
}else if(function_exists("imagegif")){
header("Content-Type: image/gif");
imagegif($img2);
}else if(function_exists("imagepng")){
header("Content-Type: image/x-png");
imagepng($img2);
}
}
// returns keystring
function getKeyString(){
return $this->keystring;
}
function setKeyString($str){
$this->keystring = $str;
}
}
// 캡챠 HTML 코드 출력
function captcha_html($class="captcha")
{
$html .= "\n".'<script>var g5_captcha_url = "'.G5_CAPTCHA_URL.'";</script>';
$html .= "\n".'<script>var g5_captcha_path = "'.G5_CAPTCHA_PATH.'";</script>';
$html .= "\n".'<script src="'.G5_CAPTCHA_URL.'/kcaptcha.js"></script>';
$html .= "\n".'<fieldset id="sir_captcha" class="'.$class.'">';
$html .= "\n".'<legend>자동등록방지</legend>';
$html .= "\n".'<img src="#" alt="" id="captcha_img">';
$html .= "\n".'<button type="button" id="captcha_mp3"><span></span>숫자음성듣기</button>';
$html .= "\n".'<button type="button" id="captcha_reload"><span></span>새로고침</button>';
$html .= '<input type="text" name="captcha_key" id="captcha_key" required class="captcha_box sir_inp sir_irq" size="6" maxlength="6">';
$html .= "\n".'</fieldset>';
$html .= "\n".'<span class="sir_finfo1">자동등록방지 숫자를 순서대로 입력하세요.</span>';
return $html;
}
// 캡챠 사용시 자바스크립트에서 입력된 캡챠를 검사함
function chk_captcha_js()
{
return "if (!chk_captcha()) return false;\n";
}
// 세션에 저장된 캡챠값과 $_POST 로 넘어온 캡챠값을 비교
function chk_captcha()
{
$captcha_count = (int)get_session('ss_captcha_count');
if ($captcha_count > 5) {
return false;
}
if (!isset($_POST['captcha_key'])) return false;
if (!trim($_POST['captcha_key'])) return false;
if ($_POST['captcha_key'] != get_session('ss_captcha_key')) {
$_SESSION['ss_captcha_count'] = $captcha_count + 1;
$sql = " insert _error set er_datetime = NOW(), er_ip = '{$_SERVER['REMOTE_ADDR']}', er_user_agent = '{$_SERVER['HTTP_USER_AGENT']}', er_request = 'POST(".$_POST['captcha_key'].')!=SESSION('.get_session('ss_captcha_key').")' ";
sql_query($sql);
return false;
}
return true;
}
?>

View File

@ -0,0 +1,42 @@
<?php
# KCAPTCHA configuration file
$alphabet = "0123456789abcdefghijklmnopqrstuvwxyz"; # do not change without changing font files!
# symbols used to draw CAPTCHA
$allowed_symbols = "0123456789"; #digits
//$allowed_symbols = "23456789abcdeghkmnpqsuvxyz"; #alphabet without similar symbols (o=0, 1=l, i=j, t=f)
# folder with fonts
$fontsdir = 'fonts';
# CAPTCHA string length
//$length = mt_rand(5,6); # random 5 or 6
$length = 6;
# CAPTCHA image size (you do not need to change it, whis parameters is optimal)
$width = 120;
$height = 60;
# symbol's vertical fluctuation amplitude divided by 2
$fluctuation_amplitude = 5;
# increase safety by prevention of spaces between symbols
$no_spaces = false;
# show credits
$show_credits = false; # set to false to remove credits line. Credits adds 12 pixels to image height
$credits = 'www.captcha.ru'; # if empty, HTTP_HOST will be shown
# CAPTCHA image colors (RGB, 0-255)
$foreground_color = array(0, 0, 0);
$background_color = array(255, 255, 255);
//$foreground_color = array(mt_rand(0,100), mt_rand(0,100), mt_rand(0,100));
//$background_color = array(mt_rand(200,255), mt_rand(200,255), mt_rand(200,255));
# JPEG quality of CAPTCHA image (bigger is better quality, but larger file size)
$jpeg_quality = 90;
$wave = true;
?>

View File

@ -0,0 +1,11 @@
<?php
include_once("_common.php");
//error_reporting (E_ALL);
include('captcha.lib.php');
//session_start();
$captcha = new KCAPTCHA();
$captcha->setKeyString(get_session("ss_captcha_key"));
$captcha->getKeyString();
$captcha->image();
?>

View File

@ -0,0 +1,44 @@
<?php
include_once("_common.php");
function make_mp3()
{
global $g4, $config;
$number = get_session("ss_captcha_key");
if ($number == "") return;
if ($number == get_session("ss_captcha_save")) return;
$mp3s = array();
for($i=0;$i<strlen($number);$i++){
$file = G5_CAPTCHA_PATH.'/mp3/'.$config['cf_captcha_mp3'].'/'.$number[$i].'.mp3';
$mp3s[] = $file;
}
$ip = sprintf("%u", ip2long($_SERVER['REMOTE_ADDR']));
$mp3_file = 'data/cache/kcaptcha-'.$ip.'_'.G5_SERVER_TIME.'.mp3';
$contents = '';
foreach ($mp3s as $mp3) {
$contents .= file_get_contents($mp3);
}
file_put_contents(G5_PATH.'/'.$mp3_file, $contents);
// 지난 캡챠 파일 삭제
if (rand(0,10) == 0) {
foreach (glob(G5_PATH.'/data/cache/kcaptcha-*.mp3') as $file) {
if (filemtime($file) + 86400 < $g4['server_time']) {
unset($file);
}
}
}
set_session("ss_captcha_save", $number);
return G5_URL.'/'.$mp3_file;
}
echo make_mp3();
?>

View File

@ -0,0 +1,13 @@
<?
// 캡챠 세션값과 비교하여 맞는지? 틀린지? 결과값을 출력합니다.
include_once("_common.php");
//header("Content-Type: text/html; charset=$g4[charset]");
$count = (int)get_session("ss_captcha_count");
if ($count >= 5) { // 설정값 이상이면 자동등록방지 입력 문자가 맞아도 오류 처리
echo false;
} else {
set_session("ss_captcha_count", $count + 1);
echo (get_session("ss_captcha_key") == $_POST['captcha_key']) ? true : false;
}
?>

View File

@ -0,0 +1,19 @@
<?
include_once("_common.php");
header("Content-Type: text/html; charset=$g4[charset]");
require(dirname(__FILE__).'/kcaptcha_config.php');
include('captcha.lib.php');
while(true){
$keystring='';
for($i=0;$i<$length;$i++){
$keystring.=$allowed_symbols{mt_rand(0,strlen($allowed_symbols)-1)};
}
if(!preg_match('/cp|cb|ck|c6|c9|rn|rm|mm|co|do|cl|db|qp|qb|dp|ww/', $keystring)) break;
}
set_session("ss_captcha_count", 0);
set_session("ss_captcha_key", $keystring);
$captcha = new KCAPTCHA();
$captcha->setKeyString(get_session("ss_captcha_key"));
?>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -244,7 +244,7 @@ if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
<tr>
<th scope="row">자동등록방지</th>
<td><?php echo $captcha_html ?></td>
<td><?php echo captcha_html(); ?></td>
</tr>
</table>