چهارشنبه ۰۳ اردیبهشت ۱۴۰۴

Wednesday, April 23, 2025 GMT +3:30

تعویض کد امنیتی Captcha با Ajax و MySQL

mysql-ajax-captcha-refresh

در آموزش قبلی از بخش آموزش های کاربردی mysql با شیوه ساخت فرم تماس و ارسال نظرات به همراه کد امنیتی آشنا شدیم، همان طور که دیدیم برای ایجاد این گونه قابلیت ها باید از php ، html و mysql در یک ارتباط منطقی استفاده کنیم و در یک ساختار نسبتا ساده اطلاعات را از فرم html به کد php ارسال کرده و بعد از پردازش در جداول و ستون های mysql ذخیره کنیم، حال می خواهیم یک امکان دیگر نیز به برنامه خود اضافه کنیم، این امکان، قابلیت تعویض کد امنیتی (کد captcha) است که برای ایجاد آن باید از جاوا اسکریپت و آژاکس (ajax) نیز در کنار سایر کدهای خود بهره ببریم.

تابع آژاکس برای تعویض کد امنیتی


برای تعویض کد امنیتی یا captcha، قبل از هر چیز نیاز به یک موتور آژاکسی است تا درخواست کاربر را بدون رفرش شدن صفحه و در پس زمینه به سرور ارسال کرده و پاسخ آن را در یک بلاک div یا span نشان دهد، اما قبل از این کار باید یادآور شویم که آموزش حاضر مبتنی بر مطلب قبلی است که در بخش آموزش های کاربردی mysql با عنوان آموزش ساخت فرم تماس با php و mysql مطرح کرده ایم، لذا قبل از بررسی آن باید مطلب قبلی را مطالعه کرده باشید.
برای ایجاد موتور آژاکسی از توابع زیر استفاده می کنیم.
<script type="text/javascript">
//<![CDATA[
function Ajaxrequest(){
    var xmlHttp;
    try{
        //Firefox, Opera 8.0+, Safari    
        xmlHttp=new XMLHttpRequest();
        return xmlHttp;
    }
    catch (e){
        try{
            //Internet Explorer    
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
            return xmlHttp;
    }
    catch (e){
        try{
            //ActiveX
            xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
            return xmlHttp;
            }
            catch (e){
                alert("مرورگر شما از آژاکس پشتیبانی نمی کند!");
                return false;
            }
        }
    }
}
var codediv = 'code-box';
var loadingdiv = 'loading';
var loadingmessage = '<img src="loading.gif" alt="loading" height="16" width="16" /> لطفا کمی صبر کنید...';
var empty = '';
var url = 'captcha.php';
function changecode(){
    var xmlHttp = Ajaxrequest();
    xmlHttp.onreadystatechangefunction(){
        if(xmlHttp.readyState > 0 && xmlHttp.readyState < 4){
            document.getElementById(loadingdiv).innerHTML=loadingmessage;
            }
            if (xmlHttp.readyState == 4) {
                document.getElementById(codediv).innerHTML=xmlHttp.responseText;
                document.getElementById(loadingdiv).innerHTML=empty;
                }
                }
                xmlHttp.open("GET", url, true);
                xmlHttp.send();
}
//]]>
</script>
توضیح:
- کد بالا دو تابع اصلی دارد، تابع changecode که درون خود از تابع دیگری به نام Ajaxrequest استفاده می کند، با فراخوانی تابع changecode (که در ادامه خواهیم دید)، تابع Ajaxrequest درخواست را به فایل captcha.php و با متد GET ارسال می کند، سپس پاسخ سرور که در واقع همان کد امنیتی است، توسط تابع changecode پردازش شده و نتیجه در بلاک با id فرضی code-box نشان داده می شود.
- همان طور که در آموزش های مقدماتی آژاکس (ajax) گفته ایم، پس از ارسال یک درخواست آژاکسی، وضعیت درخواست با readyState قابل دریافت است و این وضعیت با اعدادی از صفر تا 4 دریافت می شود، عدد 4 حالت کامل و در واقع نشانه پایان عملیات است، لذا در این بین (بین حالت صفر تا 4) می توان یک تصویر به عنوان در حال پردازش یا loading نمایش داد، این کار در کد بالا با دستورات شرطی if و خاصیت document.getElementById انجام شده است.
- با ترکیب متد document.getElementById و دستور innerHTML می توان مقادیری به بلاک های html نسب داد، به طور مثال یک تصویر و پیام را در آنها به نمایش درآورد.
- قسمت مربوط به responseText در واقع پاسخ سرور را در خود دارد، وقتی حالت آماده یا همان readyState برابر 4 می شود، پاسخ سرور در بلاک فرضی codediv به نمایش در می آید.
نکته 1: در کد بالا از یک تصویر کوچک با فرمت gif جهت نمایش حالت در حال پردازش (loading) استفاده شده است، برای اینکه این تصویر به درستی نمایش داده شود، باید آن را در کنار سایر فایل ها قرار دهید یا اینکه در قسمت img src در متغیر loadingmessage، آدرس دقیق تصویر را تنظیم کنید.
نکته 2: کد بالا را باید بین تگ های head قرار دهید یا اینکه به صورت یک فایل خارجی در صفحه به اصطلاح ایمپورت نمائید.

