승리꾼,소희 스팸문제 다른처리방법 (체크폼이름을 랜덤으로 생성) > 그누4 팁자료실

그누4 팁자료실

그누보드4와 관련된 팁을 여러분들과 함께 공유하세요.
나누면 즐거움이 커집니다.

승리꾼,소희 스팸문제 다른처리방법 (체크폼이름을 랜덤으로 생성) 정보

승리꾼,소희 스팸문제 다른처리방법 (체크폼이름을 랜덤으로 생성)

본문

아무래도 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_??????폼에 대하여
패턴 체크하고 그 해당폼을 찾아 내기전까지는 자동등록이 힘들지 싶습니다.
완전한 해결방법은 자동등록키에 대한 이미지처리라고 봅니다.
전체 3,313 |RSS
그누4 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT