استفاده از کپچا (Captcha) در فرم های ارسال و یا دریافت کانستراکت
#1
Lightbulb 
به نام خدا؛
سلام دوستان امیدوارم حـالتون خوب باشه. امروز قصد داریم راجع به استفاده از کپچا (captcha) در پروژه های خودمون صحبت کنیم. اول از همه بد نیست یک توضیحاتی راجع به اینکه کپچا چی هست ارائه بدیم اگرچه بسیاری از دوستان آشنایی کامل با کپچا دارند.
کپچا دقیقاً چیست و به چه دردی میخورد؟
کپچا در واقع یکی از ایده های سرشار آلن تورینگ ریاضیدان و پدر علم رایانه بود که حتماً داستان زندگی اش رو در فیلم بازی تقلید ساخته سال 2014 تماشا کردین. کپچا یک تصویر هست شامل عباراتی مثل حروف و عدد که کاربر با وارد کردن اون عبارات در یک فیلد (تکست باکس) در واقع به ما اثبات میکنه که ربات نیست. ربات ها یا ربات های خزنده وب در واقع نوشته میشن تا به صورت فورانی و بسیار زیاد ریکوئست ارسال کنن تا به طور معمول سرویس رو از کار بندازن و یا برای مقاصد دیگه طراحی میشن. ربات ها قادر به خوندن این تصویر کج و کوله نیستن و هر چقدر که تلاش میکنن تا ریکوئست رو ارسال کنن موفق نمیشن چرا که از عهده وارد کردن کپچا بر نمیان. البته این روزها ربات هایی نوشته شدن که از پس این نوع ابتدایی کپچاها به راحتی بر میان و میتونن اون رو بخونن. پس بهترین گزینه استفاده از reCaptcha گوگل هست که صرفاً به یک آزمون ساده اکتفا نمیکنه و موارد دیگه ای رو هم در نظر میگیره.
شما میتونین برای جلوگیری از فعالیت ربات ها یا در کل ارسال فورانی و شدید ریکوئست ها به جای کپچا از ساز و کارهای دیگه و ابتکاری استفاده کنین. مثلاً بگین کاربر حاصلضرب دو عدد رو بنویسه تا ثابت بشه ربات نیست و یا.... که به ابتکار شما بستگی داره. من توی این آموزش در واقع تمرکزم روی مقوله کپچا اونم ساده ترین نوعش هست. من با استفاده از زبان php و البته استفاده از سشن ها در این زبان این پروژه رو پیاده سازی کردم. دقت کنین که بهتره این پروژه رو روی لوکال هاست اجرا نکنین چون ممکنه تصویر کپچا رو دریافت نکنین!
توضیحـات پروژه:
من توی این پروژه چهـارتا تا فایل دارم که کارایی هر کدوم رو شرح میدم.
  • فایل اول: (فایل سازنده کپچا) 
این فایل در واقع با کمک فایل سوم که دیکشنری هست کار میکنه. این فایل php میاد عبارات تصادفی از دیکشنری رو دریافت میکنه و اونا رو در قالب یک تصویر میسازه و ما در واقع با اجرای اون شاهد یک تصویر هستیم که همون کپچا خواهد بود.
  • فایل دوم (فایل بررسی صحت کپچا وارده توسط کاربر):
این فایل بررسی میکنه که آیا عبارتی که کاربر وارد کرده با توجه به تصویر کپچا صحیح هست یا خیر. 
  • فایل سوم (دیکشنری مورد نیاز برای ساخت کپچا):
در واقع در این فایل ما یک دیکشنری تهیه کردیم برای اینکه تعیین کنیم چه عبارتی در کپچایی که برای کاربر ساخته میشه وجود داشته باشه. مسلم هست که هر چی دیکشنری جامع تری تهیه کنیم کپچاهای حاصل متنوع تر خواهند بود.
اما در ساخت این دیکشنری یک اصل در مبحث ترکیبات ریاضیات به نام جایگشت ممکنه به کارتون بیاد. فرض کنین میخوایم سه حرف abc رو کنار هم بچینیم. به چند حالت این کار ممکنه؟ جایگشت پاسخ سوال رو میده و میگه 3!=6 حالت ممکنه. پس حالا میتونیم راحت تر درک کنیم که هر چی دیکشنری جامع تر باشه کپچاها میتونن متنوع تر باشن.
  •  فایل چهارم (فونت مورد نیاز برای ساخت کپچا) :
در واقع فایل چهارم همون فونتی هست که در کپچای ساخته شده استفاده میشه.
کدهای پروژه:
  • فایل اول (Captcha_generator.php) :
کد php:
<?php

