الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

درس انشاء كود التحقق او captcha

بدأه Abd Allatif في 29 أكتوبر 2012 · 15 رد · 4,770 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم اخواني .

كلنا يعرف او شاهد كود التحقق او ما يسمى بـ "captcha" و هي تستخدم عند التسجيل في الخدمات مثل "google mail ,hotmail" او عند التعليقات لكي يتم التعرف على رسائل التي تسمى بالسبام "spam"

مثلا التسجيل بعدد كبير من الحسابات أو ارسال عد من التعليقات فيتم استخدام ال"captcha" وهي اختصار ل

Completely Automated Public Turing test to tell Computers and Humans Apart

للتفريق بين الانسان والروبوت

وهذا الدرس سيشرح طريقة عمل كابتشا بسيطة بالتفصيل .

يوجد في الphp مكتبة تسمىGD وهي مسؤولة عن القيام بعمليات على الصور

اول ما نقوم به هو انشاء "مقبض" للصورة لانشاء صورة نستخدم الدالة التالية :

$image = imagecreatetruecolor(150, 60);

طبعا المدخل (انا ما لقيت كلمة مناسبة اكتر من هي :blush: ) الاول عرض الصورة و الثاني الارتفاع

الصورة رح تكون بدون لون (لون اسود) ولكي نلونها بلون معين نضع

$bgcolor = imagecolorallocate($image, 223, 225, 230);
imagefill($image, 0, 0, $bgcolor);

السطر الاول ل"تركيب اللون" المدخل الاول هو "مقبض" الصورة و الثاني قيمة اللون الاحمر و الثالث قيمة اللون الاخضر و الرابع الازرق طبعا القيمة تتراوح بين 0 -255

و السطر الثاني المدخل الاول هو "مقبض" للصورة و الثاني سينات المكان المراد استخدام اللون فيه و الثالث العينات و الرابع اللون نفسو

حاليا فد قمنا بتهيئة الصورة اوليا الان سنقوم بانشاء الكود الذي سيكتب على الصورة و يجب على هذا الكود ان يكون عشوائيا فلذلك سنقوم باستخدام السطور التالية :

$chars = 'abcdefghjkmnpqrstwxyz2345689';
for($x=0; $x<6; $x++)
{
    $key .= $chars[mt_rand(0, 28)];
}

طبعا المتغير chars يحوي على بعض الاحرف و الارقام (لا يفضل استخدام الصفر و ال o و غيرها من الاحرف المتشابها )

طبعا حلقة for تكرر لست مرات و في كل مرة يضاف حرف الى المتغير key الاختيار العشوائي للحروف يتم باستخدام الدالة mt_rand المدخل الاول هو العدد الاصغر والثاني العدد الاكبر و هي تقوم باخذ قيمة عشوائية بينهما

الان لدينا المتغير $key فيه الكود المكون من 6 محارف

الخطوة التالية هي كتابة النص على الصورة

$start_x_pos = 15;
$start_y_pos = 40;
for($y=0; $y<6;$y++)
{
    $x_pos = $start_x_pos + $y*20;
    $y_pos = $start_y_pos + (mt_rand(-10,+10));
   $color = imagecolorallocate($image, mt_rand(0,128), mt_rand(0,128), mt_rand(0,128));
   imagettftext($image,mt_rand(15,20),mt_rand(-10, 10), $x_pos,$y_pos,$color,'arial.ttf',$key[$y]);
}

$start_x_pos و $start_y_pos هي احداثيات اول حرف من الحروف طبعا حلقة

for من اجل كتابة كل حرف بلون مختلف و زاوية مختلفة و احداثيات مختلفة حتى تزداد صعوبة ادراكه من قبل بوت

$x_pos السينات النهائية للحرف طبعا يتم حسابها باضافة مسافة تتناسب طردا مع ترتيب الحرف

$y_pos العينات النهائية طبعا تضاف اليها او تطرح منها قيمة عشوائية كي لا يكون للحروف جميعها نفس العينات

