ugrás a tartalomhoz

PHP AntiSPAM

DarkRaptor · 2008. Ápr. 20. (V), 14.58
Sziasztok!

írtam egy Captcha szkriptet és az lenne a kérdésem, hogyan lehetne azt megvalósítani, hogy betűnként más legyen a fok és a betűszín?
tehát ha van 4 betű, akkor mind a négynek más legyen a színe...

eddig jutottam:

<?php

session_start();
header("Content-type: image/png");


$number = "";

$KEY = "0123456789abcdefghijklmnopqrstuvwxyz";
for($i = 0; $i < 4; $i++) {
	$number .= substr($KEY, rand(0, 36), 1);
}

$hash = md5($number);

$_SESSION['ellenorzo'] = $hash; 


$imagewidth = 100;
$imageheight = 50;
$fontsize = "25";
$fontangle = "0";
$font = "jupitern.ttf";
$text = $number;
$backgroundcolor = "003366";
$textcolor = "FF8A16";


if( eregi( "([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})", $textcolor, $textrgb ) ) {
	$textred = hexdec( $textrgb[1] );
	$textgreen = hexdec( $textrgb[2] );
	$textblue = hexdec( $textrgb[3] );
}


$im = ImageCreateFromJPEG("bg.jpg");

$fontcolor = imagecolorallocate($im, $textred,$textgreen,$textblue);
$box = @imageTTFBbox($fontsize,$fontangle,$font,$text);


$textwidth = abs($box[4] - $box[0]);
$textheight = abs($box[5] - $box[1]);
$xcord = ($imagewidth/2)-($textwidth/2)-2;
$ycord = ($imageheight/2)+($textheight/2);


imagettftext ( $im, $fontsize, $fontangle, $xcord, $ycord, $fontcolor, $font, $text );

imagepng($im);
imagedestroy($im);

?>
próbáltam az imagettftext() függvényt egy forciklusba tenni és azt substr()-el vagdosni, de nem akar úgy összejönni. Hogyan kéne ezt átírni, hogy betünként más színű legyen?

segítségeteket előre is köszönöm!
 
1

Nem látom értelmét

janoszen · 2008. Ápr. 20. (V), 16.38
Mérsékelten látom értelmét saját Captcha-t írni, főleg annak függvényében hogy multkor láttam egy tesztet, hogy másodpercek törtrésze alatt törnek már fel ilyeneket még a bonyolultabb fajtából. Ha mégis ilyet szeretnél használni, akkor a neten keress valami összetettebbet, amit hozzáértő emberek írtak.

Sokkal hasznosabb szerintem egy mező betétele, amit mondjuk JavaScript-tel elrejtesz és melléírod, hogy "ezt ne töltsd ki". Namost minden valamire való spambot megpróbálja kitölteni. Mondjuk HTML-ben adj neki valami jó kis nevet, pl ilyet hogy "firstname".
2

Minek?

Max Logan · 2008. Ápr. 20. (V), 17.24
Én még mindig nem értem, hogy minek ilyen megoldásokat használni.

Már többször leírtam itt a Weblaboron is, hogy én annyit csinálok, hogy a bot számára nem egyértelmű (értsd nem name, email, stb.) nevet adok az input-oknak, valamint regex-es ellenőrzés van a bevitt adatokra. Ez mellé társul még egy e-mail cím checkelés. Ha nem tölti ki az e-mail mezőt a bot, mert nem tudja, hogy oda kellene írni az e-mail címet, akkor nem küldi be a szemetét.

Ez a megoldás most már lassan 2 éve olyan szépen üzemel, mint állat. Félévente egy-két üzenet bejön egy vendégkönyvbe bot által, de ezen kívül semmi.
3

Ne becsüld le az ellenséged!