فراخوانی تابع آژاکس


پس از اضافه کردن موتور آژاکسی به صفحه خود، لازم است که توابع مبتنی بر جاوا اسکریپت را با رویداد onclick (یا سایر رویدادها در جاوا اسکریپت) فراخوانی کنیم، از طرفی برای مدیریت صحیح نمایش پیام در حال پردازش (loading) نیاز به بلاک div یا span با آی دی مشخص داریم، لذا فرم html را که در آموزش قبلی ساخته ایم، به صورت زیر ویرایش می کنیم.
<form action="contact.php" method="post">
<label for="name">نام:</label>
<input name="name" id="name" type="text" maxlength="255" /><br />
<label for="mail">ایمیل:</label>
<input name="mail" id="mail" type="text" maxlength="255" dir="ltr" /><br />
<label for="message">یادداشت:</label>
<textarea name="message" id="message" cols="35" rows="8">
</textarea><br />
<label for="code">کد امنیتی:</label>
<input name="code" id="code" type="text" class="code" />
<div class="code-box" id="code-box"><?php echo $code_1.' + '.$code_2 ?></div>&nbsp;<a href="#" onclick="changecode();">تعویض کد</a><span id="loading"></span><br />
<input type="hidden" name="check" value="1" />
<input type="submit" value="ارسال" />
</form>
ملاحظه می کنید که علاوه بر آی دی code-box، قسمت زیر نیز به فرم افزوده شده است.
<a href="#" onclick="changecode();">تعویض کد</a><span id="loading"></span>

پردازش اطلاعات در فایل captcha.php