ال $color لا داعي لشرحها

imagettftext($image,mt_rand(15,20),mt_rand(-10, 10), $x_pos,$y_pos,$color,'arial.ttf',$key[$y]);

هذا اهم سطر يتستخدم لكتابة الحرف على الصورة المدخلات :

الاول *** للصورة الثاني قياس الخط الثالث زاوية الكتابة الرابع السينات الخامس العينات السادس اللون

السابع مسار الخط يجب ان يكون لديك الخط في نفس المجلد و بنفس الاسم الذي قد قمت بتحديده او استخدم مسار اخر لملف الخط لديك

الثامن الحرف المراد طباعته

الان لكي نقوم بزيادة صعوبة قرائة الكود بالنسبة للبوت نقوم باضافة تاثير للتموج wave

$new_image = imagecreatetruecolor(150, 60);
$bgcolor = imagecolorallocate($new_image, 223, 225, 230);
imagefill($new_image, 0, 0, $bgcolor);
$wave_rand = mt_rand(6, 10);
for($i=0;$i<149;$i++)
{
    for($j=0;$j<59;$j++)
    {
        $color_here = imagecolorat($image, $i, $j);
        if($color_here == $bgcolor)
        {
            $color_here = imagecolorallocate($image, 223, 225, 230);
        }
        $nx = $i - ($wave_rand * sin ((14-$wave_rand)*3.1495*$j/180));
        imagesetpixel($new_image, $nx, $j, $color_here);
    }
}

قمنا بانشاء صورة جديدة حتى لا تختلط الصورتين مع بعضهم و وضعنا لون الخلفية نفس لون خلفية الصورة الاصلية ثم باستخدام حلقات ال for تم الوصول الة جميع بكسلات الصورة و من ثم تعديلها اذا لم تفهم السطر "المعقد" فانت لم تكن تحب المثلثات في الثانوي :happy: على كل حال يتم فيها كل بكسل حسب المعدلة المثلثية اللتي اغلبها فقط للتحويل من درجة الى راديانانا هنا لم استخدم دالة deg2rad فقط للتنويه

هنا اصبحت الصورة جاهزي الان لكي تظهر الصورة سنضع السطرين التاليين :

header('Content-type: image/jpeg');
imagejpeg($new_image)

طبعا بامكانك استخدام صيغة png اذا اردت

الان سنستخدم الجلسات لكي نحتفظ بقيمة الكود "المشفر بشفرة md5 طبعا"

لا ننسى السطر في اول الملف

session_start();

الان نقوم بتخزين الكود المشفر بمتحول

$_SESSION['key'] = md5($key);

وفي حال اردنا التحقق من الكود نقوم بتشفير الكود الذي ادخله المستخدم و من ثم نتحقق من المساواة

لكي تظهر الصورة نستخدم

<img src="php_captcha.php" />

انا قمت ببرمجة class كامل مع مميزات كثير جدا لكن المشكلة ان البور سبلاي لجهازي قد احترقت قبل العيد بيومين و السكربت عليه و انا في سوريا و الاشتباكات كانت في اوجها في وقفة العيد فلم اتمكن من شراء واحدة :sad: إن شاء الله عندما اشغل جهازي ساعرضها عليكم لابداء ارائكم فيها :)

صورة للدرس post-268329-005537200 1351467786_thumb.j

رابط تحميل الدرسphp_captcha.zip

تحياتي

المرفقات
2.jpg
4
#2

السلام عليكم

درس رائع سلمت يداك

ولكن لماذا تقوم بعمل إيقاف لعرض الأخطاء في الكود

error_reporting(0);

يكفيك في صفحة الـindex.php أن تستخدم دالة isset() للتحقق من وجود ضبط للـ$_GET['check'] كالتالي :

if(isset($_GET['check']) and $_GET['check']==1)