function warpedCaptcha($text)
{
   
/*
  this function takes the original captcha text and shuffles
    the vowels + y around in order to deliver more variable 
    captcha text
   */
  
if (rand(06)) return $text;
   
//only parttime warping
  
$ltrs = array(
    
'b' => 'b''c' => 'c''d' => 'd''f' => 'f''g' => 'g''h' => 'h''j' => 'j',
    
'k' => 'k''l' => 'l''m' => 'm''n' => 'n''p' => 'p''q' => 'q''r' => 'r',
    
's' => 's''t' => 't''v' => 'v''w' => 'w''x' => 'x''z' => 'z'
  
);

  
$vkeys $vltrs explode(',''a,e,i,o,u,y');
  
shuffle($vkeys);
  
$vowels = array();
  foreach (
$vkeys as $ndx => $vkey$vowels[$vkey] = $vltrs[$ndx];
  
//the vowels + y are now jumbled up

  
$ltrs array_merge($ltrs$vowels);
  
//full associative array of alphabet with randomized vowels + y
  
$text str_split($text);

  
$captcha '';
  foreach (
$text as $txt$captcha .= $ltrs[$txt];
  return 
$captcha;
}
 
 
/*
  xsixlw.txt is a long string of 6 letter words concatenated together.
  We pick a word at random from this text
 */
$fp fopen('xsixlw.txt'"r");
$count filesize('xsixlw.txt') / 1;
$pos rand(0$count);
fseek($fp$pos);
$captcha warpedCaptcha(trim(fread($fp6)));
fclose($fp);



session_start();
$_SESSION['captcha'] = $captcha;
 
//store the captcha to check later once the user has solved it
session_write_close();

$im imagecreatetruecolor(20070);//200 x 70 pixel image
$black imagecolorallocate($im000);
imagecolortransparent($im$black);//give it a black background

switch (rand(04)) {
  case 
0:
    
$color imagecolorallocate($im3415591);
    break;
  case 
1:
    
$color imagecolorallocate($im2332674);
    break;
  case 
2:
    
$color imagecolorallocate($im23326195);
    break;
  case 
3:
    
$color imagecolorallocate($im24417819);
    break;
  case 
4:
    
$color imagecolorallocate($im53125199);
    break;

 
//pick a random color for the text

$x 20;
$y 47;//the starting position for drawing
for ($i 0$i 6$i++) {
  
$angle rand(-88) + rand(09) / 10;
  
$fontsize rand(2232);//pick a random font size
  
$letter substr($captcha$i1);
  
$coords imagettftext($im$fontsize$angle$x$y$color'oldsans.ttf'$letter);
  
//draw each letter
  
$x += ($coords[2] - $x) + 1;
}


header('Content-type:image/png');
imagepng($im);
imagedestroy($im);
?>
دقت کنین که برای نمایش تصویر کپچا توی پروژه تون باید با استفاده از پلاگین iframe لینک این فایل رو بهش مسیر بدین و بعد میتونین تصویر کپچا رو نمایش بدین.
  • فایل دوم (captcha_check.php):
کد php:
<?php
 session_start
();
     if(
$_SESSION['captcha'] == $_GET['captcha_id']){
// اگر کپچا درست بود پیغام زیر را نمایش بده
         
echo "Correct!";
// در غیر اینصورت
     
}else{
// پیغام زیر را نمایش بده 
         
echo "Captcha Isn't Correct";
     }
?>
آدرس ریکوئست برای چک کردن کپچا به این فایل باید به این شکل باشه:
کد:
http://yourhost.com/captcha_check.php?captcha_id=x
به جای عبارت x باید همون مقداری که کاربر وارد کرده رو قرار بدین تا اعتبارسنجی بشه که کاربر تونسته کپچا رو درست وارد کنه و یا خیر. در ضمن این کد دو خروجی داره. در صورتی که کپچا درست باشه عبارت "Correct!" و در صورت اشتباه بودن کپچا وارد شده عبارت "Captcha Isn`t Correct" نمایش داده میشه.
  • فایـل سوم یا فایل دیکشنری (xsixlw.txt):
کد:
abductabjureablestaboundabsurdabusedabuseracetylacquitacuityaculeiacumenacuteradieuxadjoinadjureadjustadventadverbadvertadviceadviseafieldagnizeagonicaguishakimboalbinoalbitealcovealexinalgoidalinedalmondalmostambushamebicamidstampuleamuletamusedanemicanodicanomicanomieanthemantheranyhowapercuapliteaplombarchedarcingardentargentarguedargufyargylearisenarmingarmletaroundarousearpentartfulashoreaspectaspireatonicatopicaudileaukletauntieauthorautismavouchavowedaweighawhilebackedbadgerbadmenbagmenbagniobailedbaitedbalingbalkedbangedbangerbanglebankerbanterbardicbargedbaringbaritebarmenbarongbaronybarquebaryonbastedbatingbatmenbawdrybeachybeaconbecalmbeduinbefoulbehalfbelugaberlinbestirbewailbezoarbickerbifoldbiformbijouxbilkedbinderbingedbiopsybirledbishopbisquebisterbistreblanchblaredblearyblightblimeyblockyblondeblotchblousebluingbluishboatedboaterbodicebodilybolidebonkedborealbosketbotanybotchybotflyboughtbounceboursebousedbowfinbowingbowledbowlerbowmanboxcarboxfulboxierbranchbrandybrazenbrazilbreachbridlebrightbrionybroachbromicbronzebrunchbrunetbugledbuglerbulgedbumpedbumperbunglebunkedbunkerbuoyedburdenburgleburialburiedburledburleyburnedbursaebursalbusiedbusierbusilybusingbustedbusterbustlebuyingbylinebypathbyzantcabmencadentcagiercagilycajolecakingcaliphcalkedcalkincalmedcalmercambercampedcampercandlecandorcanfulcantedcantercantlecapsidcaptorcarkedcarpedcarpelcarpetcartelcartoncarvedcaseincaserncashedcasquecastercationcatkincaudexcausedcavingcavitycavortcawingcedingcentraceringceriumcervixcesiumchafedchaferchaisechaletchalkychantychapelchastechawedchertycherubchiasmchiderchimedchintzchiselchokedchokerchoralchosenchouseciphercirqueclamorclauseclimaxcliqueclonedcloserclosetclotheclovencloverclumsycoarsecoatedcobnutcodgercodifycodingcogentcoheircoignecoiledcoinedcoinercoltercombatcombedcombercomfitcomingcomitycompelcomplyconfabconsulcopiedcopiercoptercopulacoquetcoringcoriumcorkedcornetcorsetcortexcoshercosiercosilycostalcostedcostlycougarcoursecousincowagecowardcowpeacowriecoxingcoyestcoziercranedcratedcravencrawlycreamycresolcrikeycringecrispycrowedcruisecrumbycrustycubingcubismcubistcudgelcurfewcuriaecuringcursedcurvedcurvetcustomcutelycutlercymosedacoitdactyldafterdaftlydaimondaintydamseldamsondancerdankerdaphnedarklydasherdauberdazingdeacondeaflydearlydebarkdecampdeformdefraydehorndepartdepictdeploydeputyderaildesaltdescrydespotdetachdetaildetaindevourdevoutdiaperdiatomdickerdickeydictumdilatedimpledinghydingledirectdirestdisarmdisbardismaydisowndispeldivertdivestdoabledockerdocketdolmandolmendonatedonkeydorsaldoubledoublydourlydownerdowserdozierdozingdrablydrachmdragondreamtdreamydrenchdriveldrivendrowsedumberdumblydupingduplexdusterdyeingearthyearwigeatingeclairembankembarkembryoemployencystenglutengramenlistenmityenoughenrichentailentombentrapenwrapeponymequityerbiumeringoersatzeryngoescrowescudoetymonfabricfacingfactorfailedfakeryfakingfalserfalterfamilyfaminefaringfastedfastenfealtyfeatlyferialfervidfetingfetishfibulafidgetfigurefilmedfinderfinelyfineryfinestfinkedfirmlyfiscalfishedfixateflakedflaredflashyflawedflaxenflayedflexorflintyfloretfloridflorinflowerfluentflunkyflutedflyingfoemanfoetalfoetidfoiblefoiledfoliumfolksyfomentforbadforbidforcedforestforgedformalformatformedfoulerfourthfoxingfrenchfridgefriendfringefringyfriskyfrolicfrowsyfrowzyfrozenfrugalfryingfucoidfulcrafulmarfumblefumingfunkedfusiongadflygainlygaitedgaitergaloregaloshgamiergaminegandergarishgarlicgarnetgashedgasmengaspedgauchegauchogawkedgawpedgazumpgenialgentlygerbilgerundgiftedgildergirtedglazedglazerglitchglitzyglowergluteiglutengnomicgoitergoitregoldengomutigorilygourdegracedgrainygravelgravengreasygripedgrivetgrousegrovelguitarguldengulfedgushedgusherhackerhacklehadinghagbuthairdohairedhalitehaltedhalterhalvedhamperhangedhangerhankerhankiehaptichardenharkedharkenharmedhaslethaspedhatinghatpinhavinghawserhayingheartyhectorheliacheliumherbalhermitherniahewinghickeyhijackhingedhintedhoarsehoaxedhoaxerhockeyhoeingholingholismhomagehombrehomelyhonesthoniedhopinghornedhornethorsedhostedhostelhotbedhourlyhousedhowledhowlerhoydenhugesthumanehuntedhunterhurdlehurledhurtlehuskedhuskerhybridhydrichymnedhypingiceboximagedimbrueimbuedimpactimpaleimportimposeinbredincomeinduceinfamyinfectinforminfuseingestinhumeinjectinjureinjuryinroadinrushinsoleinstalintakeinvertinvestinvokeislandisobarjabirujadingjalopyjarfuljargonjawingjerboajewingjigsawjiltedjinxedjockeyjoinedjoinerjouncejoyfuljoyingjuicedjuicerjumpedjumperjunglejunkiejustlykaiserkarmickayoedkeyingkeypadkiboshkidnapkidneykinderkindlekirschkitschkludgeknightkorunalackeylagunelamestlaminglancedlancerlancetlapdoglapsedlarkedlashedlatishlawmenlawyerlaxestlaxitylazierlazinglearntlectorlegacylegatolemonylevitylichenligatelimpetlingamlingerlingualiquorlispedlitanylitherlizardloaderlobatelockerlocketlodgerloftedloiterlongedlongerloquatlosingloungelovagelowinglucentlucernlumpedlumpenlumperlunacylupinelustedlusterlyratelysinemaculemagnetmagpiemaigremailedmailermakingmaltedmangermangeymanglemanquemantlemanuremarblemarcelmarkedmarketmarledmarshymartenmashedmashermashiemastedmatrixmatronmauledmazingmeanlymeaslymedflymedialmedianmedickmedlarmedusamensalmescalmetingmetricmightymildermildewmilordmincedmincerminderminutemiscuemislaymisledmistedmistermobilemockedmodifymodishmodulemoietymoiledmoltedmoltenmongermoniedmopingmorbidmorgenmorselmortalmosquemostlymotivemotleymousedmouthymovingmuckedmucklemueslimuscatmusclemusingmuskegmusketmustermyopiamyopicmyselfmysticmythicnailernamelynativenautchneatlynebulanicetynichednickednickelnimblenoisednosiernosilynougatnoughtnowisenucleinuditynursednutmegnutriaoaringoblateobligeobtundobtuseoctaveoilmanoilmenoldisholefinonageropiateopinedoptimaoptingoratedordainordealorgasmornateoscineospreyostealoustedousteroutageoutbidoutlayoutvieovularowlishoxtailoxygenpacingpackedpackerpacketpainedpairedpalestpalingpalishpalmedpalmerpanderpanditpantedpantryparcelpardonparentpargetparingparishparityparleyparodyparoleparsonpartedpastedpastelpatchypatrolpatronpausedpawingpawnedpeachypectinpedantpelotapencilpenialpentadpenultpenurypermitpetrolphasedphasicphlegmphloemphobiaphobicphoticpickedpigeonpilosepinealpingedpinkedpinkerpintlepioletpiratepitchypithedplagueplaguyplanedplanerplatedplatenpleachpliantploughploverplungepockedpocketpoetrypokierpolicepolicypolingpolishpomaceponderporingposeurposherposhlypostalpostedposterpotagepotfulpotmanpouncepratedprecutprefabpremixprestopricedpriceyprimalprimedprivetprizedprobedprolixprosedprovenpryingpseudopumicepunchypurdahpurifypurinepurismpursedputschpyknicpyritequaintquakedquartoquenchquiverqwertyracilyracketradomerailedrainedrakingrakishramjetrancidrandomrankleranklyransomrantedrasingraspedratifyratingrationravineravingravishrawestrazingrealtyreasonrebindrecantrecastreckonrecoilrectumrefundregainregionrehungrelaidrelishreloadremandremindremudarentalrepandrepastreplayretoldrevamprewindrheumyrhinalrhymedriboserickedriftedrinsedriotedrisqueritualroamedrobustrockedroguedrompedrondelropilyropingroquetrotundroublerousedroutedrowingruckedrucklerulingrumplerundlerupiahrushedsachemsachetsacrumsafelysafetysagelysailedsailorsalmonsaltedsaltersalukisalutesalvedsambursamplesanitysatingsatinysatiresatorisavingsawingsawyerscaledscantyscathescoredscoriascrewyscriptscurvysecantsentrysepticseptumsequinsermonsewingsextonshakenshakershamedshapedshavedshavensherifshiftyshinedshinershivershlockshofarshogunshoredshovedshovelshowedshriekshriftshrikeshroudshroveshrunkshyingsicklesicklysignalsignedsilentsilkensilversimpersimplesimplysinewysinglysinkersintersitcomskatedskatersketchskimpyskivedskiverskyingslangyslatedslaterslayersleazysleighsleuthsliderslightslimedslinkysliverslouchsloughsludgesludgysluicesluingsmiledsmilersmirchsmithysmokedsmokersmudgysmuglysmutchsnaredsneakysnidersnipedsnoredsnuglysoakedsoakersoapedsocagesocialsockedsodiumsoftlysoignesoiledsolemnsolutesolvedsolversorbedsorbetsoughtsourcesovietspacersparedspathesphinxspicedspigotspikedspinelspinetspitedsplinesplintspokenspongespongysportysprawlspreadsproutsprucespumedspunkyspurgesquaresquealstablestakedstamenstarvestavedsteamysternasterolstockystodgestodgystolenstolidstormystrafestrainstrakestrandstreakstreamstrewnstriaestridestripystrivestrobestrodestrokestrovestudiostupidstuporsturdystymiestyraxsubletsubmitsubwaysuckedsuitedsuitorsulkedsulphasultansultrysundaesundersunlitsurelysurtaxsurveyswagedswankyswatheswayedswingyswipedsylvansyntaxtailortalcumtamingtampedtampertampontandemtankedtankertapingtawdryteacupteliumtensortheorythinlytholedthronethrongthymoltickertickletimelytingedtingletinglytinseltiradetoecaptoeingtoiledtoilertoluictonsiltouredtousletowingtoyingtracedtragictrashytraveltrenchtrendytribaltrifletriglytrigontrilbytriodetripletriplytriunetropictroughtroupetrudgetryingtubingtugriktundratupeloturacoturfedturgidturkeytypinguglieruglifyulsterultimaultimoumpireunableunboltuncialuncladunclogundockuneasyunfairungirdunholyunisexunkeptunlaceunlikeunliveunloadunpickunreadunrealunsealunseamunseatunshodunsolduntidyuntiedunveilunwaryunwrapunyokeupcastupheldupholduplinkuploadupmostuproseuptownuraciluranicuremiaurgentursineusablevaguervainervainlyvalisevampedvariedvastervastlyvectorvendorverifyverminvernalvestryvineryvolumevolutevortexvotaryvotingvulgarwaftedwahinewaiterwaivedwaiverwalingwalkedwalkerwalnutwamblewanglewarblewardenwarmlywarmthwarnedwarpedwashedwasherwastedwasterwavilywavingweaklywealthweightweirdowhaledwhalerwhimsywhinedwhinerwhiskywickedwickerwicketwidelywieldywifelywilderwiltedwimblewinderwinerywinkerwinklewinterwisdomwispedwoefulwolfedwonderwontedworsenwraithwrenchwretchwriestwrithewyvernyarestyawnedyawpedyogurtzealotzephyrzincedzinckyzingedzodiaczombiezygotezymasefrayedloversfingerblowerapronshustlemodelsseldomcatsupimpureribaldbridalarmpitimpartinsultportal
  • فایل چهـارم (oldsans.ttf) : 
در واقع این فایل همون فونت مورد نیاز فایل اول هست برای ساخت کپچا که میتونین از اینجا دریافت کنین.

در ضمن من یک مثال هم اینجا ساختم که میتونین تست کنین.

در پایان هم خوش حال میشم که نظراتتون رو اعلام کنین.
15






 
غایب
  پاسخ


 سپاس شده توسط: daiisalman ، oak ، MrAlvand ، amin hosseini


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
  آموزش پروژه محور ساخت بازی مار و پله mohsen_nasri 6 3,807 1403/10/24، 09:38 عصر
آخرین ارسال: Tggi
Star مهم آموزش خروجی اندروید روی سیستم شخصی rezamms 128 86,462 1403/10/23، 04:58 عصر
آخرین ارسال: Tggi
  مهم آموزش تصویری خروجی مستقیم - یکبار برای همیشه! rezamms 33 20,911 1401/2/13، 09:39 عصر
آخرین ارسال: kamran_cn
  خروجی اندرید davinmstr1 2 2,601 1400/8/4، 10:23 عصر
آخرین ارسال: ᔕinaᗪehghani
  AAB (بسته برنامه اندروید) چيست؟ + نحوه خروجي گرفتن در كرودوا ᔕinaᗪehghani 15 8,600 1400/6/21، 01:55 صبح
آخرین ارسال: mehdi1100

پرش به انجمن: