منتدى استراحات زايد

منتدى استراحات زايد (http://vb.ma7room.com/index.php)
-   منتدى أخبار المواقع والمنتديات العربية والأجنبية (http://vb.ma7room.com/forumdisplay.php?f=183)
-   -   [ درس ] برمجة نظام captcha "التحقق البشري!" (http://vb.ma7room.com/showthread.php?t=745873)

محروم.كوم 01-10-2012 12:40 PM

[ درس ] برمجة نظام captcha "التحقق البشري!"
 
السلآم عليكم ..!

اليوم قلت أشرح لكم درس مهم من دروس الحماية وهو نظام الـ captcha أو المعروف بالتحقق البشري !

^ عبارة عن نظام يكون رقم عشوائي على صورة ويتحقق من إدخال ما بداخل الصورة من أحرف وأرقام ~

الشرح رآح يكون عالسريع :nosweat:

أولآ لنقوم بعمل فورم لإدخال البيانات "index.php" :

رمز PHP:






Captcha









&
nbsp;






&
nbsp;



كما تشاهدون في الملف أكواد جافا + كود إستدعاء لملف أجاكس :bigsmile:

^ إن وجدت مسافات قم بحذفها :cupidarrow:

الآن العمل الجدي ومهو ملف "create_image.php" والذي يقوم بتوليد الصورة الخاصة بالتحقق :

رمز PHP:


أولآ الملف بدأناه بـ جلسة جديدة لكي يكون التحقق بالكوكيز أي الجلسات :bigsmile:

وقمت بعمل دالة تقوم بعمل رمز عشوائي ومكون من حروف وأرقام + لم أضف حرف الـ "o" لكي لآ يكون هناك أغلاط أو تشابه مع رقم الـ "0" الصفر !

هناك أيضا الطريقة التقليدية وهي تكوين الرمز بإستعمال تشفير الـ "MD5" ولكي تقوم باستمالها فقط أزل "//" قبلها كالتالي :

رمز PHP:
$md5_hash = md5(rand(0,999));


وأيضا يجب إزالة "//" من امام المتغير "security_code" لصبح كالتاالي :
رمز PHP:

// $security_code = substr($md5_hash, 15, 8);
$security_code = substr($activatecode, 15, 8);


وفي البداية قلت رآح نتحقق عبر نظام الجلسات وهنا كود يوضح كلآمي :

رمز PHP:
$_SESSION["security_code"] = $security_code;


في الكود السابق جعلنا الرمز العشوائي في الجلسة المسماه بإسم "security_code"

وأيضا هناك كود عمل الصورة !

وأيضا بنها كود قمت بحجبه وهو كود لعمل خطوط على الأحرف ليكون التأكد أقوى ولآ أرى أن له لزمة ولتفعيها هذا نقوم بإزالة "//" من كل سطر كالتالي :

رمز PHP:
ImageRectangle($image,0,0,$widt h-1,$height-1,$grey);
imageline($image, 0, $height/2, $widt h, $height/2, $grey);
imageline($image, $widt h/2, 0, $widt h/2, $height, $grey);


الآن النظام كآمل والكمآل لله وحده !

نأتي لطريقة التأكد في الصفحات المراد حمايتها ولتكن باسم "captcha" :

رمز PHP:



كما هو وآضح قمنا بعمل جلسة جديدة !

وتحققنا إن كان طلب الصفحة كان عبر "POST" وليس "GET" بهذا الكود :

رمز PHP:
if ($_SERVER["REQUEST_METHOD"] "POST")
die(
"You can only reach this page by posting from the html form");


الآن نقوم بالتحقق إن كان تم إدخال الرموز في الحقل المخصص وهذا المدخل يساوي الجلسة المخصصة التي قمنا بها !
وأيضا إن كان الحقلآن غير فارغان وأقصد بهما حقل الجلسة وحقل الرمز للتحقق !!

وهذا هو الكود :

رمز PHP:
if ( ($_REQUEST["txtCaptcha"] == $_SESSION["security_code"]) &&
(!empty(
$_REQUEST["txtCaptcha"]) && !empty($_SESSION["security_code"])) )



الآن قمنا بعمل كود التحقق وإن تم تحقق الشرط إطبع التالي :

رمز PHP:
Test successful!


وإن لم تتحقق الشروط إطبع التالي :

رمز PHP:
Test failed! Try again!


جميل الآن إنتهينا من كل شي تقريبا وبقي ملفات الجافا !

طبعا لن أقوم بشرحها ولآكن طريقة عملها تقوم بجلب صفحة التحقق والصورة بعد كل تحقق :nosweat:

الملف "ajax_captcha.js" :

رمز PHP:
//Gets the browser specific XmlHttpRequest Object
function getXmlHttpRequestObject() {
if (
windo w.XMLHttpRequest) {
return new
XMLHttpRequest(); //Mozilla, Safari ...
} else if (windo w.ActiveXObject) {
return new
ActiveXObject("Microsoft.XMLHTTP"); //IE
} else {
//Display our error message
ale rt("Your browser doesn't support the XmlHttpRequest object.");
}



}
//Our XmlHttpRequest object
var receiveReq = getXmlHttpRequestObject();
//Initiate the AJAX request
function makeRequest(url, param) {
//If our readystate is either not started or finished, initiate a new request
if (receiveReq.readyState == 4 || receiveReq.readyState == 0) {
//Set up the connection to captcha_test.html. True sets the request to asyncronous(default)
receiveReq.open("POST", url, true);
//Set the function that will be called when the XmlHttpRequest objects state changes
receiveReq.onreadystatechange = updatePage;

//Add HTTP headers to the request
receiveReq.setRequestHeader("Conten t-type", "application/x-www-form-urlencoded");
receiveReq.setRequestHeader("Conten t-length", param.length);
receiveReq.setRequestHeader("Connection", "close");

//Make the request
receiveReq.send(param);
}
}
//Called every time our XmlHttpRequest objects state changes
function updatePage() {
//Check if our response is ready
if (receiveReq.readyState == 4) {
//Set the conten t of the DIV element with the response text
documen t.getElementById('result').innerHTML = receiveReq.responseText;
//Get a reference to CAPTCHA image
img = documen t.getElementById('imgCaptcha');
//Change the image
img.src = 'create_image.php?' + Math.random();
}
}

//Called every time when form is perfomed
function getParam(theForm) {
//Set the URL
var url = 'captcha.php';
//Set up the parameters of our AJAX call
var postStr = theForm.txtCaptcha.nam e + "=" + encodeURIComponent( theForm.txtCaptcha.value );
//Call the function that initiate the AJAX request
makeRequest(url, postStr);
}


قم بحفظة في نفس المجلد !

الآن قم بإستعرآض الملف "index.php" وأخبرني برأيك في نظام التحقق :bigsmile:

مهم يوجد مسافات ببعض الكلمات والسبب يعود للفلترة في الموقع وقريبا سوف أقوم بإلغائها لنعطي المجآل للمبرمجين :d

الاكواد شبه منقولة .. أتمنى حفظ الحقوق عند النشر !


HaNniBaL KsA
www.r00t-s3c.com


الساعة الآن 01:55 AM

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.5.2 TranZ By Almuhajir


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227