وبالنسبة للخطأ الموجود في الملف php_captcha.php فالخطأ من عدم تعريف المتغير $key قبل إستخدامه لأن الشكل التالي :

$key .= $chars[mt_rand(0, 27)];

يساوي طبعاً الشكل التالي :

$key = $key.$chars[mt_rand(0, 27)];

فإن لم يكن المتغير $key معرف قبل هذه الجملة سيحدث خطأ .

وهذه محاولتي على نفس الكود لخداع وتصعيب الأمر علي الـBot حتى لا يستطيع قراءة بيانات الصورة :)

php_captcha2.zip

شكراً لك , واصل دروسك القيمة ...

3

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#3

وعليكم السلام اخي

بصراحة اعجبتني الفكرة :happy: وإن شاء الله ساستخدمها في مشروعي

شكرا لتذكيرك ب "هدم" الصورة ان صح التعبير لكن نحن الاثنان قد نسينا هدم الصورة الاولى :lol:

imagedestroy($image);
imagedestroy($new_image);
1
#4

العوامل المهمة في اي كباتشا لتكون صعبة بعض من هذه الاجابات على الاسئلة التالية :

1- حجم الخط في كل حرف ثابت ام متغير ؟

2- نوع الخط في كل حرف ثابت ام متغير ؟

3- درجة العشوائية في مكان كل حرف ؟

4- درجة التموج والاستدارة في كل حرف ؟

5-هل هناك خطوط افقية ، رأسية ، عشوائية ؟!

6- هل هناك تشويش ؟ ( نقاط , دوائر , مثلثات ... )

7- الالوان , هل هي مختلفة ام متقاربة ؟!

8- الخلفية هل هي ثابتة ام متغيرة ؟

9 - عدد الحروف ( حروف و أرقام ) هل هو ثابت ام متغير ؟

10 - هل الكلمات لها دلالة معينة ام هي حروف بشكل عشوائي ؟

11 - درجة السهولة في القراءة لدى الانسان مقابل درجة الصعوبة في التحليل لدى البوت

من هذه الاجابات نحكم على اي كابتشا ونستطيع تقييمها

3

=============
الطموح و الحافز سر النجاح

=============

AflamHQ.com | Palphp.com

#5

السلام عليكم

اقتباس
بصراحة اعجبتني الفكرة happy.gif وإن شاء الله ساستخدمها في مشروعي
لك ذلك ولكن بعد دفع الرسوم happy.gif
اقتباس
شكرا لتذكيرك ب "هدم" الصورة ان صح التعبير لكن نحن الاثنان قد نسينا هدم الصورة الاولى laugh.gif
لا تعتب علي فهذه أول مره أكتب كود يتعامل مكتبة GD , بالإضافة لأني كثير النسيان بدرجه كبيره .

وكما أشار أستاذ حمدان في النقاط الواجب أخذها في الإعتيار جيداً وخصوصاً أخر بند منها .

ويمكن أيضاً إستخدام كابتشا السؤال والجواب فهي صعبه على البوت التنبؤ بها .

1

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#6
اقتباس
كابتشا السؤال والجواب فهي صعبه على البوت التنبؤ بها

أخي احمد , حتى نكون هنا واضحين في توصيل المعلومة , السؤال والجواب فقط على الصعيد المحتوى العربي يكون صعب بالنسبة للبوت , وذلك لقلة أو ندرة مطوري البوتات العربية.

اما اجنبيا ً فهي تعتبر اسهل طريقة لكسر التحقق , حتى لو كانت هناك درجة عشوائية كبيرة في الاسئلة والاجوبة

فنحن كمطورين نتوقع الذي لا يمكن توقعه من المستخدمين اي كان نوعهم .

=============
الطموح و الحافز سر النجاح

=============

AflamHQ.com | Palphp.com

#7

السلام عليكم