پس از ارسال درخواست آژاکسی، در سرور و در واقع در فایل captcha.php (که آدرس آن را پیش تر در متغیر url تنظیم کرده ایم)، با بررسی ip کاربر، ضمن اینکه کد امنیتی را در دیتابیس به روز رسانی می کنیم، یک نسخه از پاسخ سرور را به عنوان responseText به درخواست آژاکسی تحویل می دهیم (با خروجی گرفتن توسط دستور echo در php)، سپس تابع changecode، پاسخ را تجزیه تحلیل کرده و در بلاک span با آی دی code-box نمایش می دهد (این کار با استفاده از متد document.getElementById و دستور innerHTML صورت می گیرد).
<?php
//اطلاعات اتصال به دیتابیس
$con = mysql_connect("localhost","root","")
or die(mysql_error());
//نام پایگاه داده
mysql_select_db("contact")
or die(mysql_error());
//ساخت کد امنیتی
$code_1 = rand(1,9);
$code_2 = rand(1,9);
$code = $code_1 + $code_2;
//دریافت آی پی کاربر
$ip = $_SERVER['REMOTE_ADDR'];
//بررسی وضعیت کاربر در سرور
$result = mysql_query("SELECT * FROM form WHERE userip = '$ip' AND status = 'temp' LIMIT 1")
or die(mysql_error());
$user_exist = mysql_num_rows($result);
if ($user_exist > 0){
    //به روز رسانی کد برای آی پی کاربر در دیتابیس
    mysql_query("UPDATE form SET code='$code' WHERE userip = '$ip' AND status = 'temp'" )
    or die(mysql_error());    
}
else{
    //ذخیره کد و آی پی کاربر در دیتابیس
    mysql_query("INSERT INTO form (code,userip,status) VALUES ('$code','$ip','temp')")
    or die(mysql_error());
}
//خروجی
echo $code_1.' + '.$code_2;
?>
نکته: روشی که در بالا برای تعویض کد امنیتی توضیح داده ایم تنها یک نمونه و جهت مثال بود، شما می توانید با الگو قرار دادن این روش و با کمی تجربه، ایده های ذهنی خود را پیاده کنید و از این نظر هیچ محدودیتی نیست.
دسته بندی: آموزش کاربردی » MySQL
related مطالب بیشتر:
هوشمند سازی پنل ورود و خروج سایت با PHP و MySQL
آموزش ساخت فرم تماس با PHP و MySQL
آموزش ساخت پنل ورود و خروج سایت با PHP و MySQL
نحوه رسم چارت و نمودار آماری با PHP و MySQL
ساخت فید آر اس اس (RSS Feed) با استفاده از PHP و MySQL
دیدگاه
more ۲۰ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
مهدی
۲۳:۱۱ ۱۴۰۱/۱۲/۱۲
من یک سایت سر و کار دارم در هر 24 ساعت فقط یک بار برای 5 دقیقه باز میشود اما وقتیکه تمام مراحل را تمام میکنم کد امنیتی چهار رقم هست را برایم بالا نمی‌اورد خیلی کم مثلن در هفته 6 روزش را موفق نمیشوم اما یکی شاید بتوانم موفق شوم تا کد امنیتی را بگیرم و مرحله به پایان برسد اگر برای بالا اورد کد امنیتی با کمک کنید ممنون میشم یعنی چگونه می‌توانم این کد عاجل برایم بالا بیاورد سپاس.
در صورتی که ایراد از سایت مورد نظر باشد متاسفانه امکان کمک خاصی میسر نیست، اما برای اطمینان از اینکه اشکال از سمت سیستم شما نیست در مرورگرهای مختلف تست کنید و با و بدون استفاده از برنامه های تغییر IP به سایت مورد نظر متصل شوید.
علی
۱۵:۰۴ ۱۳۹۴/۱۲/۱۵
سلام من کدهای آموزشی شمار رو عینا استفاده کردم اما با اجراش از حالت loading خارج نمی شه.
در صورتی که همه چیز درست انجام شده باشد، دلیلی برای عمل نکردن صحیح کدها وجود ندارد، لطفا جهت بررسی فایل های خود را در قالب فرمت zip به آدرس ایمیل ما (موجود در بخش تماس) ارسال نمائید.
da6 3ami
۱۹:۲۴ ۱۳۹۳/۱۰/۰۵
سلام چه طور میتونم یه کد کپچا ضرب بنویسم مثل همین کد کپچای که توی قسمت نظر دهی هست؟
با تشکر
سلام
در آموزش حاضر ایجاد این سیستم به صورت جمع توضیح داده شده، کافی است مشابه همین روند را به صورت ضرب ایجاد کنید!
پرویز
۱۹:۱۱ ۱۳۹۳/۰۸/۱۹
سلام دستور
$user_exist = mysql_num_rows($result);
چه کاری انجام می دهد.
سلام
تابع mysql_num_rows برای بدست آوردن تعداد نتایج یک پرس و جوی MySQL است، لذا این خط کد تعداد ردیف های انتخاب شده ناشی از پرس و جوی مربوط به متغیر result را به متغیر user_exist نسبت می دهد.
۲۰:۲۰ ۱۳۹۳/۰۵/۰۴
لطفا اگه واستون زحمت نمیشه کد کپچای که تو این بخش یعنی بخش نظرات گذاشتید لطفا کدش رو هم میزارین
آموزش در همین خصوص است!
الیاس
۲۰:۳۲ ۱۳۹۳/۰۲/۱۱
سلام
درموقع کار با کتابخانه gd وقتی می خواهم متنی را به تصویر تبدیل کنم از تابع imagestring این کار را انجام می دهم و اگر متن لاتین باشد به خوبی کار می کند ولی متاسفانه در متن های فارسی کار نمی کنه و کاراکترهای (خاص و عجیبی) نشان می دهد و utf8 را پشتیبانی نمی کند.
لطفا راهنمایی کنید
سلام
برای پشتیبانی از زبان فارسی در کتابخانه GD پروژه ای مجزا نوشته شده که از لینک زیر می توانید آن را دریافت و استفاده کنید:
http://developer.berlios.de/project/showfiles.php?group_id=4533
فاطمه
۱۹:۰۹ ۱۳۹۲/۱۲/۱۶
با سلام
من کد بالا را اجرا می کنم اما در اولین اجرا خطای
Notice: Undefined variable: code_1 in
را نمایش می دهد و بعد از یک بار کلیک بر تعویض کد اعداد نمایش داده می شوند.
مسئله دیگر : آیا ارتباط با پایگاه داده در پروژه برای سرور مجازی xampp هم لازم است؟ مثلا کد
$_SERVER['REMOTE_ADDR']
یا status در چنین پروژه ای اجرا می شود؟
سلام
خطای اول به این خاظر است که کدها در دو فایل باید نوشته شوند، یک بار برای صفحه اصلی که در اولین بار یا با رفرش دستی صفحه نمایش داده می شود، یک بار هم وقتی که درخواست آژاکسی به فایل captcha.php ارسال و پاسخ دریافت می شود، در حال حاضر شما گام اول را انجام نداده اید، در مورد سوال دوم REMOTE_ADDR ارتباطی به پایگاه داده ندارد، این دستور IP کاربر را نمایش می دهد که در سرور مجازی معمولا به صورت عدد ثابت 127.0.0.1 مشخص می شود (اگر قصد تست کدها را دارید، این عدد را به صورت دستی در دیتابیس تغییر دهید).
۱۲:۴۳ ۱۳۹۲/۱۲/۱۶
ممنون
کد ریفرش رو گذاشتم ولی حالا مشکلی که هست اینه که وقتی روی تعویض کد امنیتی کلیک می کنم کد امنیتی در باطن عوض میشه ولی کد امنیتی جدید تو سایت نمایش داده نمیشه
باید تو کد آجاکس تغییری ایجاد بشه؟
<?php
session_start();
$text='qwertyuiopasdfghjklzxcvbnm123456789';
$code='';
for($i=1;$i<=6;$i++)
{
$start=rand(0,strlen($text));
$code.=substr($text,$start,1);
}
$_SESSION['code']=$code;
?>
<script type="text/javascript">
//<![CDATA[
function Ajaxrequest(){
var xmlHttp;
try{
//Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
return xmlHttp;
}
catch (e){
try{
//Internet Explorer
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
return xmlHttp;
}
catch (e){
try{
//ActiveX
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
return xmlHttp;
}
catch (e){
alert("مرورگر شما از آژاکس پشتیبانی نمی کند!");
return false;
}
}
}
}
var codediv = 'captcha';
var loadingdiv = 'loading';
var loadingmessage = '<img src="images/loading.gif" alt="loading" height="16" width="100" /> لطفا کمی صبر کنید...';
var empty = '';
var url = 'index.php';
function changecode(){
var xmlHttp = Ajaxrequest();
xmlHttp.onreadystatechange = function(){
if(xmlHttp.readyState > 0 && xmlHttp.readyState < 4){
document.getElementById(loadingdiv).innerHTML=loadingmessage;
}
if (xmlHttp.readyState == 4) {
document.getElementById("captcha").src="captcha.php";
document.getElementById(loadingdiv).innerHTML=empty;
}
}
xmlHttp.open("GET", url, true);
xmlHttp.send();
}
//]]>
</script>
اینم کد نمایش کپچای سایتم
<a href="javascript:void(0);" onclick="changecode();">تعویض کد</a><span id="loading"></span><img src="captcha.php">
عرض کردیم سشن آی دی جدید باید به عنوان یک پارامتر به کد captcha.php داده شود و این فایل به عنوان یک img جدید جایگیزین محتوای فعلی شود، حل مشکل نیاز به تست فایل ها دارد، در صورت تمایل فایل ها را با فرمت zip فشرده کرده و به ایمیل ما (در بخش تماس وجود دارد) ارسال کنید.
۰۱:۳۶ ۱۳۹۲/۱۲/۱۶
سلام
کد امنیتی فرم ورود من بصورت زیر هست
<td width="160" height="20"><img src="captcha.php"><input type="text" name="captcha" class="field"  id="captcha" /></td>
چطوری باید برای این کد ریفرش درست کنم؟
البته حروف کپچا با این کد ساخته میشن که تو صفحه ایندکس هستن
<?php
session_start();
$text='abcdefghijklmnopqrstuvwxyz123456789';
$code='';
for($i=1;$i<=6;$i++)
{
$start=rand(0,strlen($text));
$code.=substr($text,$start,1);
}
$_SESSION['code']=$code;
?>
چیکار باید کنم؟
سلام
ساده نیست!
هر چند به اطلاعات فایل captcha.php و ساختار کل کدها دسترسی نداریم، اما در تئوری:
1- باید یک فایل داشته باشید که با ارسال دستور آژاکسی اطلاعات سشن را به روز رسانی و نتیجه سشن را به صورت عدد یا عبارت برگرداند.
2- سپس در ادامه دستورات جاوا اسکریپتی، پارامتر مربوط به سشن آی دی را (عدد یا عبارت را) به کد captcha.php با استفاده از متد GET بدهید و img جدید را جایگزین img فعلی کنید (برای انجام راحت تر این کار می توانید img را داخل یک div با id مشخص قرار دهید و از innerHTML استفاده کنید).
نکته: در قسمت دوم از Ajax استفاده نکنید، بلکه با درج تگ img به همراه پارامتر مورد نیاز برای فایل captcha.php، تصویر ساخته خواهد شد، به فرض:
<img src="captcha.php?code=1234">
قاعدتا باید ساختار فایل captcha.php را طوری تغییر دهید که از مقادیر موجود در پارامتر code برای ایجاد کد امنیتی استفاده کند.
بهنام
۰۰:۳۵ ۱۳۹۲/۱۲/۰۹
سلام واقعا از پست های مفید شما نهایت تشکر را دارم
من این کارهایی که گفتین رو انجام دادم و این کد را نوشتم
<?php
$code_1 = rand(1,9);
$code_2 = rand(1,9);
$code = $code_1 + $code_2;
echo $code;
if(isset($_POST['sub'])){
$tf = $_POST['tf'];
if($tf == $code){
echo 'درست است';
}else{
echo 'نادرست است';
}
}
?>
<form method="post">
<input type="text" name="tf" />
<input type="submit" name="sub" />
</form>
<form method="post">
<input type="text" name="tf" />
<input type="submit" name="sub" />
</form>
وقتی اون عدد را که چاپ میشود را درون فیلد وارد می کنم عملیات انجام نمیشه و میگه کد امنیتی اشتباه است هر باری که ریفرش می کنیم یه عددی به صورت رندم چاپ میشه و اگه اون عدد رو درون فیلد وارد می کنم میگه اشتباهه ولی اگه شانسی یه عدد وارد کنم که بعد از ریفرش صفحه اون عدد اگه بیاد درست می گیره یعنی باید عدد رندمی بعدیش را وارد کنی تا عملیات درست کار کنه مثلا عدد 16 میاد و اگه ریفرش کنیم عدد 12 قرار است بیاد و اگه 12 را وارد کنیم درست میگیره این مشکل را چگونه حل کنم با تشکر از هموطنان وبگو
سلام
آموزش متفاوت از بحثی است که شما نوشته اید! مطلب در رابطه با تعویض کد امنیتی ذخیره شده در دیتابیس با Ajax است، اما کدهای شما ظاهرا تستی برای یک سیستم captcha است، اشتباه شما این است که به جای ذخیره عدد قبلی و مقایسه آن با مقادیر ارسال شده توسط کاربر، عددی را که کاربر در فرم وارد می کند، با عدد جدید ایجاد شده توسط کدها مقایسه می کنید.
نفس
۱۸:۴۲ ۱۳۹۲/۰۷/۲۵
سلام مجدد. پیغام خطا نمیده. راستش از طریق اکسپلورر اطلاعات به درستی وارد دیتابیس میشه ولی پیغام اطلاعات با موفقیت اسال شد یا پیغام کد امنیتی اشتباه است رو نشون نمیده. در صورتی که تو موزیلا درسته.
1 مشکل دیگه اینکه وقتی پیغام کد امنیتی اشتباه است میاد و روی بازگشت کلیک می کنم بر می گرده ولی کد رو بطور خودکار رفرش نمیکنه.
سلام
تفاوت در عملکرد مرورگرها معمولا به کدنویسی سمت کاربر (HTML , JavaScript و...) مربوط می شود، برای گزینه بازگشت نیز نباید از مواردی مانند history back استفاده کنید، راه مناسب در این مورد استفاده از لینک با تگ a به صفحه اولیه است، یا اینکه صفحه ارسال و دریافت اطلاعات یکی باشد.
در هر صورت رفع اینگونه مشکلات بدون دیدن سورس صفحه و آزمایش و خطا، خیلی ساده نیست!
نفس
۱۵:۴۵ ۱۳۹۲/۰۷/۲۴
راستی این کد تو موزیلا کار میکنه ولی اکسپلورر نه. دلیل خاصی داره؟ قابل حل شدن هست؟
باید دید چه خطایی در اینترنت اکسپلورر و در چه نسخه ای دریافت می کنید، نیاز به رفع باگ است.
نفس
۱۵:۳۱ ۱۳۹۲/۰۷/۲۴
مرسییییییییی واقعا ممنونم ازت حل شد
نفس
۱۲:۰۹ ۱۳۹۲/۰۷/۲۴
سلام. خدا قوت. می بخشید من این کد رو اجرا میکنم درست اجرا میشه و با هر بار زدن تعویض کد کد عوض میشه ولی یه مشکلی که هست هر بار که روی تعویض کد کلیک میکنم صفحه میره بالا. یعنی پرش به بالای صفحه داره و باید اسکرول رو بکشم پایین تا کد رفرش شده رو ببینم و وارد کنم. شما میدونی مشکل کجاست؟
سلام
در این قسمت:
<a href="#" onclick="changecode();">تعویض کد</a><span id="loading"></span>
به جای کاراکتر # از عبارت زیر استفاده کنید:
javascript:void(0);
امیر
۱۴:۴۳ ۱۳۹۲/۰۳/۱۹
سلام چطور میشه عکسی رو که کد امنیتی هست با آژاکس ریفرش کرد مثل :
<img src="seccode.php?i=<?=md5(rand(99,9999))?>" id=seccode>
مثل کد همین نظرات
سلام
سیستم کد امنیتی باید طوری طراحی شود که بتوان به وسیله یک درخواست آژاکسی کد را در سرور (فایل seccode.php) و همچنین در سمت کاربر تغییر داد (یعنی پس از تغییر کد در فایل seccode.php، نتیجه در قسمت نمایش کد امنیتی نشان داده شود)، این کار نیازمند آشنایی با جاوا اسکریپت و آژاکس است و جهت نمونه یک روش در آموزش توضیح داده شده، سایر موارد نیز مشابه و به همین طریق هستند.
نکته: برای حالت تصویر، باید در یک تابع جاوا اسکریپتی آدرس فایل کد امنیتی را فراخوانی و پاسخ را در قسمت src جایگزین نمائید (تابع باید با یک رویداد اجرا شود، در این رابطه به مباحث مقدماتی جاوا اسکریپت مراجعه کنید)، به طور مثال:
<script type="text/javascript">
function RefreshCaptcha(){
document.getElementById('seccode').src='seccode.php?rand='+Math.round(new Date().getTime()/1000);
}
</script>
قسمت آخر تابع برای جلوگیری از ذخیره یا به اصطلاح cache شدن تصویر در مرورگر است.
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
3 × 5
20 × 20
=