본문 바로가기
정보기술/일반

제로보드 광고,로봇글 제한하기[이미지 코드사용] by 토토루

by fermi 2007. 8. 31.
http://www.zeroboard.com/?mid=zb4_tip&document_srl=851791


[1차수정]광고,로봇글 제한하기[이미지 코드사용]조회수: 8333, 추천수: 13, 2005.07.27 15:03:59 게시글 주소 : http://www.zeroboard.com/851791
엮인글 주소 : http://www.zeroboard.com/851791/trackback
토토루
로봇에 의한 광고글을 못올리게하는 방법입니다..
요즘 워낙에,,봇들이 설치고 다녀서리,, 함 올려봅니다..-_--
원리는 글쓰기에서 랜덤숫자로된 코드 이미지를 보여주고 값을 입력하게한후..
키값이 맞으면 등록, 틀리면,, 등록을 못하게하는... 직접 설치해보시면 아실겁니다..^^;

이미지 코드 샘플은 위 이미지와 같습니다.

그럼.. 소스 나갑니다..

아래소스를 code_img.php로 저장후 제로보드(bbs)폴더안에 넣습니다..
<?
// 향상된 난수발생,생성.
mt_srand(hexdec(substr(md5(microtime()), -8)) & 0x7fffffff);
$rand_code .= mt_rand(1000,9999);

//anti_code폴더에 권한과 쓰기
$fp = fopen("anti_code/".$_GET['anti_robotCode'].".hnx","w") or die("쓰기에 실패");  
fwrite($fp, md5($rand_code), 1024);
chmod("anti_code/".$_GET['anti_robotCode'].".hnx", 0666) or die("권한 실패");
fclose($fp);
header ("Content-type: image/png");

//그림의 가로크기
$width = "80";
//그림의 세로크기
$height = "22";
$im = @imagecreate ($width, $height) or die ("이미지 에러!!");
  
//그림안의 색(rgb)
ImageColorAllocate($im, 255,255,255);
  
//그림의 테두리색(rgb색 코드)
$black = ImageColorAllocate($im, 219,219,219);
ImageRectangle($im,0,0,$width-1,$height-1,$black);
  