اقتباس
أخي احمد , حتى نكون هنا واضحين في توصيل المعلومة , السؤال والجواب فقط على الصعيد المحتوى العربي يكون صعب بالنسبة للبوت , وذلك لقلة أو ندرة مطوري البوتات العربية.

اما اجنبيا ً فهي تعتبر اسهل طريقة لكسر التحقق , حتى لو كانت هناك درجة عشوائية كبيرة في الاسئلة والاجوبة

فنحن كمطورين نتوقع الذي لا يمكن توقعه من المستخدمين اي كان نوعهم .

هذا في السكربتات العامة "أي مفتوحه المصدر" , ولكن لو كان السكربت خاص أو متصل بقاعدة بيانات فكيف للبوت الحصول على الإجابه إلا إذا تم تحليل وفهم معنى السؤال وبالتالي توليد إجابة - وطبعاً الإجابة تعني وجود قاعدة بيانات كبيره للبحث بها - .

- ربما أكون مخطئ في هذا ولكن هذا تصورى المبدئي للموضوع وكما قلت سابقاً فهذه أول مره أتعامل مع الكابتشا فإن كانت هناك أى خطأ فيما قلت فأرجو التوضيح .

ومعوماتي عن هذه الجزئية وهي أن البوت يقوم بتحليل الصفحة القادمه من السرفر ولهذا لجأ مطوري الكابتشا لإستخدام الصور ولكن في المقابل بدأء البوت بتحليل الصور للوصول لما تحويه من بيانات والتعرف عليها ولهذا بدأ نظام عملية تشويش البيانات الموجوده في الصورة بالنسبة للبوت وتجد أيضاً بعض المواقع تستخم كابتشا الصوت وإن إستطاع البوت تحليل الصوتيات فسيتم كسر الكابتشا أيضاً وهكذا مسبره تطوير الكابتشا وكسرها .

دمت بخير

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#8

هل معني هذا انه جوجد بوتات تستطيع كسر الـ captcha؟

1
#9
اقتباس
هذا في السكربتات العامة "أي مفتوحه المصدر" , ولكن لو كان السكربت خاص أو متصل بقاعدة بيانات فكيف للبوت الحصول على الإجابه إلا إذا تم تحليل وفهم معنى السؤال وبالتالي توليد إجابة - وطبعاً الإجابة تعني وجود قاعدة بيانات كبيره للبحث بها - .

- ربما أكون مخطئ في هذا ولكن هذا تصورى المبدئي للموضوع وكما قلت سابقاً فهذه أول مره أتعامل مع الكابتشا فإن كانت هناك أى خطأ فيما قلت فأرجو التوضيح

وعليكم السلام

اعطيك مثالاً الاسئلة الحسابية مثلا اسهل في التحليل من الاسئلة التي تعتمد على الاجابات.

بالنسبة للتحليل اخي احمد فهو معقد نوعا ما ولكن يمكن كسره ايضا

سأعود لك بمثال قريبا للتضح الصورة للجميع

تم تعديل هذه المشاركة بواسطة Hamdan Taima في 1 نوفمبر 2012 في 08:13

1

=============
الطموح و الحافز سر النجاح

=============

AflamHQ.com | Palphp.com

#10

انا اوافق الاخ حمدان

للاسف بعض المواقع العربية تستخدم عملية حسابية معقدة جدا للكابتشا

3+5 =

طبعا الارقام متغيرة والسؤال لا يكون على شكل صورة ولكن نص عادي يعني اي شخص لديه معلومات برمجية قليلة بالاضافة الى اتقان الجافا سكربت يستطيع ان يقوم "بكسرها"

طبعا الدرس لم يكن لانشاء كابتشا ذات ميزات كثيرة انما من اجل توضيح الفكرة لا غير :happy:

تم تعديل هذه المشاركة بواسطة linux web man في 2 نوفمبر 2012 في 02:18

#11

السلام عليكم

لم أكن أقصد تلك النوعية من الأسئلة " الأسئلة الحسابية " , ولكن قصدت الأسئلة العامة .