solkprog · 2008. Ápr. 20. (V), 18.25
Szép és jó amit írtál DE:
1. captcha-t használni nem feltétlenül csak regisztrációs oldalaknál szokás használni. Például célszerű bejelentkezéseknél is. Mondjuk ha 3 szor már elrontották a név/jelszó párost akkor célszerű kidobni egy catcha-t a "felhasználónak". Ha nem teszed annyiszor próbálkozhatnak ahányszor csak akarnak. (feltéve ha más módon nem szűrőd, mondjuk időkorláttal ami megjegyzem elég idegesítő).
2. Nem lehet akkora ördöngösség testre szabni a feltörő programokat, hogy nem az "email" input elemhez kell írni a emailcímet hanem a "sdfsd" hez. És olyan oldalnál ahol ezt megéri megcsinálni meg is fogják csinálni! Jó lehet jönni azzal hogy ilyet senki nem fog ilyet megcsinálni kis látogatottságú oldalaknál.
3. oké hogy az inputnak adsz egy "sdfsdf" nevet de véletlenül az input előtt nem írod ki a felhasználóidnak hogy "Email-címed: ", sőt esetleg nincs véletlenül egy label címkében? Hidd el okosabbak mint te azt hiszed.
Soha ne becsüld le az ellenséged! Sok pénz van a reklám bizniszben. És rohad sok idejük van fejlesztgetni a programjaikat.
Egyébként meg örülök hogy neked (eddig) bevált a ez a fajta védelem, de légyszíves ne buzdíts senkit arra hogy hogy egy védekezési módot elhagyjon. (főleg ha az egy széles körben használt, és elfogadott védekezési módszer)
darkraptor: Netten vannak nagyon jó catcha-k. Van már 3D is.
5

Nem bescsülöm ...

Max Logan · 2008. Ápr. 20. (V), 19.21
... csak amíg nekem 2 éve nincsen gondom ezzel a megoldással, addig felesleges erőfeszítésnek érzem a captcha-t (főleg user idegesítőnek, engem spec. a jox.hu-n található 5+4-es megoldás is qrvára zavar). Ami a login-t illeti, ott pl. 5 rossz belépés után tiltanám pl. 30 percre a próbálkozásokat.

Egyébként valóban kisforgalmú oldalról beszélünk, ahol ez már majd' két éve gond nélkül megy (azóta már egy másik oldalon is így működik a vendégkönyv). Viszont az indulás után eltelt 1 hónap, mire a bot-ok megtalálták az oldalt. Jött napi 30-60 spam üzenet a vendégkönyve. Betettem egy egyszerű spam filetert, ami adott szavakra szűrt. Meguntam, hogy mindig frissítgetni kell, ezért alkalmaztam az elmített megoldást. Egy ideig még logoltam, hogy hány próbálkozása volt a botoknak naponta, kb. ugyanannyi, mint amikor be is küldték a cuccost. Azóta talán fél évente ha 1-2 üzenet bejön, pedig ki van írva, hogy e-mail label-ben. Ezek szerint hülye botok járnak az oldalra vagy csak egyszerűen szerencsém van. Nemtom, de amíg ez működik nem pazarlom az energiámat captcha-ra (legfőképpen nem traktálom ezzel a user-t).
4

Ihaj

janoszen · 2008. Ápr. 20. (V), 18.29
Ha ennyi elég lenne... a volt sulim honlapján a nemzetközi érettségire való jelentkezési lapon már tantárgyakat is választanak a botok. :)
6

Nem szép

Joó Ádám · 2008. Ápr. 20. (V), 19.56
Sokkal hasznosabb szerintem egy mező betétele, amit mondjuk JavaScript-tel elrejtesz és melléírod, hogy "ezt ne töltsd ki".


Nem szép megoldás, én legalábbis ha tehetem, sosem írok valódi funkció nélküli HTML-t.
A legszebb megoldás valószínűleg a matematikai feladat, vagy egyéb kérdés. (Illetve a hagyományos CAPTCHA-k közül kész megoldásként tudom ajánlani a reCAPTCHA-t, a könyvdigitalizálás jegyében :))
7

Hogyne volna funkciója!

Wabbitseason · 2008. Ápr. 21. (H), 10.00
Nem szép megoldás, én legalábbis ha tehetem, sosem írok valódi funkció nélküli HTML-t.

Már hogyne volna funkciója az ilyen "honeypot" mezőknek! Az a funkciója, hogy védjen a botoktól.

Én egyébként CSS-sel dugom el az ilyen mezőket, és tökéletesen működnek.
8

thx

