به نام خدا؛
سلام دوستان امیدوارم حـالتون خوب باشه. امروز قصد داریم راجع به استفاده از کپچا (captcha) در پروژه های خودمون صحبت کنیم. اول از همه بد نیست یک توضیحاتی راجع به اینکه کپچا چی هست ارائه بدیم اگرچه بسیاری از دوستان آشنایی کامل با کپچا دارند.
کپچا دقیقاً چیست و به چه دردی میخورد؟
کپچا در واقع یکی از ایده های سرشار آلن تورینگ ریاضیدان و پدر علم رایانه بود که حتماً داستان زندگی اش رو در فیلم بازی تقلید ساخته سال 2014 تماشا کردین. کپچا یک تصویر هست شامل عباراتی مثل حروف و عدد که کاربر با وارد کردن اون عبارات در یک فیلد (تکست باکس) در واقع به ما اثبات میکنه که ربات نیست. ربات ها یا ربات های خزنده وب در واقع نوشته میشن تا به صورت فورانی و بسیار زیاد ریکوئست ارسال کنن تا به طور معمول سرویس رو از کار بندازن و یا برای مقاصد دیگه طراحی میشن. ربات ها قادر به خوندن این تصویر کج و کوله نیستن و هر چقدر که تلاش میکنن تا ریکوئست رو ارسال کنن موفق نمیشن چرا که از عهده وارد کردن کپچا بر نمیان. البته این روزها ربات هایی نوشته شدن که از پس این نوع ابتدایی کپچاها به راحتی بر میان و میتونن اون رو بخونن. پس بهترین گزینه استفاده از reCaptcha گوگل هست که صرفاً به یک آزمون ساده اکتفا نمیکنه و موارد دیگه ای رو هم در نظر میگیره.
شما میتونین برای جلوگیری از فعالیت ربات ها یا در کل ارسال فورانی و شدید ریکوئست ها به جای کپچا از ساز و کارهای دیگه و ابتکاری استفاده کنین. مثلاً بگین کاربر حاصلضرب دو عدد رو بنویسه تا ثابت بشه ربات نیست و یا.... که به ابتکار شما بستگی داره. من توی این آموزش در واقع تمرکزم روی مقوله کپچا اونم ساده ترین نوعش هست. من با استفاده از زبان php و البته استفاده از سشن ها در این زبان این پروژه رو پیاده سازی کردم. دقت کنین که بهتره این پروژه رو روی لوکال هاست اجرا نکنین چون ممکنه تصویر کپچا رو دریافت نکنین!
توضیحـات پروژه:
من توی این پروژه چهـارتا تا فایل دارم که کارایی هر کدوم رو شرح میدم.
اما در ساخت این دیکشنری یک اصل در مبحث ترکیبات ریاضیات به نام جایگشت ممکنه به کارتون بیاد. فرض کنین میخوایم سه حرف abc رو کنار هم بچینیم. به چند حالت این کار ممکنه؟ جایگشت پاسخ سوال رو میده و میگه 3!=6 حالت ممکنه. پس حالا میتونیم راحت تر درک کنیم که هر چی دیکشنری جامع تر باشه کپچاها میتونن متنوع تر باشن.
کدهای پروژه:دقت کنین که برای نمایش تصویر کپچا توی پروژه تون باید با استفاده از پلاگین iframe لینک این فایل رو بهش مسیر بدین و بعد میتونین تصویر کپچا رو نمایش بدین.آدرس ریکوئست برای چک کردن کپچا به این فایل باید به این شکل باشه:به جای عبارت x باید همون مقداری که کاربر وارد کرده رو قرار بدین تا اعتبارسنجی بشه که کاربر تونسته کپچا رو درست وارد کنه و یا خیر. در ضمن این کد دو خروجی داره. در صورتی که کپچا درست باشه عبارت "Correct!" و در صورت اشتباه بودن کپچا وارد شده عبارت "Captcha Isn`t Correct" نمایش داده میشه.
در ضمن من یک مثال هم اینجا ساختم که میتونین تست کنین.
در پایان هم خوش حال میشم که نظراتتون رو اعلام کنین.
سلام دوستان امیدوارم حـالتون خوب باشه. امروز قصد داریم راجع به استفاده از کپچا (captcha) در پروژه های خودمون صحبت کنیم. اول از همه بد نیست یک توضیحاتی راجع به اینکه کپچا چی هست ارائه بدیم اگرچه بسیاری از دوستان آشنایی کامل با کپچا دارند.
کپچا دقیقاً چیست و به چه دردی میخورد؟
کپچا در واقع یکی از ایده های سرشار آلن تورینگ ریاضیدان و پدر علم رایانه بود که حتماً داستان زندگی اش رو در فیلم بازی تقلید ساخته سال 2014 تماشا کردین. کپچا یک تصویر هست شامل عباراتی مثل حروف و عدد که کاربر با وارد کردن اون عبارات در یک فیلد (تکست باکس) در واقع به ما اثبات میکنه که ربات نیست. ربات ها یا ربات های خزنده وب در واقع نوشته میشن تا به صورت فورانی و بسیار زیاد ریکوئست ارسال کنن تا به طور معمول سرویس رو از کار بندازن و یا برای مقاصد دیگه طراحی میشن. ربات ها قادر به خوندن این تصویر کج و کوله نیستن و هر چقدر که تلاش میکنن تا ریکوئست رو ارسال کنن موفق نمیشن چرا که از عهده وارد کردن کپچا بر نمیان. البته این روزها ربات هایی نوشته شدن که از پس این نوع ابتدایی کپچاها به راحتی بر میان و میتونن اون رو بخونن. پس بهترین گزینه استفاده از reCaptcha گوگل هست که صرفاً به یک آزمون ساده اکتفا نمیکنه و موارد دیگه ای رو هم در نظر میگیره.
شما میتونین برای جلوگیری از فعالیت ربات ها یا در کل ارسال فورانی و شدید ریکوئست ها به جای کپچا از ساز و کارهای دیگه و ابتکاری استفاده کنین. مثلاً بگین کاربر حاصلضرب دو عدد رو بنویسه تا ثابت بشه ربات نیست و یا.... که به ابتکار شما بستگی داره. من توی این آموزش در واقع تمرکزم روی مقوله کپچا اونم ساده ترین نوعش هست. من با استفاده از زبان 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 (5 > rand(0, 6)) 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') / 6 - 1;
$pos = 6 * rand(0, $count);
fseek($fp, $pos);
$captcha = warpedCaptcha(trim(fread($fp, 6)));
fclose($fp);
session_start();
$_SESSION['captcha'] = $captcha;
//store the captcha to check later once the user has solved it
session_write_close();
$im = imagecreatetruecolor(200, 70);//200 x 70 pixel image
$black = imagecolorallocate($im, 0, 0, 0);
imagecolortransparent($im, $black);//give it a black background
switch (rand(0, 4)) {
case 0:
$color = imagecolorallocate($im, 34, 155, 91);
break;
case 1:
$color = imagecolorallocate($im, 233, 26, 74);
break;
case 2:
$color = imagecolorallocate($im, 233, 26, 195);
break;
case 3:
$color = imagecolorallocate($im, 244, 178, 19);
break;
case 4:
$color = imagecolorallocate($im, 53, 125, 199);
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(-8, 8) + rand(0, 9) / 10;
$fontsize = rand(22, 32);//pick a random font size
$letter = substr($captcha, $i, 1);
$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);
?>
- فایل دوم (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
- فایـل سوم یا فایل دیکشنری (xsixlw.txt):
کد:
abductabjureablestaboundabsurdabusedabuseracetylacquitacuityaculeiacumenacuteradieuxadjoinadjureadjustadventadverbadvertadviceadviseafieldagnizeagonicaguishakimboalbinoalbitealcovealexinalgoidalinedalmondalmostambushamebicamidstampuleamuletamusedanemicanodicanomicanomieanthemantheranyhowapercuapliteaplombarchedarcingardentargentarguedargufyargylearisenarmingarmletaroundarousearpentartfulashoreaspectaspireatonicatopicaudileaukletauntieauthorautismavouchavowedaweighawhilebackedbadgerbadmenbagmenbagniobailedbaitedbalingbalkedbangedbangerbanglebankerbanterbardicbargedbaringbaritebarmenbarongbaronybarquebaryonbastedbatingbatmenbawdrybeachybeaconbecalmbeduinbefoulbehalfbelugaberlinbestirbewailbezoarbickerbifoldbiformbijouxbilkedbinderbingedbiopsybirledbishopbisquebisterbistreblanchblaredblearyblightblimeyblockyblondeblotchblousebluingbluishboatedboaterbodicebodilybolidebonkedborealbosketbotanybotchybotflyboughtbounceboursebousedbowfinbowingbowledbowlerbowmanboxcarboxfulboxierbranchbrandybrazenbrazilbreachbridlebrightbrionybroachbromicbronzebrunchbrunetbugledbuglerbulgedbumpedbumperbunglebunkedbunkerbuoyedburdenburgleburialburiedburledburleyburnedbursaebursalbusiedbusierbusilybusingbustedbusterbustlebuyingbylinebypathbyzantcabmencadentcagiercagilycajolecakingcaliphcalkedcalkincalmedcalmercambercampedcampercandlecandorcanfulcantedcantercantlecapsidcaptorcarkedcarpedcarpelcarpetcartelcartoncarvedcaseincaserncashedcasquecastercationcatkincaudexcausedcavingcavitycavortcawingcedingcentraceringceriumcervixcesiumchafedchaferchaisechaletchalkychantychapelchastechawedchertycherubchiasmchiderchimedchintzchiselchokedchokerchoralchosenchouseciphercirqueclamorclauseclimaxcliqueclonedcloserclosetclotheclovencloverclumsycoarsecoatedcobnutcodgercodifycodingcogentcoheircoignecoiledcoinedcoinercoltercombatcombedcombercomfitcomingcomitycompelcomplyconfabconsulcopiedcopiercoptercopulacoquetcoringcoriumcorkedcornetcorsetcortexcoshercosiercosilycostalcostedcostlycougarcoursecousincowagecowardcowpeacowriecoxingcoyestcoziercranedcratedcravencrawlycreamycresolcrikeycringecrispycrowedcruisecrumbycrustycubingcubismcubistcudgelcurfewcuriaecuringcursedcurvedcurvetcustomcutelycutlercymosedacoitdactyldafterdaftlydaimondaintydamseldamsondancerdankerdaphnedarklydasherdauberdazingdeacondeaflydearlydebarkdecampdeformdefraydehorndepartdepictdeploydeputyderaildesaltdescrydespotdetachdetaildetaindevourdevoutdiaperdiatomdickerdickeydictumdilatedimpledinghydingledirectdirestdisarmdisbardismaydisowndispeldivertdivestdoabledockerdocketdolmandolmendonatedonkeydorsaldoubledoublydourlydownerdowserdozierdozingdrablydrachmdragondreamtdreamydrenchdriveldrivendrowsedumberdumblydupingduplexdusterdyeingearthyearwigeatingeclairembankembarkembryoemployencystenglutengramenlistenmityenoughenrichentailentombentrapenwrapeponymequityerbiumeringoersatzeryngoescrowescudoetymonfabricfacingfactorfailedfakeryfakingfalserfalterfamilyfaminefaringfastedfastenfealtyfeatlyferialfervidfetingfetishfibulafidgetfigurefilmedfinderfinelyfineryfinestfinkedfirmlyfiscalfishedfixateflakedflaredflashyflawedflaxenflayedflexorflintyfloretfloridflorinflowerfluentflunkyflutedflyingfoemanfoetalfoetidfoiblefoiledfoliumfolksyfomentforbadforbidforcedforestforgedformalformatformedfoulerfourthfoxingfrenchfridgefriendfringefringyfriskyfrolicfrowsyfrowzyfrozenfrugalfryingfucoidfulcrafulmarfumblefumingfunkedfusiongadflygainlygaitedgaitergaloregaloshgamiergaminegandergarishgarlicgarnetgashedgasmengaspedgauchegauchogawkedgawpedgazumpgenialgentlygerbilgerundgiftedgildergirtedglazedglazerglitchglitzyglowergluteiglutengnomicgoitergoitregoldengomutigorilygourdegracedgrainygravelgravengreasygripedgrivetgrousegrovelguitarguldengulfedgushedgusherhackerhacklehadinghagbuthairdohairedhalitehaltedhalterhalvedhamperhangedhangerhankerhankiehaptichardenharkedharkenharmedhaslethaspedhatinghatpinhavinghawserhayingheartyhectorheliacheliumherbalhermitherniahewinghickeyhijackhingedhintedhoarsehoaxedhoaxerhockeyhoeingholingholismhomagehombrehomelyhonesthoniedhopinghornedhornethorsedhostedhostelhotbedhourlyhousedhowledhowlerhoydenhugesthumanehuntedhunterhurdlehurledhurtlehuskedhuskerhybridhydrichymnedhypingiceboximagedimbrueimbuedimpactimpaleimportimposeinbredincomeinduceinfamyinfectinforminfuseingestinhumeinjectinjureinjuryinroadinrushinsoleinstalintakeinvertinvestinvokeislandisobarjabirujadingjalopyjarfuljargonjawingjerboajewingjigsawjiltedjinxedjockeyjoinedjoinerjouncejoyfuljoyingjuicedjuicerjumpedjumperjunglejunkiejustlykaiserkarmickayoedkeyingkeypadkiboshkidnapkidneykinderkindlekirschkitschkludgeknightkorunalackeylagunelamestlaminglancedlancerlancetlapdoglapsedlarkedlashedlatishlawmenlawyerlaxestlaxitylazierlazinglearntlectorlegacylegatolemonylevitylichenligatelimpetlingamlingerlingualiquorlispedlitanylitherlizardloaderlobatelockerlocketlodgerloftedloiterlongedlongerloquatlosingloungelovagelowinglucentlucernlumpedlumpenlumperlunacylupinelustedlusterlyratelysinemaculemagnetmagpiemaigremailedmailermakingmaltedmangermangeymanglemanquemantlemanuremarblemarcelmarkedmarketmarledmarshymartenmashedmashermashiemastedmatrixmatronmauledmazingmeanlymeaslymedflymedialmedianmedickmedlarmedusamensalmescalmetingmetricmightymildermildewmilordmincedmincerminderminutemiscuemislaymisledmistedmistermobilemockedmodifymodishmodulemoietymoiledmoltedmoltenmongermoniedmopingmorbidmorgenmorselmortalmosquemostlymotivemotleymousedmouthymovingmuckedmucklemueslimuscatmusclemusingmuskegmusketmustermyopiamyopicmyselfmysticmythicnailernamelynativenautchneatlynebulanicetynichednickednickelnimblenoisednosiernosilynougatnoughtnowisenucleinuditynursednutmegnutriaoaringoblateobligeobtundobtuseoctaveoilmanoilmenoldisholefinonageropiateopinedoptimaoptingoratedordainordealorgasmornateoscineospreyostealoustedousteroutageoutbidoutlayoutvieovularowlishoxtailoxygenpacingpackedpackerpacketpainedpairedpalestpalingpalishpalmedpalmerpanderpanditpantedpantryparcelpardonparentpargetparingparishparityparleyparodyparoleparsonpartedpastedpastelpatchypatrolpatronpausedpawingpawnedpeachypectinpedantpelotapencilpenialpentadpenultpenurypermitpetrolphasedphasicphlegmphloemphobiaphobicphoticpickedpigeonpilosepinealpingedpinkedpinkerpintlepioletpiratepitchypithedplagueplaguyplanedplanerplatedplatenpleachpliantploughploverplungepockedpocketpoetrypokierpolicepolicypolingpolishpomaceponderporingposeurposherposhlypostalpostedposterpotagepotfulpotmanpouncepratedprecutprefabpremixprestopricedpriceyprimalprimedprivetprizedprobedprolixprosedprovenpryingpseudopumicepunchypurdahpurifypurinepurismpursedputschpyknicpyritequaintquakedquartoquenchquiverqwertyracilyracketradomerailedrainedrakingrakishramjetrancidrandomrankleranklyransomrantedrasingraspedratifyratingrationravineravingravishrawestrazingrealtyreasonrebindrecantrecastreckonrecoilrectumrefundregainregionrehungrelaidrelishreloadremandremindremudarentalrepandrepastreplayretoldrevamprewindrheumyrhinalrhymedriboserickedriftedrinsedriotedrisqueritualroamedrobustrockedroguedrompedrondelropilyropingroquetrotundroublerousedroutedrowingruckedrucklerulingrumplerundlerupiahrushedsachemsachetsacrumsafelysafetysagelysailedsailorsalmonsaltedsaltersalukisalutesalvedsambursamplesanitysatingsatinysatiresatorisavingsawingsawyerscaledscantyscathescoredscoriascrewyscriptscurvysecantsentrysepticseptumsequinsermonsewingsextonshakenshakershamedshapedshavedshavensherifshiftyshinedshinershivershlockshofarshogunshoredshovedshovelshowedshriekshriftshrikeshroudshroveshrunkshyingsicklesicklysignalsignedsilentsilkensilversimpersimplesimplysinewysinglysinkersintersitcomskatedskatersketchskimpyskivedskiverskyingslangyslatedslaterslayersleazysleighsleuthsliderslightslimedslinkysliverslouchsloughsludgesludgysluicesluingsmiledsmilersmirchsmithysmokedsmokersmudgysmuglysmutchsnaredsneakysnidersnipedsnoredsnuglysoakedsoakersoapedsocagesocialsockedsodiumsoftlysoignesoiledsolemnsolutesolvedsolversorbedsorbetsoughtsourcesovietspacersparedspathesphinxspicedspigotspikedspinelspinetspitedsplinesplintspokenspongespongysportysprawlspreadsproutsprucespumedspunkyspurgesquaresquealstablestakedstamenstarvestavedsteamysternasterolstockystodgestodgystolenstolidstormystrafestrainstrakestrandstreakstreamstrewnstriaestridestripystrivestrobestrodestrokestrovestudiostupidstuporsturdystymiestyraxsubletsubmitsubwaysuckedsuitedsuitorsulkedsulphasultansultrysundaesundersunlitsurelysurtaxsurveyswagedswankyswatheswayedswingyswipedsylvansyntaxtailortalcumtamingtampedtampertampontandemtankedtankertapingtawdryteacupteliumtensortheorythinlytholedthronethrongthymoltickertickletimelytingedtingletinglytinseltiradetoecaptoeingtoiledtoilertoluictonsiltouredtousletowingtoyingtracedtragictrashytraveltrenchtrendytribaltrifletriglytrigontrilbytriodetripletriplytriunetropictroughtroupetrudgetryingtubingtugriktundratupeloturacoturfedturgidturkeytypinguglieruglifyulsterultimaultimoumpireunableunboltuncialuncladunclogundockuneasyunfairungirdunholyunisexunkeptunlaceunlikeunliveunloadunpickunreadunrealunsealunseamunseatunshodunsolduntidyuntiedunveilunwaryunwrapunyokeupcastupheldupholduplinkuploadupmostuproseuptownuraciluranicuremiaurgentursineusablevaguervainervainlyvalisevampedvariedvastervastlyvectorvendorverifyverminvernalvestryvineryvolumevolutevortexvotaryvotingvulgarwaftedwahinewaiterwaivedwaiverwalingwalkedwalkerwalnutwamblewanglewarblewardenwarmlywarmthwarnedwarpedwashedwasherwastedwasterwavilywavingweaklywealthweightweirdowhaledwhalerwhimsywhinedwhinerwhiskywickedwickerwicketwidelywieldywifelywilderwiltedwimblewinderwinerywinkerwinklewinterwisdomwispedwoefulwolfedwonderwontedworsenwraithwrenchwretchwriestwrithewyvernyarestyawnedyawpedyogurtzealotzephyrzincedzinckyzingedzodiaczombiezygotezymasefrayedloversfingerblowerapronshustlemodelsseldomcatsupimpureribaldbridalarmpitimpartinsultportal
- فایل چهـارم (oldsans.ttf) :
در ضمن من یک مثال هم اینجا ساختم که میتونین تست کنین.
در پایان هم خوش حال میشم که نظراتتون رو اعلام کنین.
