update plugin/kcaptcha

This commit is contained in:
Amberstone 2024-09-19 20:42:01 +09:00
parent c33663d056
commit 73ef7de539
Signed by: amber
GPG key ID: 094B0E55F98D8BF1
9 changed files with 295 additions and 270 deletions

View file

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

View file

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

View file

@ -18,6 +18,8 @@
class KCAPTCHA{
private $keystring;
// generates keystring and image
function image(){
require(dirname(__FILE__).'/kcaptcha_config.php');
@ -50,13 +52,13 @@ class KCAPTCHA{
$transparent = (imagecolorat($font, $i, 0) >> 24) == 127;
if(!$reading_symbol && !$transparent){
$font_metrics[$alphabet{$symbol}]=array('start'=>$i);
$font_metrics[$alphabet[$symbol]]=array('start'=>$i);
$reading_symbol=true;
continue;
}
if($reading_symbol && $transparent){
$font_metrics[$alphabet{$symbol}]['end']=$i;
$font_metrics[$alphabet[$symbol]]['end']=$i;
$reading_symbol=false;
$symbol++;
continue;
@ -75,7 +77,9 @@ class KCAPTCHA{
$odd=mt_rand(0,1);
if($odd==0) $odd=-1;
for($i=0;$i<$length;$i++){
$m=$font_metrics[$this->keystring{$i}];
if( ! isset($this->keystring[$i]) ) continue;
$m=$font_metrics[$this->keystring[$i]];
$y=(($i%2)*$fluctuation_amplitude - $fluctuation_amplitude/2)*$odd
+ mt_rand(-round($fluctuation_amplitude/3), round($fluctuation_amplitude/3))
@ -169,10 +173,10 @@ class KCAPTCHA{
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;
$color=imagecolorat($img, (int)$sx, (int)$sy) & 0xFF;
$color_x=imagecolorat($img, (int)$sx+1, (int)$sy) & 0xFF;
$color_y=imagecolorat($img, (int)$sx, (int)$sy+1) & 0xFF;
$color_xy=imagecolorat($img, (int)$sx+1, (int)$sy+1) & 0xFF;
}
if($color==255 && $color_x==255 && $color_y==255 && $color_xy==255){
@ -202,7 +206,7 @@ class KCAPTCHA{
$newblue=$newcolor0*$foreground_color[2]+$newcolor*$background_color[2];
}
imagesetpixel($img2, $x, $y, imagecolorallocate($img2, $newred, $newgreen, $newblue));
imagesetpixel($img2, (int)$x, (int)$y, imagecolorallocate($img2, (int)$newred, (int)$newgreen, (int)$newblue));
}
}
@ -240,17 +244,17 @@ function captcha_html($class="captcha")
if(is_mobile())
$class .= ' m_captcha';
$html .= "\n".'<script>var g5_captcha_url = "'.G5_CAPTCHA_URL.'";</script>';
$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="captcha" class="'.$class.'">';
$html .= "\n".'<legend><label for="captcha_key">자동등록방지</label></legend>';
if (is_mobile()) $html .= '<audio src="#" id="captcha_audio" controls></audio>';
if (is_mobile()) $html .= '<audio id="captcha_audio" controls></audio>';
//$html .= "\n".'<img src="#" alt="" id="captcha_img">';
$html .= "\n".'<img src="javascript:void(0);" alt="" id="captcha_img">';
$html .= "\n".'<img src="'.G5_CAPTCHA_URL.'/img/dot.gif" alt="" id="captcha_img">';
$html .= '<input type="text" name="captcha_key" id="captcha_key" required class="captcha_box required" size="6" maxlength="6">';
if (!is_mobile()) $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 required" size="6" maxlength="6">';
$html .= "\n".'<span id="captcha_info">자동등록방지 숫자를 순서대로 입력하세요.</span>';
$html .= "\n".'</fieldset>';
return $html;
@ -260,26 +264,29 @@ function captcha_html($class="captcha")
// 캡챠 사용시 자바스크립트에서 입력된 캡챠를 검사함
function chk_captcha_js()
{
// return "if (!chk_captcha()) return false;\n";
return "if (!chk_captcha()) return false;\n";
}
// 세션에 저장된 캡챠값과 $_POST 로 넘어온 캡챠값을 비교
function chk_captcha()
{
/*$captcha_count = (int)get_session('ss_captcha_count');
$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')) {
$post_captcha_key = (isset($_POST['captcha_key']) && $_POST['captcha_key']) ? trim($_POST['captcha_key']) : '';
if (!trim($post_captcha_key)) return false;
if( $post_captcha_key && function_exists('get_string_encrypt') ){
$ip = md5(sha1($_SERVER['REMOTE_ADDR']));
$post_captcha_key = get_string_encrypt($ip.$post_captcha_key);
}
if ($post_captcha_key != get_session('ss_captcha_key')) {
$_SESSION['ss_captcha_count'] = $captcha_count + 1;
return false;
}
return true;*/
return true;
return true;
}
?>

View file

@ -49,4 +49,3 @@ $background_color = array(255, 255, 255);
$jpeg_quality = 90;
$wave = true;
?>

View file

@ -3,7 +3,14 @@ include_once("_common.php");
include_once('captcha.lib.php');
$captcha = new KCAPTCHA();
$captcha->setKeyString(get_session("ss_captcha_key"));
$ss_captcha_key = get_session("ss_captcha_key");
$ss_captcha_key_decrypt = '';
if( $ss_captcha_key && !preg_match('/^[0-9]/', $ss_captcha_key) && function_exists('get_string_decrypt') ){
$ip = md5(sha1($_SERVER['REMOTE_ADDR']));
$ss_captcha_key_decrypt = str_replace($ip, '', get_string_decrypt($ss_captcha_key));
}
# php 5.2 또는 5.3 버전에서 포인터처럼 해당 세션값이 변경되는 버그가 있어서 아래와 같이 조치함
if(! $ss_captcha_key_decrypt) $ss_captcha_key_decrypt = $ss_captcha_key;
$captcha->setKeyString($ss_captcha_key_decrypt);
$captcha->getKeyString();
$captcha->image();
?>

View file

@ -8,6 +8,10 @@ function make_mp3()
$number = get_session("ss_captcha_key");
if ($number == "") return;
$ip = md5(sha1($_SERVER['REMOTE_ADDR']));
if( $number && function_exists('get_string_decrypt') ){
$number = str_replace($ip, '', get_string_decrypt($number));
}
if ($number == get_session("ss_captcha_save")) return;
$mp3s = array();
@ -16,29 +20,30 @@ function make_mp3()
$mp3s[] = $file;
}
$ip = sprintf("%u", ip2long($_SERVER['REMOTE_ADDR']));
$mp3_file = 'data/cache/kcaptcha-'.$ip.'_'.G5_SERVER_TIME.'.mp3';
$mp3_file = '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);
file_put_contents(G5_DATA_PATH.'/'.$mp3_file, $contents);
// 지난 캡챠 파일 삭제
if (rand(0,99) == 0) {
foreach (glob(G5_PATH.'/data/cache/kcaptcha-*.mp3') as $file) {
foreach (glob(G5_DATA_PATH.'/cache/kcaptcha-*.mp3') as $file) {
if (filemtime($file) + 86400 < G5_SERVER_TIME) {
@unlink($file);
}
}
}
if( $number && function_exists('get_string_encrypt') ){
$number = get_string_encrypt($ip.$number);
}
set_session("ss_captcha_save", $number);
return G5_URL.'/'.$mp3_file;
return G5_DATA_URL.'/'.$mp3_file;
}
echo make_mp3();
?>

View file

@ -1,13 +1,18 @@
<?
<?php
// 캡챠 세션값과 비교하여 맞는지? 틀린지? 결과값을 출력합니다.
include_once("_common.php");
//header("Content-Type: text/html; charset=$g4[charset]");
$captcha_key = isset($_POST['captcha_key']) ? $_POST['captcha_key'] : '';
$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;
if( $captcha_key && function_exists('get_string_encrypt') ){
$ip = md5(sha1($_SERVER['REMOTE_ADDR']));
$captcha_key = get_string_encrypt($ip.$captcha_key);
}
echo (get_session("ss_captcha_key") === $captcha_key) ? true : false;
}
?>

View file

@ -6,13 +6,17 @@ include_once('captcha.lib.php');
while(true){
$keystring='';
for($i=0;$i<$length;$i++){
$keystring.=$allowed_symbols{mt_rand(0,strlen($allowed_symbols)-1)};
$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;
}
if( $keystring && function_exists('get_string_encrypt') ){
$ip = md5(sha1($_SERVER['REMOTE_ADDR']));
$keystring = get_string_encrypt($ip.$keystring);
}
set_session("ss_captcha_count", 0);
set_session("ss_captcha_key", $keystring);
$captcha = new KCAPTCHA();
$captcha->setKeyString(get_session("ss_captcha_key"));
?>