DarkRaptor · 2008. Ápr. 21. (H), 16.51
köszönöm szépen a hozzászólásokat, de most teljesen elbizonytalanodtam! igazából ti is mind mást mondtatok... legtöbben a CAPTCHA-t ajánlották, ezért is kezdtem el ezzel foglalkozni. Persze én is olvastam, hogy 6 sec alatt föltörték a Hotmail CAPTCHA belépőjét, de ha ezt vesszük alapon, akkor nincs menekvés egyik módszerrel sem a robotok elől :D

Megnézem a 3D-s CAPTCHA-t és a reCAPTCHA-t is, ahogy tanácsoltátok, bizonyára fejlettebb techikát alkalmaznak, de légyszíves válaszoljatok arra a kérdésemre, hogyan lehetne betünként változtatni a színt a kódomban! tudom, szerintetek fölösleges a kódom, de én szeretném tudni, hogy mit kéne átírni. Tuti FOR ciklus lesz, de nekem nem jön össze.

előre is köszönöm, addíg tanulmányozom a 3D-s + a reCAPTCHA-t...
9

for ciklus

Drawain · 2008. Ápr. 21. (H), 17.40
Hát ha a probléma ott kezdődik nálad, hogy nem tudod a megfelelő ciklusfajtát kiválasztani akkor szerintem is már működő és bevált captchat szerezzél :)

Egyébként így első ránézésre ezt a kódot:

 $im = ImageCreateFromJPEG("bg.jpg");  

CIKLUS 
 $textcolor = "FF8A16";  
 $fontangle = "0";     
   
 if( eregi( "([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})", $textcolor, $textrgb ) ) {  
     $textred = hexdec( $textrgb[1] );  
     $textgreen = hexdec( $textrgb[2] );  
     $textblue = hexdec( $textrgb[3] );  
 }        
   
 $fontcolor = imagecolorallocate($im, $textred,$textgreen,$textblue);  
 $box = @imageTTFBbox($fontsize,$fontangle,$font,$text);  
   
   
 $textwidth = abs($box[4] - $box[0]);  
 $textheight = abs($box[5] - $box[1]);  
 $xcord = ($imagewidth/2)-($textwidth/2)-2;  
 $ycord = ($imageheight/2)+($textheight/2);  
   
   
 imagettftext ( $im, $fontsize, $fontangle, $xcord, $ycord, $fontcolor, $font, $text );  
CIKLUS VÉGE
kell for ciklusba rakni, ami az első betűtől az utolsóig végigmegy a szövegen. Ezután az $xcord és az $ycord változókba mindig számold ki hogy hol az első betű helye, majd add hozzá a betű szélességét felszorozva a ciklusváltozóval. A $textcolor-t és a $fontangle-t generáld automatikusan, a $text értéke pedig mindig az aktuális betű legyen. Na nagyvonalakban ennyi, ha így sem tudod megcsinálni akkor szerintem használj valami normális captcha-t.
10

tévedés!

DarkRaptor · 2008. Ápr. 23. (Sze), 08.24
a FOR ciklust összehoztam, csak az imagettftext összefűzésével van gondom. De igazából mindegy, mert egyre inkább azt látom, hogy esélytelen ez a fajta megoldás de...

egyrészt megfogadtam a 3D CAPTCHA megoldást, jónak tűnik és sokszor már nekem is nehezemre esik kiolvasni a 3D-s szöveget belőle, úgyhogy a SPAM-et is bizonyára megízzasztja majd.

Másrészt pedig kitaláltam egy olyan megoldást is, hogy a CAPTCHA-ban azt jelenítem meg, hogy "kilencszázötvennyolc" és az ürgének a számot kell beütnie a mezőbe, tehát "958"-at. Ezzel kapcsolatosan lenne egy olyan kérdésem, hogy a SPAM hozzá tud férni a SESSION-hoz?
mert ugye így 2 adatot kell SESSION-ba átküldenem: a random szöveget + a hozzá tartozó számot. Nyílván md5() kódolást fogok alkalmazni, ez alap. Csak kérdés, hogy ezt nem tudja-e a SPAM kiolvasni?

mi a véleményetek erről a megoldásról? előre is köszi a hozzászólásokat!
11

session

Drawain · 2008. Ápr. 23. (Sze), 10.19
A sessionhöz sem a spam, sem a felhasználó nem tud hozzáférni, nyugodtan tárolhatsz benne bármit :) Tudtommal biztonságosnak tekinthető.