PDA

View Full Version : آموزش: کدنویسی و ساخت CAPTCHA به همراه Audio



LORD AELX
شنبه 19 تیر 1389, 13:12 عصر
معمولا تو سایت های فارسی زبان در این مورد زیاد صحبت نشده و آن جاهایی هم که آموزش داده شده، اغلب موضوع را پیچیده و غیر قابل هضم کرده اند. در حالت کلی برنامه نویسان وب نیاز به آشنایی با کد تولید کننده تصویر و صدای CAPTCHA ندارند و فقط باید نحوه استفاده از کتابخانه موجود را بدانند تا در فرم های خود و برای Authorization از آن استفاده کنند. در مرحله بعدی برای دستکاری های لازم و یا بالا بردن ضریب امینتی تصاویر، می توانند با نحوه نوشتن کد آن از ابتدا و یا دستکاری کدهای موجود آشنا گردند.

در این سری آموزش ها قصد داریم تمام موارد یاد شده را با مثال های عملی و کاربردی توضیح دهیم و پله پله به پیش برویم.

خوب، برای شروع قصد دارم استفاده از کتابخانه PhpCaptcha را آموزش داده و علاوه بر آن نحوه دستکاری تصاویر ساخته شده و نیز اضافه کردن Audio CAPTCHA را توضیح دهم.

http://www.irupload.ir/images/zlgzl06w84kpi6l7waha.jpg

- مرحله اول: فایل کتابخانه php-captcha.inc.php را از لینک زیر دانلود کنید:

http://www.ejeliot.com/samples/php-captcha/download.php- مرحله دوم: فایل دانلود شده را به پوشه سایت خود انتقال داده و سپس دو فایل با نام های visual-captcha.php و audio-captcha.php اضافه کرده و کد های زیر را در آن ها بنویسید:



فایل visual-captcha.php:



<?php
require('php-captcha.inc.php');
$aFonts = array('fonts/VeraBd.ttf', 'fonts/VeraIt.ttf', 'fonts/Vera.ttf');
$oVisualCaptcha = new PhpCaptcha($aFonts, 200, 60);
$oVisualCaptcha->Create();
?>


فایل audio-captcha.php:



<?php
require('php-captcha.inc.php');
$oAudioCaptcha = new AudioPhpCaptcha('/usr/bin/flite', '/tmp/');
$oAudioCaptcha->Create();
?>
این دو فایل وظیفه ساختن تصویر و صدای CAPTCHA را بر عهده دارند. پوشه ای با نام fonts ایجاد کنید و چند font (انگلیسی) در آن قرار دهید. سپس مقادیر موجود در آرایه aFonts$ فایل visual-captcha.php را با فونت های خود، تغییر دهید. برای تولید صدا نیز از انجین Flite استفاده کنید. می توانید آن را از لینک زیر دانلود کرده و در وب سرور نصب کنید:

http://www.speech.cs.cmu.edu/flite/محل نصب انجین را می بایست در فایل audio-captcha.php ادیت کنید. (usr/bin/flite/)

تنها چیزی که باقی مانده، اضافه کردن کد CAPTCHA به فرم است. پس از اینکه فرم مورد نظر رو طراحی کردید، ما به 4 خط کد اضافی نیاز داریم:

1. کد تصویر CAPTCHA


<img src="visual-captcha.php" width="200" height="60" alt="Visual CAPTCHA" />
2. کد صدای CAPTCHA


<a href="audio-captcha.php">Can't see the image? Click for audible version</a>
3. کد TextBox مربوط به CAPTCHA


<input type="text" name="user_code" size="20">
4. کد پردازش صحت ورود داده توسط کاربر با PHP


<?php
require('php-captcha.inc.php');
if (PhpCaptcha::Validate($_POST['user_code'])) {
echo 'Valid code entered';
} else {
echo 'Invalid code entered';
}
?>
همین! :لبخندساده: CAPTCHA شما آماده استفاده است. آن را امتحان کنید!

حال اجازه دهید کمی این تصویر را دستکاری کنیم... :متفکر: بدیهی است که تمام تغییرات مورد نیاز خود را باید در فایل visual-captcha.php و قبل از کد ;()$oVisualCaptcha->Create اعمال کنیم. اولین تغییر رو هدیه می دهم به تمام دوستداران Copyright!! :لبخند: با اضافه کردن کد زیر، می توانید یک منبع برای کد خود ایجاد کنید:

http://www.irupload.ir/images/5bkxvtuog1kpktw8yqq1.jpg


$oVisualCaptcha->SetOwnerText('Source: www.barnamenevis.com');حالا بیایید برای کاراکترها سایه ایجاد کنیم:

http://www.irupload.ir/images/ufuggn2wsjnwvbuywq68.jpg


$oVisualCaptcha->DisplayShadow(true);حال میخواهیم از تصویر Background مشخصی استفاده شود، یک پوشه به نام images ساخته و تصویر مورد نظر خود را در آن قرار دهید (معمولا background های 100x100 استفاده می شود و ضمنا در مورد این کتابخانه فقط باید از تصاویر نوع JPG استفاده شود)، حال کد زیر را اضافه کنید:

http://www.irupload.ir/images/x2xaf9h2iyhiq9cjftl.jpg


$oVisualCaptcha->SetBackgroundImages('images/captcha.jpg');خوب، حالا دوست دارید نوشته های موجود در تصویر رنگی شوند؟! کافی است کد زیر را اضافه کنید:

http://www.irupload.ir/images/38krl5bv6y8izzfdikx7.jpg


$oVisualCaptcha->UseColour(true);خوب، اینم از تغییراتی که میشد ایجاد کرد. نکته قابل توجه اینجاست که شما می توانید این تغییرات را با هم ادغام کنید (با تولید یک عدد تصادفی و نوشتن کدی برای انتخاب بین روش های موجود و ...) و تصاویری با تنوع بیشتر و پیچیده تر تولید کنید.

به زودی نوشتن کد CAPTCHA رو از اول براتون توضیح می دهم.

موفق باشید :قلب:

ramtin-w
شنبه 19 تیر 1389, 21:38 عصر
ممنون رفیق خیلی به کارم اومد این چیزا رو فقط اینجا می شه پیدا کرد این کد رو گذاشتم تو سایتم
ممنون

LORD AELX
شنبه 19 تیر 1389, 22:11 عصر
فقط می خواستم تمام Option های موجود برای تغییر CAPTCHA رو براتون لیست کنم:

عرض تصویر:

SetWidth(int iWidth)طول تصویر:

SetHeight(int iHeight)تعداد کاراکترهای استفاده شده:

SetNumChars(int iNumChars)تعداد سطر های به کار رفته:

SetNumLines(int iNumLines)وجود یا عدم وجود سایه برای کاراکترها:

DisplayShadow(bool bShadow)اضافه کردن نام سازنده در پایین تصویر:

SetOwnerText(sting sOwnerText)تعیین کاراکترهای مجاز برای استفاده در تصویر:

SetCharSet(variant vCharSet)*توضیح: در حالت default کاراکترهای A-Z به کار برده می شوند. می توانید آن را با یک آرایه (همانند ('array('1', 'G', '3 ) یا range کاراکترها (همانند 'a-z,A-Z,0,3,7') مقدار دهی کنید.

حساس بودن یا حساس نبودن به بزرگی و کوچکی کاراکترها:

CaseInsensitive(bool bCaseInsensitive)استفاده از background های انتخابی:

SetBackgroundImages(variant vBackgroundImages)*توضیح: می توانید از رشته حاوی آدرس فایل تصویر پس زمینه یا آرایه ای از آدرس فایل های پس زمینه برای مقدار دهی استفاده کنید.

تعیین حداقل اندازه فونت ها:

SetMinFontSize(int iMinFontSize)تعیین حداکثر اندازه فونت ها:

SetMaxFontSize(int iMaxFontSize)استفاده یا عدم استفاده از رنگ برای کاراکترها:

UseColour(bool bUseColour)تعیین نوع فایل خروجی CAPTCHAا:

SetFileType(string sFileType)*توضیح: حالت default نوع JPEG می باشد. علاوه بر آن می توانید از انواع GIF یا PNG نیز استفاده کنید.

** از تمام option های فوق می توانید قبل از متد ()Create استفاده کنید.

funpatogh
شنبه 19 تیر 1389, 22:27 عصر
آقا من نفهمیدم که توی این سایت http://www.speech.cs.cmu.edu/flite/
چی رو باید دانلود کنم ؟
منظورتون اون فایل .ps هست؟

LORD AELX
شنبه 19 تیر 1389, 23:44 عصر
آقا من نفهمیدم که توی این سایت http://www.speech.cs.cmu.edu/flite/
چی رو باید دانلود کنم ؟
منظورتون اون فایل .ps هست؟

شما باید پس از ورود به بخش Source آخرین ورژن برنامه رو انتخاب کنید و فایل release که حاوی سورس کد هست رو دانلود کرده و سپس آن را نصب کنید (و یا فایل باینری را دریافت کنید). برای این کار می توانید از آموزش نصبی که در سایت آن ارایه شده، کمک بگیرید: http://www.speech.cs.cmu.edu/flite/doc/flite_4.html#SEC4

LORD AELX
سه شنبه 22 تیر 1389, 18:22 عصر
خوب پس از آشنایی با به کار گیری CAPTCHA بهتره نحوه نوشتن کدش رو هم یاد بگیرید. در این پست میخوام نحوه کد نویسی CAPTCHA رو توضیح بدهم.

* توضیح در مورد هک ها (Hacks) : من در ابتدا اسکریپت CAPTCHA از قبل نوشته شده خود را توضیح می دهم، سپس در "هک" هایی که ارایه می دهم تغییراتی را که به نظرم می رسد و می توان اعمال کرد را می نویسم. در آینده و پس از آموزش این اسکریپت تمام این هک ها را بصورت داخلی در اسکریپت اعمال خواهم کرد و در همین تاپیک share می کنم.

خوب در اینجا ما به سه فایل برای تولید CAPTCHA نیاز داریم:


captcha_config.php
captcha_code.php
captcha_lib.php

در فایل config متغیرهای تنظیم کننده کد CAPTCAH را قرار می دهیم. همانند size و تعداد کاراکترها و نوع background و ... . فایل code، وظیفه پردازش تصویر و خروجی را انجام خواهد داد و فایل lib هم وظیفه تولید کاراکترهای کد CAPTCHA و نیز تعیین صحت ورود آن، را بر عهده دارد. این فایل ها وظیفه تولید CAPTCHA را بر عهده داشتند. علاوه بر این ها ما به یک فایل حاوی فرم (فرم login یا register یا comment یا ...) هم نیاز داریم (در اینجا نام آن را index.php می گذاریم).

همچنین ما به تعدادی فونت TrueType و همچنین تعدادی عکس برای background نیاز داریم که به ترتیب در فولدر های fonts و backgrounds قرار می گیرند. (این دو فولدر پیوست شده اند.)

خوب حالا می رویم سراغ کد نویسی... :متفکر:

ابتدا اجازه دهید فایل index.php را آماده کنیم:



<?php
if(isset($_REQUEST["submit"]) && $_REQUEST["fullname"]!="" && $_REQUEST["message"]!="" && $_REQUEST["code"]!="") {
include('captcha_lib.php');
$Turing_code = $_REQUEST["Turing"];
if ( CheckCaptcha($Turing_code) != 1 )
{
echo "<b><font color=red>Error!</font></b><br>";
} else {
echo "<b><font color=red>OK!</font></b><br>";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-Type" content="text/html; charset=utf-8">
<title>TEST CAPTCHA</title>
<style type="text/css">
h1 { font: 1.2em Arial, Helvetica, sans-serif; }
.txt { color: #00008B; background-color: #E3F2F7; border: 1px inset #00008B; width: 150px; }
.btn { color: #00008B; background-color: #ADD8E6; border: 1px outset #00008B; }
form p { clear: left; margin: 0; padding: 0; padding-top: 5px; }
form p label { float: left; width: 100px; font: bold 0.9em Arial, Helvetica, sans-serif; }
form p img { margin-left: 100px; }
</style>
</head>
<body>
<h1>Test CAPTCHA Form</h1>
<form method="post" action="<?php print $PHP_SELF?>">
<p>
<label for="fullname">Name:</label>
<input type="text" name="fullname" id="fullname" class="txt" />
</p>
<p>
<label for="message">Message:</label>
<textarea rows="5" cols="20" name="message" class="txt" ></textarea>
</p>
<p>
<label for="captcha">Code:</label>
<input type="text" name="code" id="Turing" class="txt" />
</p>
<p>
<img src="captchac_code.php" id="captcha">
</p>
<p>
<img src="/images/arrow_refresh.png" onclick="document.getElementById('captcha').src = document.getElementById('captcha').src + '?' + (new Date()).getMilliseconds()" align="right">
</p>
<p>
<input type="submit" name="submit" value="Submit" class="btn" />
</p>
</form>
</body>
</html>
خوب توضیحاتی که تو این فایل نیازه بدم، یکی اینه که نام TextBox مربوط به ورود کد رو Turing گذاشتم و علاوه بر اون از یک تگ img برای تصویر CAPTCHA استفاده کردم و آدرس اونو captcha_code.php قرار دادم (چون خروجی این فایل PHP یک تصویر است). کد زیر هم یک دکمه برای refresh کردن تصویر در اختیار ما میگذاره (آدرس image اون رو باید به یک تصویر مناسب اختصاص بدهید):


<img src="/images/arrow_refresh.png" onclick="document.getElementById('captcha').src = document.getElementById('captcha').src + '?' + (new Date()).getMilliseconds()" align="right">وظیفه کد PHP هم که در بالای صفحه استفاده شده، چک کردن صحت ورودی توسط تابع CheckCaptcha (که بعدا اونو می نویسیم) و نمایش پیغام مناسبه.

خوب حالا بریم سراغ تکمیل اولین فایل، یعنی فایل Config. کد زیر را در فایل captcha_config.php وارد کنید:



$CSize = 0;
$CSizeWidth = 164;
$CSizeHeight = 50;
$CMinSize = 5;
$CMaxSize = 6;
$CBackgroundType = 0;
$CBackgroundFile = 'backgrounds/1.gif';
$CBackgroundFillType = 1;
$CFontUsed = 1;
$CFontURL = 'fonts/font30.ttf';
$FontNo = 34;
$fonts_dir = 'fonts';
$CFontColorType = 1;
$color_text_r = 10;
$color_text_g = 38;
$color_text_b = 140;
$CFontSizeMin = 25;
$CFontSizeMax = 30;
$CFontSizeMin = 25;
$CFontSizeMax = 30;
$CFontRotMin = -15;
$CFontRotMax = 15;
$CFontPadding = 2;
# $output_type='jpeg';
# $output_type='gif';
$output_type='png';
$captcha_type = 1;
میخوام قبل از استفاده از این متغیرها، کاری که قراره انجام بدهند و مقادیری رو که می پذیرند توضیح بدهم. :متفکر:

تنظیمات پس زمینه

خوب، برای متغیر CSize دو مقدار در نظر میگیریم: 0 و 1 . 0 برای حالتی که اندازه تصویر رو خودمون تعیین کنیم و 1 برای حالتی که برنامه خودش بصورت تصادفی (random) یه اندازه برای تصویر انتخاب کنه. در صورتیکه این مقدار صفر باشد، باید اندازه تصویر رو توسط متغیر های CSizeWidth و CSizeHeight بصورت دستی تعیین کنیم (واحد px).
CMinSize و CMaxSize نیز برای تعیین حداقل و حداکثر طول تصویر استفاده می شوند (برنامه بطور تصادفی تعداد کاراکترها را انتخاب می کند).
برای CBackgroundType نیز دو مقدار 0 و 1 در نظر می گیریم: 0 برای اینکه تصویر بصورت تصادفی و توسط خود PHP ساخته شود و 1 برای اینکه از تصاویر موجود در پوشه backgrounds استفاده شود. اگر مقدار آن را 1 تعیین کنید، برنامه از پس زمینه ای که آدرس آن را در متغیر CBackgroundFile تعیین کرده اید (فایلی از نوع GIF یا PNG یا JPEG)، استفاده خواهد کرد.

* هک : همچنین شما می توانید با کمی تغییر در این قسمت، و بطور تصادفی یکی از این حالات را تعیین و همچنین بطور تصادفی یکی از چند تصویر موجود در پوشه backgrounds را انتخاب کنید. (همگی توسط تابع mt_rand خود PHP) همانند کد زیر:



$rand1 = mt_rand(0,1);
$CBackgroundType = $rand1;
if($rand1==0) { $rand2 = mt_rand(1,24); }
$CBackgroundFile = 'images/cbg/'.$rand2.'.gif';
متغیر CBackgroundFillType هم نوع پوشش background را تعیین می کند: 0 برای resize کردن تصویر استفاده شده و 1 برای کاشی کاری تصویر (Tiled).

تنظیمات فونت

CFontUsed تعیین می کند که فونت بصورت تصادفی از پوشه fonts انتخاب شود (مقدار 1) یا اینکه از یک فونت مشخص استفاده کند (مقدار 0). در صورتیکه مقدار آن 0 باشد، باید با مقدار دهی CFontURL آدرس فونت مورد نظر را تعیین کنید.
متغیر FontNo هم تعداد فونت های موجود در پوشه fonts را تعیین می کند. اسامی فونت های موجود در پوشه بصورت fontx.ttf هستند که به جای x شماره فونت قرار میگیرد (در اینجا ما 34 فونت داریم که از font1.ttf تا font34.ttf شماره گذاری شده اند).
متغیر fonts_dir نیز نام (آدرس) پوشه فونت ها را نگه داری می کند.
متغیر CFontColorType چهار مقدار می پذیرد: 1 برای اینکه رنگ کاراکترها بصورت تصادفی انتخاب شود، 2 برای اینکه رنگ کاراکترها سیاه باشد، 3 به منظور سفید بودن کاراکترها و 4 هم برای انتخاب رنگ آن ها بصورت دستی. در صورتیکه گزینه 4 انتخاب شود، باید رنگ مورد نظر را بصورت RGB به متغیرهای color_text_r و color_text_g و color_text_b بدهید.
متغیرهای CFontSizeMin و CFontSizeMax به ترتیب حداقل و حداکثر اندازه فونت کاراکترها را نگه داری می کنند و برنامه بصورت تصادفی یک مقدار بین این دو عدد را به کاراکتر ها نسبت می دهد.

* هک : می توان ترتیبی اتخاذ کرد که هر کاراکتر از تصویر اندازه مجزایی داشته باشد (البته بصورت random) ... این تغییر را باید در فایل code و با کمی دستکاری در قسمت درج کد در تصویر انجام دهیم.

متغیرهای CFontRotMin و CFontRotMax نیز حداقل و حداکثر مقداری را که هر کاراکتر می تواند بچرخد، تعیین می کنند. (واحد درجه)

+ نکته : چرخش از راست به چپ صورت میگیرد. یعنی اگر بالفرض چرخش 90 درجه باشد، و حرف A چرخیده باشد، بالای آن در سمت چپ تصویر و پایین آن در سمت راست آن قرار خواهد گرفت. ضمن اینکه چرخش 15- درجه همانند چرخش 345 درجه عمل می کند و با لحن ساده می توان گفت که 15 درجه از چپ به راست چرخیده است.

متغیر CFontPadding مقدار فضای خالی اطراف هر کاراکتر را مشخص می کند. در صورت منفی بودن مقدار آن، ممکن است برخی از کاراکتر ها روی هم بیفتند. (ممکن است چون مکان خود هر کاراکتر در تصویر مشخص نیست، ولی اگر آن دو در جایی قرار بگیرند که نزدیک هم باشند، با توجه به اینکه فضای خالی اطرافشان منفی است، روی هم می افتند. در صورتیکه صفر یا مثبت می بود، به هیچ وجه این اتفاق نمی افتاد.)
متغیر output_type نیز نوع فایل تصویر خروجی را نگه داری می کند. این مقدار می تواند PNG یا JPEG باشد.

تنظیمات کلی

و در نهایت متغیر captcha_type نیز نوع CAPTCHA را مشخص می کند. (ممکن است شما بخواهید از روش های متفاوتی برای تولید تصاویر استفاده کنید، مخصوصا در حالتی که background رو با خود PHP میسازیم، این کار به چند طریق ممکنه و میشه از انواع گوناگون bg استفاده کرد. مثل پست اول همین تاپیک که bg بصورت خط خطی بود و ...)


خوب حالا می رویم سراغ فایل lib... :متفکر: این فایل وظیفه دارد برای هر کاربر یک Session اختصاص دهد و نیز یک کد تصادفی برای CAPTCHA تولید کند. همچنین چک کردن صحت ورود کد توسط کاربر نیز در این فایل انجام میگیرد. همانطور که قبلا مشاهده کردید، این فایل به صفحه اصلی فرم include می شود. خوب، اینم کد فایل captcha_lib.phpا:



<?php
session_start();
function RandomCode($min,$max)
{
$src = 'abcdefghijkmnpqrstuvwxyz';
$src .= '23456789';
$srclen = strlen($src)-1;
$length = mt_rand($min,$max);
$Code = '';
for($i=0; $i<$length; $i++)
$Code .= substr($src, mt_rand(0, $srclen), 1);
return $Code;
}
function CheckCaptcha($Turing)
{
global $ImageCode;
if ( !isset( $_SESSION['turing_string'] ) ) { $ImageCode = ''; return 1; }
else if ( strtoupper($_SESSION['turing_string']) == strtoupper($Turing) ) { $ImageCode = 'ok'; return 1; }
else { $ImageCode = 'wrong'; return 0; }
}
?>
همانطور که مشاهده می کنید، فایل lib دارای دو function است: RandomCode که کد را تولید می کند و CheckCaptcha که صحت ورود کد را بررسی می کند. RandomCode دو پارامتر می پذیرد: حداقل و حداکثر طول کد.
در تابع RandomCode، متغیر src کاراکترهایی را که قرار است برای تولید کد از آن ها استفاده شود، در خود ذخیره می کند. متغیر srclen نیز طول این رشته را نگه داری می کند. متغیر length نیز بین حداقل و حداکثر کاراکتر های تعیین شده، تعداد تصادفی آن را به دست آورده و در خود ذخیره می کند. سپس برنامه با استفاده از یک حلقه for به تعداد تعیین شده، کاراکتر تصادفی تولید می کند و آن ها را بصورت یک رشته پشت سر هم در متغیر Code ذخیره می کند. و در نهایت مقدار این متغیر برگردانده می شود.

(پرانتز : توجه داشته باشید که فایل captcha_code.php فایل های captchac_config.php (برای مقادیر متغیرهای پیکربندی) و captchac_lib.php (برای استفاده از تابع RandomCode) را در خود include می کند.)

(پرانتز : در پست بعدی خواهید دید که فایل captcha_code.php که در واقع با ورود کاربر به صفحه فرم و توسط تگ img اجرا می شود، یک session به نام turing_string حاوی کد تولید شده، را ذخیره می کند. بعدها این کد توسط تابع CheckCaptcha موجود در فایل captcha_lib.php مورد استفاده قرار میگیرد.)

در تابع CheckCaptcha (که توسط صفحه حاوی فرم و پس از ارسال فرم فراخوانی شده بود) نیز، در صورتیکه session اِ turing_string تعریف شده باشد، مقدار کد وارد شده توسط کاربر با مقدار موجود در session اِ turing_string مقایسه می شود و نتیجه بصورت 1 و 1 بازگردانده می شود. (False و True)


در اینجا برای خالی نبودن عریضه و ناقص نبودن پست، کد فایل captcha_code.php رو هم قرار می دهم، ولی توضیح آن را به پست بعد موکول می کنم.



<?php
include_once('captchac_config.php');
include_once('captchac_lib.php');
session_start();
$turing = RandomCode($CMinSize,$CMaxSize);
$_SESSION['turing_string'] = $turing;
switch ($captcha_type) {
case 1:
if ($CFontUsed == 1 ) {
$fontno = mt_rand(1,34);
$font = $fonts_dir . '/font' . $fontno . '.ttf';
}
else $font = $CFontURL;
$length = strlen($turing);
$data = array();
$image_width = $image_height = 0;
for($i=0; $i<$length; $i++) {
$char = substr($turing, $i, 1);
$size = mt_rand($CFontSizeMin, $CFontSizeMax);
$angle = mt_rand($CFontRotMin, $CFontRotMax);
$bbox = ImageTTFBBox( $size, $angle, $font, $char );
$char_width = max($bbox[2], $bbox[4]) - min($bbox[0], $bbox[6]);
$char_height = max($bbox[1], $bbox[3]) - min($bbox[7], $bbox[5]);
$image_width += $char_width + $CFontPadding;
$image_height = max($image_height, $char_height);
$data[] = array(
'char' => $char,
'size' => $size,
'angle' => $angle,
'height' => $char_height,
'width' => $char_width,
);
}
$x_padding = 12;
if ( $CSize == 1 )
{
$image_width += ($x_padding * 2);
$image_height = ($image_height * 1.5) + 2;
}
else {
$image_width = $CSizeWidth;
$image_height = $CSizeHeight;
}
$im = ImageCreate($image_width, $image_height);
$cs = mt_rand(1,3);
$d1 = $d2 = $d3 = 0;
while ( ($d1<50) AND ($d2<50) AND (d3<50) )
{
$r = mt_rand(200,255);
$g = mt_rand(200,255);
$b = mt_rand(200,255);
$d1 = abs($r-$g);
$d2 = abs($r-$b);
$d3 = abs($g-$b);
}
$color_bg = ImageColorAllocate($im, $r, $g, $b );
$color_border = ImageColorAllocate($im, round($r/2), round($g/2), round($b/2));
$color_line0 = ImageColorAllocate($im, round($r*0.85), round($g*0.85), round($b*0.85) );
$color_elipse0 = ImageColorAllocate($im, round($r*0.95), round($g*0.95), round($b*0.95) );
$color_elipse1 = ImageColorAllocate($im, round($r*0.90), round($g*0.90), round($b*0.90) );
$d1 = mt_rand(0,50);
$d2 = mt_rand(0,50);
$d3 = mt_rand(0,50);
$color_line1 = ImageColorAllocate($im, $r-$d1, $g-$d2, $b-$d3 );
$d1 = $d2 = $d3 = 0;
while ( ($d1<100) AND ($d2<100) AND (d3<100) )
{
$r = mt_rand(0,150);
$g = mt_rand(0,150);
$b = mt_rand(0,150);
$d1 = abs($r-$g);
$d2 = abs($r-$b);
$d3 = abs($g-$b);
}
switch ( $CFontColorType )
{
case 1 : $color_text = ImageColorAllocate($im, $r, $g, $b );
break;
case 2 : $color_text = ImageColorAllocate($im, 0, 0, 0 );
break;
case 3 : $color_text = ImageColorAllocate($im, 255, 255, 255 );
break;
case 4 : $color_text = ImageColorAllocate($im, $color_text_r, $color_text_g, $color_text_b );
break;
}
$noiset = mt_rand(1,2);
if ( $CBackgroundType == 1 )
{
switch ($noiset) {
case '1' :
for($l=0; $l<10; $l++) {
$c = 'color_elipse' . ($l%2);
$cx = mt_rand(0, $image_width);
$cy = mt_rand(0, $image_width);
$rx = mt_rand(10, $image_width);
$ry = mt_rand(10, $image_width);
ImageFilledEllipse($im, $cx, $cy, $rx, $ry, $$c );
}; break;
case '2' :
for($l=0; $l<10; $l++) {
$c = 'color_line' . ($l%2);
$lx = mt_rand(0, $image_width+$image_height);
$lw = mt_rand(0,3);
if ($lx > $image_width) {
$lx -= $image_width;
ImageFilledRectangle($im, 0, $lx, $image_width-1, $lx+$lw, $$c );
} else ImageFilledRectangle($im, $lx, 0, $lx+$lw, $image_height-1, $$c );
}; break;
}
}
if ( $CBackgroundType == 0 )
{
$image_data=getimagesize($CBackgroundFile);
$image_type=$image_data[2];
if($image_type==1) $img_src=imagecreatefromgif($CBackgroundFile);
elseif($image_type==2) $img_src=imagecreatefromjpeg($CBackgroundFile);
elseif($image_type==3) $img_src=imagecreatefrompng($CBackgroundFile);
if ( $CBackgroundFillType == 1 ) {
imagesettile($im,$img_src);
imagefill($im,0,0,IMG_COLOR_TILED);
}
else imagecopyresampled($im,$img_src,0,0,0,0,$image_wid th,$image_height,$image_data[0],$image_data[1]);
}
$pos_x = $x_padding + ($CFontPadding / 2);
foreach($data as $d) {
$pos_y = ( ( $image_height + $d['height'] ) / 2 );
ImageTTFText($im, $d['size'], $d['angle'], $pos_x, $pos_y, $color_text, $font, $d['char'] );
$pos_x += $d['width'] + $CFontPadding;
}
ImageRectangle($im, 0, 0, $image_width-1, $image_height-1, $color_border);
switch ($output_type) {
case 'jpeg':
Header('Content-type: image/jpeg');
ImageJPEG($im,NULL,100);
break;
case 'png':
default:
Header('Content-type: image/png');
ImagePNG($im);
break;
}
ImageDestroy($im);
break;
case 2:
break;
}
session_write_close();
?>

موفق باشید :قلب:
ا

LORD AELX
چهارشنبه 23 تیر 1389, 01:21 صبح
واقعا از TNX هایی که نمیدید سپاسگذارم!! :اشتباه: :گیج: :لبخند: آخه بی معرفت ها، لااقل یکی دو ساعت وقت گذاشتم برای این پست، حداقل وقتی میخونید و استفاده می کنید یه TNX بدید تا من رو هم خوشحال کنید که حداقل بفهمم چهار نفر این پست رو خوندند و خوششون اومده.... :چشمک:

بگذریم، تو این پست میخوام سورس کد فایل catcha_code.php رو توضیح بدهم...

خوب ابتدا در این فایل میایم فایل های config و lib رو include می کنیم. بعدش session از تابع RandomCode متعلق به فایل lib میخوایم یک کد تصادفی برامون تولید کنه، و این کد رو تو متغیر turing قرار می دهیم و اونو تو session اِ turing_string ذخیره می کنیم. سپس نوع CAPTCHA چک می شود (متغیر پیکربندی captcha_type) که البته در اینجا ما از یک نوع تولید تصویر استفاده می کنیم ولی شما می توانید انواع دیگری را نیز بکار بگیرید (این مورد در پست قبل توضیح داده شد)... بقیه کدها اکثرا واضح و مشخصه و خط به خط توضیح دادن آن ها جالب نیست... :متفکر: اجازه بدید فقط کد های مهم تر رو توضیح بدهم.

اولین موردی که جلب توجه می کند، تابع ImageTTFBBox است. این تابع طول و عرض هر کاراکتر را با توجه به سایز فونت، میزان چرخش، نوع فونت و کاراکتر مورد نظر به دست می آورد (bounding box کاراکتر به واحد px یا در واقع مختصات گوشه های کاراکتر) و بصورت زیر استفاده می شود:


array imagettfbbox ( float $size , float $angle , string $fontfile , string $text )خروجی این تابع آرایه ای شامل 8 عنصر مطابق جدول زیر است که مختصات گوشه های کاراکتر مورد نظر را به ما می دهند:

http://www.irupload.ir/images/8lge8g28mazwkpj79zhg.jpg

اجازه بدهید، راجع به پارامترهای های این تابع هم توضیح مختصری بدهم... :متفکر: پارامتر size که اندازه فونت را به تابع می فرستد باید به واحد pixel (برای GD1) و یا به واحد point (برای GD2) باشد (البته GD2 از هر دو واحد پشتیبانی می کند). پارامتر angle نیز باید بر حسب درجه باشد. مقدار پارامتر fontfile نیز باید url یک فونت TrueType با پسوند ttf. باشد. و در نهایت پارامتر text کاراکتری است که باید پردازش شود.

از این تابع بدین جهت استفاده می کنیم که اندازه متن را بدست بیاوریم تا در نهایت اندازه قاب تصویر خروجی را بدست بیاوریم. البته در صورتیکه کاربر مقدار متغیر CSize را برابر 1 قرار داده باشد (اندازه تصادفی). وگرنه در صورتیکه اندازه تصویر بصورت دستی تنظیم شده باشد، حتی اگر متن از تصویر بیرون بزند، کنترلی بر روی آن نداریم. (مزیت روش اول این است که ما طول و عرض تصویر را بر اساس طول و عرض کاراکتر ها و میزان CFontPadding محاسبه و تعیین می کنیم در حالی که در روش دوم، طول و عرض تصویر ثابت است.)

مورد بعدی، تابع ImageCreate است. این تابع برای ایجاد یک منبع تصویر خالی استفاده می شود و دو پارامتر طول و عرض تصویر را می پذیرد.


resource imagecreate ( int $width , int $height )در مورد اون دو تا حلقه while هم یه توضیحی بدهم... حلقه اول، یعنی کد زیر:



while ( ($d1<50) AND ($d2<50) AND (d3<50) )
{
$r = mt_rand(200,255);
$g = mt_rand(200,255);
$b = mt_rand(200,255);

$d1 = abs($r-$g);
$d2 = abs($r-$b);
$d3 = abs($g-$b);
}
وظیفه تولید رنگ پس زمینه (در حالت تصادفی) رو بر عهده دارد (یک رنگ روشن رنگ بر اساس RGB به صورت تصادفی میسازیم ولی مطمئن میشیم که رنگ خیلی روشن ساخته نمیشه). این رنگ توسط تابع ImageColorAllocate که کار تولید رنگ رو با RGB انجام میده، در متغیر های مربوطه ذخیره میشه تا در پس زمینه استفاده بشه... color_bg رنگ اصلی پس زمینه رو نگه داری می کنه، color_border رنگ قاب تصویر رو (که با محاسبات انجا شده رنگی در همان گروه و شبیه رنگ پس زمینه بدست می آید)، color_line0 و color_elipse0 و color_elipse1 و color_line1 هم

حلقه دوم هم:



while ( ($d1<100) AND ($d2<100) AND (d3<100) )
{
$r = mt_rand(0,150);
$g = mt_rand(0,150);
$b = mt_rand(0,150);
$d1 = abs($r-$g);
$d2 = abs($r-$b);
$d3 = abs($g-$b);
}
رنگ نوشته ها رو تولید می کنه. این رنگ هم روشن بوده (یعنی غیر از رده خاکستری و سیاه) ولی کمی تیره تر از رنگ پس زمینه خواهد بود. این اعداد تصادفی هم توسط تابع ImageColorAllocate به رنگ مورد نظر تبدیل شده و در متغیر color_text ذخیره می گردد.

همچنین در صورتیکه کاربر قصد استفاده از پس زمینه تصادفی (تولید شده با خود PHP) را در CAPTCHA خود داشت، ما علاوه بر رنگ نیاز به ایجاد noise بر روی پس زمینه داریم. این noise ها به دو صورت خط و بیضی اعمال خواهند شد. تابع ImageFilledEllipse وظیفه رسم بیضی بر روی تصویر را دارد و همچنین تابع ImageFilledRectangle مستطیل را رسم می کند (در اینجا و با این آرگومان های داده شد فقط مستطیل هایی بصورت افقی و عمودی و به شکل خط های نازک و ضخیم پدید می آید).

در کد زیر در صورت انتخاب استفاده از تصویر پس زمینه انتخابی موجود در پوشه backgrounds و همچنین مقدار CBackgroundFillType برابر 1 و برای کاشی کاری تنظیم شده باشد از کد زیر استفاده می کنیم:



$image_data=getimagesize($CBackgroundFile);
$image_type=$image_data[2];
if($image_type==1) $img_src=imagecreatefromgif($CBackgroundFile);
elseif($image_type==2) $img_src=imagecreatefromjpeg($CBackgroundFile);
elseif($image_type==3) $img_src=imagecreatefrompng($CBackgroundFile);
در این کد توسط تابع getimagesize اطلاعات تصویر را به دست می آوریم، خروجی این تابع بصورت آرایه است و عنصر دوم این آرایه نوع عکس را در خود نگه داری می کند. که مقدار 1 برای GIF، مقدار 2 برای JPEG و مقدار 3 برای فرمت PNG رزرو شده است. با داشتن این مقدار می توانیم با تابع مربوطه یعنی imagecreatefromgif یا imagecreatefromjpeg یا imagecreatefrompng یک resource به فایل هدف بدست آوریم. سپس با تابع imagesettile تصویر پس زمینه را برای کاشی کردن (Tiled) تنظیم می کنیم و آن را با تابع imagefill در تصویر قرار می دهیم.

ولی در صورتیکه resize بجای کاشی کاری ست شده باشد، از کد برای تغییر اندازه تصویر استفاده می کنیم:


imagecopyresampled($im,$img_src,0,0,0,0,$image_wid th,$image_height,$image_data[0],$image_data[1]);تعریف این تابع بدین صورت می باشد:


bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )لازم به ذکر است، متغیر image_data که توسط تابع getimagesize مقدار دهی شده بود، در عناصر 0 و 1 خود طول و عرض تصویر (در اینجا تصویر پس زمینه موجود در پوشه backgrounds) را نگه داری می کند.

تابع ImageTTFText هم برای نوشتن متن روی عکس به کار می رود و تعریف آن بدین گونه است:


array imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text )در نهایت تابع ImageRectangle هم یک مستطیل به عنوان border به دور تصویر CPATCHA می کشد و تابع ImageJPEG یا ImagePNG یک تصویر به فرمت JPEG یا GIF می سازند. متد ImageDestroy هم حافظه اختصاص داده شده به این تصویر را آزاد می کند.


اینم از این...:اشتباه: اگه سوالی دارید در خدمتم... :بوس: :چشمک:

abdollah110110
سه شنبه 11 آبان 1389, 00:27 صبح
سلام
متشکرم
خیلی متشکرم

wearyminded
چهارشنبه 01 دی 1389, 16:55 عصر
سلام آموزش فوق العاده ای بود....دلم نیومد به یه لایک قناعت کنم.....

امیدوارم همیشه همینجوری کامل و بی نقص باشی....:چشمک:

eshpilen
پنج شنبه 02 دی 1389, 19:57 عصر
LORD AELX (http://barnamenevis.org/member.php?143822-LORD-AELX) بالاخره با کوله باری از PHP برگشتی؟ :لبخند:

راستی چی شده تالار PHP ترکیده!
نمیدونم قضیه چیه چند روزه ملت هجوم آوردن به PHP.
قبلا خبری نبود!

@AM!R!
شنبه 02 بهمن 1389, 18:05 عصر
با سلام
این کد رو میشه لطفا با javascript بنویسید

<?php
require('php-captcha.inc.php');
if (PhpCaptcha::Validate($_POST['user_code'])) {
echo 'Valid code entered';
} else {
echo 'Invalid code entered';
}
?>

rasool.kh
یک شنبه 09 مرداد 1390, 18:41 عصر
سلام. از شما دوست عزیز کمال تشکر و قدر دانی رو دارم. خیلی مفید و کامل بود. امیدوارم در تمام مراحل زندگی پیروز باشی.

LORD AELX
شنبه 15 مرداد 1390, 03:32 صبح
با سلام
این کد رو میشه لطفا با javascript بنویسید

<?php
require('php-captcha.inc.php');
if (PhpCaptcha::Validate($_POST['user_code'])) {
echo 'Valid code entered';
} else {
echo 'Invalid code entered';
}
?>

ببخشید خیلی دیر دارم پاسخ میدم، چند وقتی هست که اینجا نمیام....

در مورد تبدیل این کد به جاوا، شدنی نیست، ولی اگر نیازه فایل اصلی اصلا PHP نداشته باشه، میتونید مقادیر رو توسط AJAX به یه فایل PHP پاس بدید و مقدار بازگشتی رو در برنامه مورد پردازش قرارداده و خروجی مطلوب را استفاده کنید. حالا دیگه بسته به طرح و کارتون داره و بیشتر از این نمیتونم چیزی بگم. (اگر جزئی تر کسی سوال داره، یک تاپیک مجزا باز کنید.)

ارادتمند

jalaladdin
شنبه 22 مرداد 1390, 08:36 صبح
معمولا تو سایت های فارسی زبان در این مورد زیاد صحبت نشده و آن جاهایی هم که آموزش داده شده، اغلب موضوع را پیچیده و غیر قابل هضم کرده اند. در حالت کلی برنامه نویسان وب نیاز به آشنایی با کد تولید کننده تصویر و صدای CAPTCHA ندارند و فقط باید نحوه استفاده از کتابخانه موجود را بدانند تا در فرم های خود و برای Authorization از آن استفاده کنند. در مرحله بعدی برای دستکاری های لازم و یا بالا بردن ضریب امینتی تصاویر، می توانند با نحوه نوشتن کد آن از ابتدا و یا دستکاری کدهای موجود آشنا گردند.

در این سری آموزش ها قصد داریم تمام موارد یاد شده را با مثال های عملی و کاربردی توضیح دهیم و پله پله به پیش برویم.

خوب، برای شروع قصد دارم استفاده از کتابخانه PhpCaptcha را آموزش داده و علاوه بر آن نحوه دستکاری تصاویر ساخته شده و نیز اضافه کردن Audio CAPTCHA را توضیح دهم.

http://www.irupload.ir/images/zlgzl06w84kpi6l7waha.jpg

- مرحله اول: فایل کتابخانه php-captcha.inc.php را از لینک زیر دانلود کنید:

http://www.ejeliot.com/samples/php-captcha/download.php- مرحله دوم: فایل دانلود شده را به پوشه سایت خود انتقال داده و سپس دو فایل با نام های visual-captcha.php و audio-captcha.php اضافه کرده و کد های زیر را در آن ها بنویسید:




فایل visual-captcha.php:




<?php
require('php-captcha.inc.php');
$aFonts = array('fonts/VeraBd.ttf', 'fonts/VeraIt.ttf', 'fonts/Vera.ttf');
$oVisualCaptcha = new PhpCaptcha($aFonts, 200, 60);
$oVisualCaptcha->Create();
?>



فایل audio-captcha.php:




<?php
require('php-captcha.inc.php');
$oAudioCaptcha = new AudioPhpCaptcha('/usr/bin/flite', '/tmp/');
$oAudioCaptcha->Create();
?>
این دو فایل وظیفه ساختن تصویر و صدای CAPTCHA را بر عهده دارند. پوشه ای با نام fonts ایجاد کنید و چند font (انگلیسی) در آن قرار دهید. سپس مقادیر موجود در آرایه aFonts$ فایل visual-captcha.php را با فونت های خود، تغییر دهید. برای تولید صدا نیز از انجین Flite استفاده کنید. می توانید آن را از لینک زیر دانلود کرده و در وب سرور نصب کنید:

http://www.speech.cs.cmu.edu/flite/محل نصب انجین را می بایست در فایل audio-captcha.php ادیت کنید. (usr/bin/flite/)

تنها چیزی که باقی مانده، اضافه کردن کد CAPTCHA به فرم است. پس از اینکه فرم مورد نظر رو طراحی کردید، ما به 4 خط کد اضافی نیاز داریم:

1. کد تصویر CAPTCHA


<img src="visual-captcha.php" width="200" height="60" alt="Visual CAPTCHA" />
2. کد صدای CAPTCHA


<a href="audio-captcha.php">Can't see the image? Click for audible version</a>
3. کد TextBox مربوط به CAPTCHA


<input type="text" name="user_code" size="20">
4. کد پردازش صحت ورود داده توسط کاربر با PHP


<?php
require('php-captcha.inc.php');
if (PhpCaptcha::Validate($_POST['user_code'])) {
echo 'Valid code entered';
} else {
echo 'Invalid code entered';
}
?>
همین! :لبخندساده: CAPTCHA شما آماده استفاده است. آن را امتحان کنید!

حال اجازه دهید کمی این تصویر را دستکاری کنیم... :متفکر: بدیهی است که تمام تغییرات مورد نیاز خود را باید در فایل visual-captcha.php و قبل از کد ;()$oVisualCaptcha->Create اعمال کنیم. اولین تغییر رو هدیه می دهم به تمام دوستداران Copyright!! :لبخند: با اضافه کردن کد زیر، می توانید یک منبع برای کد خود ایجاد کنید:

http://www.irupload.ir/images/5bkxvtuog1kpktw8yqq1.jpg


$oVisualCaptcha->SetOwnerText('Source: www.barnamenevis.com');حالا بیایید برای کاراکترها سایه ایجاد کنیم:

http://www.irupload.ir/images/ufuggn2wsjnwvbuywq68.jpg


$oVisualCaptcha->DisplayShadow(true);حال میخواهیم از تصویر Background مشخصی استفاده شود، یک پوشه به نام images ساخته و تصویر مورد نظر خود را در آن قرار دهید (معمولا background های 100x100 استفاده می شود و ضمنا در مورد این کتابخانه فقط باید از تصاویر نوع JPG استفاده شود)، حال کد زیر را اضافه کنید:

http://www.irupload.ir/images/x2xaf9h2iyhiq9cjftl.jpg


$oVisualCaptcha->SetBackgroundImages('images/captcha.jpg');خوب، حالا دوست دارید نوشته های موجود در تصویر رنگی شوند؟! کافی است کد زیر را اضافه کنید:

http://www.irupload.ir/images/38krl5bv6y8izzfdikx7.jpg


$oVisualCaptcha->UseColour(true);خوب، اینم از تغییراتی که میشد ایجاد کرد. نکته قابل توجه اینجاست که شما می توانید این تغییرات را با هم ادغام کنید (با تولید یک عدد تصادفی و نوشتن کدی برای انتخاب بین روش های موجود و ...) و تصاویری با تنوع بیشتر و پیچیده تر تولید کنید.

به زودی نوشتن کد CAPTCHA رو از اول براتون توضیح می دهم.

موفق باشید :قلب:




برای فرم تماس با ما از کدی که شما توضیح دادید استفاده کردم اما تصویر امنیتی نشان داده نمیشود به نظر شما مشکل از کجا میتونه باشد
[

LORD AELX
جمعه 11 شهریور 1390, 03:36 صبح
واقعا نیاز بود پست به این عظمت رو نقل قول کنید؟! :دی

چک کنید روی سرور PHP-GD نصب هست یا خیر...

LORD AELX
جمعه 11 شهریور 1390, 16:20 عصر
دوستان چندی پیش یک اسکریپت Open Source دیگر دیدم که قابلیت صوتی نیز دارد و میتونید از نحوه اجرای صوتی کار از اون الهام بگیرید.

http://www.phpcaptcha.org/

serterazi
جمعه 20 آبان 1390, 07:06 صبح
با سلام.
میشه این برنامه رو به صورت یه لقمه آماده برای من ارسال کنید؟ :لبخند:
مثلاً توی یه صفحه وب پیاده سازی بشه. میخوام بدم استاد.:ناراحت:
هزینه اش رو هم میدم.:چشمک:

lhodeniz
دوشنبه 24 بهمن 1390, 00:19 صبح
سلام
بابت کد ها و توضیحات خوبتون ازتون ممنونم!
به درد من که خیلی خورد!
موفق باشید

mahmod2000
دوشنبه 24 بهمن 1390, 16:30 عصر
سلام

گفتم منم یه چیزی بگم واسه خالی نبودنه مطلب :لبخند:

این اسکریپ برای تست Captcha هست :
این آمار رو میده بهتون



GD Support: Yes!
GD Version: bundled (2.0.34 compatible)
imageftbbox function: Yes!
TTF Support (FreeType): Yes!
JPEG Support: Yes!
PNG Support: Yes!
GIF Read Support: Yes!
GIF Create Support: Yes!


تست میکنه ببینه برای اجرای Captcha همه موارد مورد نیاز فعال هست یا نه

majid534
دوشنبه 06 آذر 1391, 22:00 عصر
سلام

آقا من به مشکل خوردم ....
تو قسمت پردازش ...

من کد پردازش فرم هام به این صورته :


if(empty($_POST['Mobile']))
$_SESSION['error_msg'] = '*لطفا قسمت مربوط به شماره موبایل را پر کنید';
if(empty($_POST['mail']))
$_SESSION['error_msg'] = '*لطفا قسمت مربوط به ایمیل را پر کنید';
و


if( ! empty($_SESSION['error_msg']))
{
header("location: err.php");
exit();
}
الآن این کد پردازش مربوط به captcha رو چجوری تغییر بدیم تا اگر خالی بود یا اشتباه بود تو همون صفحه مثه بقیه فیلد ها ارور بده ؟

با تشکر

love lovely god
یک شنبه 02 آذر 1393, 22:50 عصر
سلام به همه عزیزان
دست نویسنده درد نکنه واقعا ممنون. من اولین باره دارم سوال میپرسم> آقا من اصلا نمیدونم captcha چیه حالا استادمون خواسته بنویسیم بدون استفاده از کتابخانه دات نت فریم ورک یکی از صفر شروع کنه توضیح بده یا اگه فایل داره برام بفرسته ممنونش میشم خیلی فوری فوری >
باتشکر

H:Shojaei
یک شنبه 02 آذر 1393, 23:56 عصر
سلام...
captcha یا تصویر امنیتی یه عکسه که با کد نویسی ساخته میشه و به کاربر وقتی میخواد یه چیزی رو به وب سایت ارسال کنه نمایش میده و کاربر باید اون رو بخونه و مقدارش رو به درستی وارد فیلد متنی که مربوط به اون هست کنه و بعد فرم رو ارسال کنه...
به چه دردی میخوره؟
فرض کنید یه فرم ثبت نام داریم که تصویر امنیتی نداره حالا این فرم اگه توسط یه رباط ارسال بشه هیچ کنترلی روش نیست و رباطه میتونه 10000 کاربر جدید ثبت کنه...
اگه این تصویره باشه رباط باید این مقدار رو هم همراه با مقادیر دیگه ارسال کنه تا کاربر جدید ثبت بشه و این رباطه فهمش در حد خوندن اون تصویر نیست و اون 10000 کاربر ثبت نمیشن و امنیت سایت میره بالا...
آموزش ساخت تصویر امنیتی هم اینقد زیاده که نگو...
http://phpro.ir/%D8%AA%D8%B5%D9%88%DB%8C%D8%B1-%D8%A7%D9%85%D9%86%DB%8C%D8%AA%DB%8C-captcha/

http://aparnet.ir/1160-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B3%D8%A7%D8%AE%D8%AA-%DA%A9%D9%BE%DA%86%D8%A7-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1-%D8%A7%D9%85%D9%86%DB%8C%D8%AA%DB%8C-%D8%AF%D8%B1-php

Mohammadsgh
دوشنبه 03 آذر 1393, 10:30 صبح
reCAPTCHA گوگل بهترینشونه

love lovely god
دوشنبه 03 آذر 1393, 18:19 عصر
سلام
دوست عزیز دستت درد نکنه یه دنیا تشکر.

love lovely god
دوشنبه 03 آذر 1393, 18:20 عصر
فقط یه چیز! استادم گفته بدون .net framework

DR.HTML
دوشنبه 03 آذر 1393, 20:54 عصر
اول اینکه با تشکر از اینک تاپیک سه سال پیش بال کشیدید دوم اینکه این موارد که گفته شد مربوط به php و ربطی به دات نت نداره

hamedarian2009
دوشنبه 03 آذر 1393, 22:00 عصر
فقط یه چیز! استادم گفته بدون .net framework
استادتون نگفت با چه زبانی بنویسین؟ NET. مربوط به جامعه متن باز نیست شاید با سی شارپ منظورش بوده
اگه با PHP میخای با کدنویسی از صفر میتونید اینکارو به راحتی انجام بدین