عموماً خطرت لي فكرة إستخدام النمط المتحرك من الصور GIF بدلاً من النمط الثابت , ولكن لو كانت الحروف ظاهرة في على مدار وقت عمل الصورة فسيكفي البوت أخذ لقطة للصورة لتحليلها ولكن إذا تم تشويش البيانات بحيث تظهر في وقت معين بصورة واضحة للمستخدم وجعلل هذا الزمن عشوائي من صورة إلى صورة لمزيد من التصعيب على البوت بالإضافة لباقي الأفكار السابقة التي تم ذكرها .

ولكن وجدت أن مكتبة GD لا تستطيع عمل هذا النوع من الصور ولكن أثناء بحثي عن طريقة لإنشاء الصور بإمتداد GIF

وجدت فئة تقوم بذلك ووجدت أيضاً صاحب هذه الفئة مطبق لفكرة الصور المتحركة على الكابتشا على هذا الرابط .

وهذا مثال :

post-254524-004206600 1351810378_thumb.g

بالإضافة لأني وجد أفكار جميلة في هذه الفئات كإستخدام النص الثلاثي الأبعاد في الصورة وتأثيرات أخرى جملية .

وهذا رابط الفئات مجمعه

أتمنى أن تطورها وتستفيد منها في مشروعك .

دمتم بخير

المرفقات
captcha.gif
1

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#12

الله يعطيك العافية اخي احمد على الرابط و خصوصا http://www.phpclasses.org/package/3355-PHP-Generate-rotated-text-with-a-3D-perspective.html

طبعا اخي احمد لم اكن اقصد ردك :blush:

تم تعديل هذه المشاركة بواسطة linux web man في 2 نوفمبر 2012 في 02:31

#13
اقتباس
هل معني هذا انه جوجد بوتات تستطيع كسر الـ captcha؟

نعم ويعتمد معظم مبرمجي البوتات على النظام المنتشر فمثلا كباتشا منتشره في مجله وورد بريس يمكن أن تجذب مبرمجي البوتات بشكل كبير نظرا لأن كسرها يعني إمكانيه التعليق مجانا وبسرعه على عدد كبير جدا من المواقع والتسجيل فيها والمشاركه وغيرها من الأمور التي تفيد صاحب البوت في عمل دعايه لمنتج أو موقع معين

اقتباس
ولكن وجدت أن مكتبة GD لا تستطيع عمل هذا النوع من الصور ولكن أثناء بحثي عن طريقة لإنشاء الصور بإمتداد GIF

من ناحيتي أستخدم برنامج خارجي ويمكن استخدامه كمكتبه من خلال دوال بي أتش بي وله مميزات كبيره وكثيره منها إنشاء صور متحركه gif ويمكن عمل صور ثلاثيه الأبعاد

قمت بإستخدام كباتشا من نوع آخر (يمكن كسرها بسهوله :) ولكنها جميله ) , تعتمد على سحب وإفلات صوره في مكان معين وعند الإفلات يتم إستدعاء md5 للكمله العشوائيه داخل حقل مخفي .

موضوع جميل :)

1

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#14

شكرا ً اخي على الدرس

النقاش في التعليقات جميل جدا و الاخوان حمدان واحمد اتحفونا بطرق جميل لتعقيد الكابتشا ، لكن الا تعتقدون ان الكابتشا امر عقيم وتضيع وقت المستخدم لتحديد هل هو بشر ام لا خصوصا ونحن في عصر السرعه ولا وقت للانتظار ، اعتقد انه لابد من ايجاد حلول اكثر ذكاء للتمييز بين البشر والالة .

لماذا لا تكون هناك خوارزميات ذكية تقدر تميز بين الانسان والروبوت بدون ان يضيع المستخدم وقته في ادخال احرف وارقام غبيه :wink:

مارأيكم في Panopticlick هل الروبوت كاسر الكابتشا يستطيع ان يكون له بصمة فريدة !!

