승리꾼,소희 스팸문제 다른처리방법 (체크폼이름을 랜덤으로 생성) 정보
승리꾼,소희 스팸문제 다른처리방법 (체크폼이름을 랜덤으로 생성)본문
아무래도 wr_key값에 대한 폼값이전에 예시값을 html형태로 읽어오는듯싶습니다.
이미지형태로 변경하기전에는 이 폼값에 대하여 자동등록을 계속할것 같습니다.
그래서 로봇체크하는 이 폼값자체를 랜덤으로 생성하도록 하면 아마도 로봇이
해당 폼값을 자동으로 입력받기에는 무리가 있을것으로 보입니다.
물론 이부분도 폼전체필드에 대하여 기본폼이름이 아닌곳에 키값을 대입하도록
처리하면 풀릴것이라 예상이 되네요.
폼이름을 일단위로 변경처리했습니다.
'oldccc'는 키값으로 아무래도 다른 키값으로 해놔야 로봇이 동일한 패턴으로
폼이름을 생성하지 못하리라 생각합니다.
$norobot_form_name = 'wr_'.substr(md5(date("Y-m-d",time()).'oldccc'),0,10);
//############################################################
//
// bbs/norobot.inc.php
//
//############################################################
<?
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가
/*
** $norobot_str 와 $_SESSION[ss_norobot_key] 을 반환함
*/
// 자동등록기를 막아볼까요?
$is_norobot = false;
if ($config[cf_use_norobot]) {
// 임의의 md5 문자열을 생성
$tmp_str = substr(md5($g4[server_time]),0,10);
// 난수 발생기
list($usec, $sec) = explode(' ', microtime());
$seed = (float)$sec + ((float)$usec * 100000);
srand($seed);
$keylen = strlen($tmp_str);
$div = (int)($keylen / 2);
while (count($arr) < 3)
{
unset($arr);
for ($i=0; $i<$keylen; $i++)
{
$rnd = rand(1, $keylen);
$arr[$rnd] = $rnd;
if ($rnd > $div) break;
}
}
// 배열에 저장된 숫자를 차례대로 정렬
sort($arr);
$norobot_key = "";
$norobot_str = "";
$m = 0;
for ($i=0; $i<count($arr); $i++)
{
for ($k=$m; $k<$arr[$i]-1; $k++)
$norobot_str .= $tmp_str[$k];
$norobot_str .= "<font size=3 color=#FF0000><b>{$tmp_str[$k]}</b></font>";
$norobot_key .= $tmp_str[$k];
$m = $k + 1;
}
if ($m < $keylen) {
for ($k=$m; $k<$keylen; $k++)
$norobot_str .= $tmp_str[$k];
}
$norobot_str = "<font color=#999999>$norobot_str</font>";
// 입력, 답변이면서 회원이 아닐 경우만 자동등록방지 사용
if (($w == "" || $w == "r") && !$member[mb_id]) {
set_session("ss_norobot_key", $norobot_key);
$is_norobot = true;
// 시간단위로 폼이름값이 변경되도록 처리
$norobot_form_name = 'wr_'.substr(md5(date("Y-m-d",time()).'oldccc'),0,10);
}
else
set_session("ss_norobot_key", "");
}
?>
<script language='javascript'> var md5_norobot_key = '<?=md5($norobot_key)?>'; </script>
//#################################################################
//
// bbs/norobot_check.inc.php
//
//#################################################################
<?
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가
// norobot.inc.php 가 선행된 후 사용
// 자동등록방지 검사
if ($config[cf_use_norobot]) {
// 폼이름 생성
$norobot_form_name = 'wr_'.substr(md5(date("Y-m-d",time()).'oldccc'),0,10);
// 우선 이 URL 로 부터 온것인지 검사
$parse = parse_url($_SERVER[HTTP_REFERER]);
// 3.35
// 포트번호가 존재할 경우의 처리 (mumu님께서 알려주셨습니다)
$parse2 = explode(":", $_SERVER[HTTP_HOST]);
if ($parse[host] != $parse2[0]) {
//if ($parse[host] != $_SERVER[HTTP_HOST]) {
alert("올바른 접근이 아닌것 같습니다.", "./");
}
$key = $_SESSION[ss_norobot_key];
if (($w=='' || $w=='c') && !$member[mb_id]) {
if ($key) {
if ($key != $_POST["$norobot_form_name"]) {
alert("정상적인 등록이 아닌것 같습니다.");
}
} else {
alert("정상적인 접근이 아닌것 같습니다.");
}
}
}
?>
//#################################################################
//
// skin/board/스킨명/write.skin.php
//
//#################################################################
이부분을
<? if ($is_norobot) { ?>
<tr>
<td style='padding-left:20px; height:30px;'>· <?=$norobot_str?></td>
<td><input class=ed type=input size=10 name=wr_key itemname="자동등록방지" required> * 왼쪽의 글자중 <font color="red">빨간글자만</font> 순서대로 입력하세요.</td>
</tr>
<tr><td colspan=2 height=1 bgcolor=#e7e7e7></td></tr>
<? } ?>
아래와 같이 변경
<? if ($is_norobot) { ?>
<tr>
<td style='padding-left:20px; height:30px;'>· <?=$norobot_str?></td>
<td><input class=ed type=input size=10 name=<?=$norobot_form_name?> required> * 왼쪽의 글자중 <font color="red">빨간글자만</font> 순서대로 입력하세요.</td>
</tr>
<tr><td colspan=2 height=1 bgcolor=#e7e7e7></td></tr>
<? } ?>
1
댓글 6개
날짜 기준으로 랜덤하게 자동등록방지(wr_key)의 폼이름이 변함으로써
write.skin.php를 설치지 않고 곧바로 write_update.skin.php로 넘어간다고 하여도
로봇이 자동등록방지 폼이름값으로 자동방지 키값을 입력할것인데 그 자체가 변함으로 자동등록이 어려워진다고 보여집니다.
또한 write.skin.php상에서 폼이름값이 나타나지 않는다면 당연히 실제 유져가
자동등록값을 입력할수 없게됩니다. 이부분또한 로봇이 모든 wr_??????폼에 대하여
패턴 체크하고 그 해당폼을 찾아 내기전까지는 자동등록이 힘들지 싶습니다.
완전한 해결방법은 자동등록키에 대한 이미지처리라고 봅니다.