for ($i=0;$i<=128;$i++)
{
$point_color = imagecolorallocate ($im, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
imagesetpixel($im,mt_rand(2,128),mt_rand(2,38),$point_color);
}
for ($i=0;$i<=5;$i++)
{
$text_color = imagecolorallocate ($im, mt_rand(0,255), mt_rand(0,128), mt_rand(0,255));
$x = 5 + $i * 20;
$y = mt_rand(1,5);
imagechar ($im, 5, $x, $y,  $rand_code{$i}, $text_color);
}
imagepng ($im);
imagedestroy ($im);
die();
?>

그다음..

제로보드(bbs)폴더/script/script_write.php 파일을 php전용 에디터로 열어..
if(!document.write.name.value)
  {
   alert('이름을 입력하여 주세요.');
   document.write.name.focus();
   return false;
  }
요부분 아래에 다음 소스를 넣어줍니다.

if(!document.write.anti_robotCodeimg.value)
  {
   alert('코드를 입력해주세요.');
   document.write.anti_robotCodeimg.focus();
   return false;
  }

그다음..

제로보드(bbs)폴더안 write_ok.php를 php전용 에디터로 열어..
24번째줄...
// 각종 변수 검사;;
if(!$member[no]) { 요거 다음줄에 아래소스를 넣습니다.

$codeFile = file("anti_code/".$_GET['anti_robotCode'].".hnx");        
if($codeFile[0] != md5($_POST['anti_robotCodeimg'])) Error("코드입력이 올바른지 확인하세요.");

그다음.. 소스 끝부분쯤에..
// MySQL 닫기 이거 바로위에 아래소스를 추가합니다.
// 파일 자동삭제.
$anti_codedir = './anti_code/';
$dir = opendir($anti_codedir);
while((false!==($file=readdir($dir))))
if($file!="." and $file !="..") @unlink($anti_codedir.'/'.$file);
closedir($dir);

그다음..

사용중인 스킨폴더안 write.php를 php전용 에디터로 열어..
소스 맨위에..
<?
// 향상된 난수발생,생성.
mt_srand(hexdec(substr(md5(microtime()), -8)) & 0x7fffffff);
$rand_codei = md5(mt_rand(1000000, 9999999));
?>
추가합니다..
그다음..
action=write_ok.php 이부분을..
action=write_ok.php<? echo "?anti_robotCode=".$rand_codei; ?> 이렇게 변경.

그다음..
이미지 코드가 보일 자리에..

<?if(!$member[no]){?>코드입력: <input name="anti_robotCodeimg" type="text" style="width:90px;height:21px;" class="input"> <img src="code_img.php<? echo '?anti_robotCode='.$rand_codei;?>" border="0" style="vertical-align:top;"><?}?>

넣어주세요...

이제 마지막으로..
제로보드폴더(bbs)안에 anti_code폴더를 만들어 줍니다..

이제 남은것은 테스트....^^;=3=3=3
############################################################
응용하면 회원가입페이지, 코멘트등에서도 사용할 수 있겠죠..^_^
이 방법 말고 세션을 이용한 방법도있는데..그 방법은 귀차니즘으로 안올림.;;...=3=3=3
윈도우서버 Rwapm
내컴퓨터를 서버로 만들어보자!!
Google AdSense로 귀하의 웹사이트에서 수익을 창출하세요
첨부 : Capture1w.gif (1.1KB)(194)
댓글 : 44 엮인글 : 0 인쇄 목록 추천  2005.07.27 20:22 느닷없이질문제가 뭘 잘못한건지 code_img.php 불러올 자리에 자꾸 배꼽이 나옵니다. ^^;
2005.07.27 19:42 느닷없이질문토토루님 감사합니다.
2005.07.27 19:25 Blues Hawk저도 응용해 봐야겠네요...^^
그런데 혹시 이팁이 GD를 이용하는건가요?
서버에서 해당 기능을 지원해줘야 되는건지...
2005.07.27 15:58 ganji역시나 멋지십니다. ^^
요즘 이것,,저것 땜에 자주 찾아뵙질 못하네요.

이자리를 빌어,,,, 항상 건강하시고 좋은 일들만 있으시길
바랍니다.

2005.07.27 18:55 zzz어떻게 이런 문자들이
이미지를 만들어내는지 모르겠네요..
훌륭한 팁인것 가타요
2005.07.27 21:07 //토토루
좋은 팁이군요.
그런데, 회원인 경우는 위 코드를 입력하지 않아도 글이 작성됩니다.
비회원인 경우는 코드를 입력해야 글을 작성할 수 있군요.

그런 의도였다면
"코드입력: ~~" 부분을 비회원일 경우만 보이도록 조치하는 편이 좋을 듯 하군요.
2005.07.27 21:14 // 느닷없이질문

code_img 폴더의 권한을 707로 주세요
2005.07.27 22:23 Blues Hawk다른분의 팁이지만^^; 두어곳만 수정하면 로그인하지 않았을경우(비회원)에만 코드입력칸이 나오게하는게 가능할거 같네요^^

코드입력: <input name="anti_robotCodeimg" type="text" style="width:90px;height:21px;" class="input"> <img src="code_img.php<? echo '?anti_robotCode='.$rand_codei;?>" border="0" style="vertical-align:top;">

이부분을...

<? if(!$member[no]) { ?>
코드입력: <input name="anti_robotCodeimg" type="text" style="width:90px;height:21px;" class="input"> <img src="code_img.php<? echo '?anti_robotCode='.$rand_codei;?>" border="0" style="vertical-align:top;">
<? } ?>
이런식으로...^^
일단 이렇게하면 로그인할 경우 코드입력칸은 보이지 않을거구요...

action=write_ok.php 이부분을..
action=write_ok.php<? echo "?anti_robotCode=".$rand_codei; ?> 이렇게 변경.

이부분도 변경을 해줘야 할거 같긴한데...
원래 팁에서 회원이 글쓸경우 코드입력을 하지 않아도 되면...안해도 될듯하고...^^
직접 팁을 해보질 않아서...^^;

어쨌든 좋은팁입니다...^^
2005.07.27 22:27 토토루허접한 팁을 사용해주신 모든분들에게 감사합니다..
p.s 간지님도,, 잘 지내시죠^^


꺾쇠// 깜빡했네욤,,;; 수정하였습니다.. ^^

2005.07.27 22:29 토토루Blues Hawk // 글을 올리는도중,, 저보다 먼저,, 작성하셨네욤,,;;ㅁ;;
action=write_ok.php<? echo "?anti_robotCode=".$rand_codei; ?> 이부분은 그냥쓰셔도됩니다..^^;
2005.07.27 22:42 토토루Blues Hawk // 네,, GD가 가능해야됩니다..^^;
2005.07.27 23:18 Blues Hawk다른분의 팁을 손대서 송구합니다^^;
음...한가지 사족을 좀 달자면요...^^;
anti_code 폴더 파일삭제 부분을 자동으로 이루어지게 바꾸면 어떨까하는...아무래도 그부분이 좀 번거로울듯 하네요...^^;


bbs 디렉토리의 write_ok.php 파일의 가장 아래부분...

// MySQL 닫기

바로 윗줄쯤에...

$anticode_dir = './anti_code/';
$open = opendir($anticode_dir);
while($file = readdir($open)) {
if ($file != '.' and $file !='..') unlink($dir.$file);
}
closedir($open);

요런식으로 넣어주면 될거 같은데요^^
좀 무지막지한 방법이긴 하지만...
원래 팁대로 anti_code 폴더가 bbs 아래에 있다는 전제하에...

글쓸때 가상이미지 파일이 생성될때마다 그 이름을 지정해서 그 파일만 삭제해주면 깔끔할텐데...실력부족으로...^^;
2005.07.28 01:09 MiRu™역시 토토루님은 알짜배기 팁만 올려주시네요. ^^
제가 지금 위에 순서되로 적용을 했는데, 잘 적용은 됩니다.

그런데 처음 오시는 분들이 코드를 입력 안하고 (비회원인 경우는 코드 넣는걸 잘 모를수도 있기 때문에 코드를 안넣고 작성하는 경우가 많을것 같습니다.) 글쓰기 버튼을 누르면
"코드입력이 올바른지 확인하세요" 란 에러메세지가 뜹니다.

이건 당연한 결과지요. (이 부분을 경고창으로 대신하면 더 좋겠단 생각을 해봅니다. ^^; ) 코드를 입력해야 하니까요. 여기서 이전화면을 누르면 이전에 작성한 내용은 전부 날라가버립니다.

또 코드를 입력하고 글쓰기 버튼을 누르면 "글쓰기 버튼을 여러번 누르시면 안됩니다" 란 경고창이 계속 떠서 글작성이 안됩니다.

원래 그런건지 제가 팁을 잘못 적용한건지 한번 테스트 부탁드립니다.

http://miru.web-bi.net/bbs/zboard.php?id=bbs
2005.07.28 02:48 토토루Blues Hawk // 수정하였습니다..^^;

MiRu™// 스킨상에 문제가 있을수 있으니..기본스킨으로 테스트 해보세요. 전 잘되거든요..^^
경고 메시지와 파일 삭제 부분이 추가되었으니.. 위 소스를 사용하세요..^^
2005.07.28 07:46 MiRu™모처럼 새벽에 일어났다가 토토루님 리플을 보고 바로 적용했습니다.
일단 위에 보여줬던 문제점 완전히 사라졌습니다.

코드를 입력하지 않으니 경고창으로 코드를 입력하라는 메세지가 뜨고 바로 코드창으로 커서가 옯겨가더군요.

그리고 추가된 파일삭제 부분도 아주 잘 되고 있습니다.

감사합니다. ^^
2005.07.28 09:55 아가페좋은 자료 감사드립니다...
부탁하나 드려도 될까요...
주민번호 없이 회원가입을 하게될때도 스팸업체에서 엄청 가입을 하는데요,
회원가입 할때도 위와같은 방법으로 해줄 수 있으면.. 어떨까 하는 생각이 듭니다.
(다음카페 가입할때도 그런 방법을 사용하더라구요)
2005.07.28 10:02 MiRu™아가페님 저도 주민등록번호를 안받으니 스팸업체에서 엄청 가입을 많이합니다.
저는 그냥 레벨 강등으로 대처하고 있었습니다.

회원가입할 때 위 팁을 적용하려면 어떻게 하면 될까요?

아가페님 리플 보고 토토루님 홈페이지 방문하니 토토루님 회원가입페이지는 이미 적용이 되어 있더군요.

회원가입과 코멘트 부분에도 같은 팁을 적용하려면 어떻게 해야 할까요?
역시 php를 전혀 모르니 응용이 안되네요. ㅠㅠ
2005.07.28 10:30 // 회원가입할 때 로봇글 제한하기

금방 적용해 봤습니다. 오류가 있을 수도 있겠죠. 저는 없네요.
이상 있으면 말씀해 주세요.

/// member_join.php

맨 위에

<?
// 향상된 난수발생,생성.
mt_srand(hexdec(substr(md5(microtime()), -8)) & 0x7fffffff);
$rand_codei = md5(mt_rand(1000000, 9999999));
?>

action=member_join_ok.php 를 찾아서

action=member_join_ok.php<? echo "?anti_robotCode=".$rand_codei; ?>
로 변경

적당한 위치(저는 회원가입 아이콘 위에)

<input type=image border=0 src=images/button_join.gif>  
위에 아래처럼

<font color=red><b>코드입력</b></font>: <input name="anti_robotCodeimg" type="text" style="width:90px;height:21px;" class="input"> <img src="code_img.php<? echo '?anti_robotCode='.$rand_codei;?>" border="0" style="vertical-align:top;">
<input type=image border=0 src=images/button_join.gif>  


/// member_join_ok.php


if($member[no]&&!$mode) Error("이미 가입이 되어 있습니다.","window.close");
아래에

$codeFile = file("anti_code/".$_GET['anti_robotCode'].".hnx");
if($codeFile[0] != md5($_POST['anti_robotCodeimg'])) Error("코드입력이 올바른지 확인하세요.");

를 넣으면 됩니다.

토토루님 덕분에 좋은 팁을 적용하게 되었네요.

2005.07.28 10:34 드림팀토토루야,,
너무 과용하는거 아냐?
^____^

꾸~욱~!!
2005.07.28 11:15 // 토토루
// 드림팀

제 기억이 맞다면 두 분 중 어느 홈피에 홈페이지 만드는 방법이 있는 것으로 아는데, 기억이 가물가물 하네요.

main.php, head.php foot.php 를 꾸미는 방법을 그림과 함께 잘 설명해 둔 곳 아시면 누구 알려 주세요.
2005.07.28 11:57 MiRu™꺽쇠님은 응용이 되시군요. ^^
꺽쇠님 따라 제 홈피에도 적용했습니다.

자동파일삭제기능도 넣으면 좋겠네요. ^^;

2005.07.28 12:39 무지개광고 글 땜시 골치 아팠는데, 덕분에 잘 쓰겠습니다.
제가 까막 눈이긴 하지만,
토토루님의 이 팁이 예전의 팁들보다
적용하기가 훨씬 간편한 것 맞지요~ ^^

그나저나 GD가 서버에 깔렸는지 확인해봐야 되는데,
방법이 어떻게 되는지 가물가물하니...검색해보겠습니다.
2005.07.28 13:11 Blues Hawk사용하시는 서버에서 GD가 지원되는지 여부는...
직접 GD명령어를 통해서 간단한 이미지를 만들어보고 이미지가 보이면 사용可 안보이면 불가라고 판단해도 되구요...^^

아무 파일이나 하나 만들어서 내용을
<?
phpinfo()
?>
이렇게 넣고 서버에 올린후 실행해 보세요.

GD Support enabled
GD Version 2.0 or higher
FreeType Support enabled
FreeType Linkage with freetype
GIF Read Support enabled
GIF Create Support enabled
JPG Support enabled
PNG Support enabled
WBMP Support enabled

이런식으로 GD관련 상세정보들이 표시됩니다.
외에도 여러가지 서버정보가 쭉~ 나오죠^^
2005.07.28 13:19 Blues Hawk그리고 저도 팁적용하다 나온건데...^^;
이 팁을 적용하려면 사용하는 모든 게시판에 동일하게 적용을 해야합니다.
팁적용을 하지 않은 게시판은 에러메세지가 나오네요...^^;

저같은 경우는 게시판이 30여개 정도되는데...팁이 불필요한 게시판도 있거든요. 적용하기 곤란한 경우나...
그런 게시판에서 손님이 글을쓰면 에러가...물론 로그인해서 글을쓰면 문제가 없구요...

write_ok.php 에서 일괄적으로 모든 게시판에서 코드값을 입력받기를 원해서 그런것 같은데...
그부분을 좀 수정을 하면 좋을거 같습니다.
write_ok.php 로 데이타를 넘겨주기전에 각 게시판 스킨에서 코드처리를 다 해주면 어떨까라는 생각이...^^;
사족이었습니다.;;



2005.07.28 13:31 // 삭제


mysql_close($connect); 를 찾아서 그 위에

// 코드파일 자동삭제.
$anti_codedir = './anti_code/';
$dir = opendir($anti_codedir);
while((false!==($file=readdir($dir))))
if($file!="." and $file !="..") @unlink($anti_codedir.'/'.$file);
closedir($dir);
를 넣으세요.
2005.07.28 13:33 이우용http://www.vgaclub.co.kr/zboard/zboard.php?id=test


이미지가 안나옵니다.. 답답해요.. 엉엉~~~
gd 설치 된거 맞구요...

이상하게.. 글쓰기 할때... 이미지가 안나옵니다.
제가 뭐 빼먹은건 없는거 같은데요..
2005.07.28 13:35 이우용꺽쇠 //
제꺼 답변 주신거죠...?
제가 삭제한 이유는... 일단
code_img 폴더의 권한을 707로 주세요 라는 꺾쇠님의 답글을 보고.. 적용을 시켜보려고
일단 삭제를 했었는데... 마찬가지로 안되네요..
엉엉~~~
2005.07.28 13:55 이우용혹시나 해서..
anti_code 권한을 707로 해보니깐 잘 되네요..
좋은팁 너무너무 감사합니다.
2005.07.28 14:10 토토루특정게시판에만 적용하려면..
write_ok.php에서..

if($id == "게시판아이디"){
$codeFile = file("anti_code/".$_GET['anti_robotCode'].".hnx");
if($codeFile[0] != md5($_POST['anti_robotCodeimg'])) Error("코드입력이 올바른지 확인하세요.");
}

이런식으로 하시면 됩니다..

또한..

반대로.. 특정 게시판만 제외하고 적용되게하려면..

if($id != "게시판아이디"){
$codeFile = file("anti_code/".$_GET['anti_robotCode'].".hnx");
if($codeFile[0] != md5($_POST['anti_robotCodeimg'])) Error("코드입력이 올바른지 확인하세요.");
}

하시면 해당 아이디만 제외하고 적용됩니다..^^;

p.s 꺽쇠 // 제 수고를 덜어주시네요,, 감사합니다..^^
드림팀 // 팥빙수 사주세요^^;
2005.07.28 14:25 MiRu™꺽쇠님~

회원가입시에 저 팁 사용시 파일자동삭제기능을 넣을때 mysql_close($connect); 를 찾아서 그 위에 넣으라고 하셨는데.

member_join.php
member_join_ok.php 2파일 전부 적용해야 하나요?


2005.07.28 14:33 토토루member_join_ok.php 파일에만 넣으시면됩니다..^_^
2005.07.28 14:50 MiRu™토토루님 감사합니다.
2005.07.28 17:32 악덕마담토토루님 덕분에 잘 적용해 놓았습니다...

친절한 설명 감사합니다... ^^;;

그런데 저같은 경우는 방명록에밖에 적용할데가 없더군요...

쓸데 없이 모든 게시판을 "회원제" 로 만들어 놓아서리 ㅡㅡㅋ

아무튼, 이 팁을 적용해 놓고 나니 뭔가 안심이 되는것이~ ^^ 좋습니다 굿~!!
2005.07.28 17:53 MiRu™만약에 bbs 와 guest 란 아이디의 2게시판에 적용하려면

if($id == "bbs" || $id == "guest"){
$codeFile = file("anti_code/".$_GET['anti_robotCode'].".hnx");
if($codeFile[0] != md5($_POST['anti_robotCodeimg'])) Error("코드입력이 올바른지 확인하세요.");
}

이렇게 하는게 맞나요?
2005.07.28 23:57 거니토토루님.. 좋은팁.. 감사합니다.. ^^
추천한방.. 쎄게 해주고 갑니다~~~
미루님~~ 그렇게 하시면 되겠네요...
2005.07.29 05:29 조민토토루님!

좋은 팁 앞에 추천만 하고 가자니 모해서 멋진팁이라는 말 안아끼고 갑니다.

시원시원한 여름이 되시길.....


   2005.07.29 11:42 김태환체크박스와 더불어 멋진 팁이라고 생각합니다. 추천 한방 합니다
2005.07.30 22:17 토토루거니 //조민 // 김태환 // 님,, 바뻐서,, 엔죠에 잘 들리지도 못하네요..^^;
모두들,, 감사합니다..

2005.07.30 22:18 불청객멋진 팁,
감사합니다^^

추천 들어갑니다~
2005.08.02 15:38 플라워감사합니다....좋은 팁~
2005.09.28 08:46 사랑어느 스킨이나 다 적용됩니다.
제홈도 드림퀘스트님 스킨으로 이뤄져있어요^.~~
첨부터 차근차근하시면 됩니다.
2005.10.19 17:21 하나저도 드림퀘스트님 쓰는데 스킨폴더의 write.php 에서 action=write_ok.php 이부분을
찾을 수가 없네요... 적용 할 방법 없을까요?
2005.10.24 12:06 강호영//느닷없이질문

님처럼 저도 code_img.php 를 불러올 부분에 자꾸 배꼽이 나오네요.
서버는 천리안...

뭐가 문제일까요? 시키는 대로 다 했는데.. 도와주세요. 권한도 707로 모두 변경했습니다.
꼭 해보고 싶습니다.

http://php.chol.com/~ghdud99/bbs/zboard.php?id=guest
2007.04.17 22:43 조형환DQ 갤러리를 쓰는데요.
코멘트 광고글 때문에 골치가...
토토루님은 "응용하면 회원가입페이지, 코멘트등에서도 사용할 수 있겠죠..^_^"
라고 하시는데 저 같은 초보는 ..영...
다른게시판 (방명록)은 적용이 잘 되는데 DQ 갤러리에는 잘 안되네요. 코멘트에 적용하고 싶은데 쩝...