1

M.B.O

Mohamed Bin Othman

إبن المكلا

يابني البشر ماذا فعلتم بالبشر !!

إسـألـنـي

#15

السلام عليكم

مكتبه رائعة أستاذ بسًّام

مرحباً أستاذ محمد , فعلاً الكابتشا هذه شي مزعج حقاً وخصوصاً للمستخدمين الجدد لشبكة الإنترنت , ولكن مازالت كبرى مواقع البريد تستخدم الكابتشا yahoo,Gmail,hotmail .

ولكن على صعيد المواقع الأخرى الغير متخصصة في تقديم خدمة البريد الإلكترونى فأنا أرى أن أفضل الطرق لعملية التسجبل فى الموقع أو إستخدام خدماته التى تخشى عليها من إقتحام البوت هو إستخدام عملية التحقق عبر أحد مزودي خدمات البريد الإلكتروني أو أحد المواقع الإجتماعية كـ yahoo,hotmail.gmail,facebook,twitter وبعد عملية الدخول عبر إحدي المواقع السابقة يمكنك تخزين بياناته لديك وتطلب منه إدخال رقم دخول خاص به ليتم الدخول مباشراً في المرات القادمة بدون عملية الرجوع والتحقق من أي من المواقع السابقة .

- من مميزات هذه العمليةأن المستخدم سيقوم بالدخول لموقعك من خلال اسم البريد الخاص به مباشراً والذي إعتاد عليه ولا داعي لعملية التسجبل المملة في كل موقع أريد أن أستخدم أحد خدماته .

تم تعديل هذه المشاركة بواسطة ahmedsaoud31 في 3 نوفمبر 2012 في 09:17

1

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#16
اقتباس
ماذا لا تكون هناك خوارزميات ذكية تقدر تميز بين الانسان والروبوت بدون ان يضيع المستخدم وقته في ادخال احرف وارقام غبيه :wink:

مارأيكم في Panopticlick هل الروبوت كاسر الكابتشا يستطيع ان يكون له بصمة فريدة !!

اهلا بك اخي محمد,

ما شاءا الله ارى جهود ممتازة لدى Panopticlick لتكوين بصمة فريدة لكل زائر ، على اي حال هي برمجية تفحص امكانية تتبع السجلات الخاصة بالمتصفح الخاص بك , اي تنبئنا باننا قادرون ان نعمل Tracking لاي متصفح لوجود بصمة فريدة له.

وهذا على الناحية القانونية اعتقد فيه شيء .

على الناحية الأخرى اخي الفاضل كما تعلم نحن كمطورين لا يمكن ان نستهين بعقول الآخرين , فالبوتات هي علم وله اصوله ويدخل في باب الذكاء الصناعي , الذي سيحاكي سلوك المستخدم العادي بل انه يحاكي ذكاءه ايضا .

فاستخدام الطرق والاختبارات كالكابتشا للتفريق بين الانسان والآلة شيء حتمى الا ادا تطورت التكنولوجيا بصورة تسمح لنا التفريق بين الانسان والآلة بشكل قاطع وهذا لا اجده الى الان ,

كما اشار اخي أحمد اغلب المواقع تستخدم عدة تقنيات للتفريق بين الانسان والآلة , الكابتشا احدهم , و قياس عدد الطلبات بالنسبة لزمن التصفح ايضا خيار آخر .

وربما الاشخاص الذين قاموا بالعمل على Spriders & Scrappers يفهمون ويعون ما اقصد , فانا واجهتني تحديات كبيرة اثناء انشاء مشاريع هدفها جلب محتوى من مواقع اخرى . بعضها يطلب الكابتشا , واخر يجبرك على التصفح بوتيرة معينة و اخر يجبرك على قبول شيء ما بشكل عشوائي .

ولكم التحية

2

=============
الطموح و الحافز سر النجاح

=============

AflamHQ.com | Palphp.com

مواضيع مشابهة