توليد رموز كابتشا

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث

رموز كابتشا CAPTCHA (اختصار للعبارة Completely Automated Public Turing test to tell Computers and Humans Apart) هي اختبار لتحديد ما إذا كان المستخدم بشرًا أو لا.

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

مثال:

CAPTCHA: x9Pm72se
Input: x9Pm62es
Output: CAPTCHA Not Matched

CAPTCHA: cF3yl9T4
Input: cF3yl9T4
Output: CAPTCHA Matched

تخزّن مجموعة الحروف التي تولّدها هذه الخوارزمية في مصفوفة تحتوي على الحروف ضمن النطاقات (a-z, A-Z, 0-9) وبهذا يكون عدد العناصر في المصفوفة 62.

تنفيذ الخوارزمية

يمكن استخدام رقم عشوائي لتوليد رمز كابتشا فريد في كل مرة، ويمكن توليد الرقم العشوائي باستخدام دالة rand()‎ في لغة C++‎، وباستخدام الصيغة (rand()%62) يمكن توليد رقم عشوائي بين 0 و 61، ويُستخدم هذا الرقم كموقع في مصفوفة الحروف لتوليد حروف جديدة، وتكرّر هذه العملية وفقًا لطول الرمز المطلوب.

#include<bits/stdc++.h> 
using namespace std; 

// تعيد الدالة قيمة صحيحة إن كانت السلسلتان النصيتان المعطاتان متساويتين
bool checkCaptcha(string &captcha, string &user_captcha) 
{ 
    return captcha.compare(user_captcha) == 0; 
} 

// توليد رمز كابتشا بالطول المعطى
string generateCaptcha(int n) 
{ 
    time_t t; 
    srand((unsigned)time(&t)); 

    // الحروف التي ستستخدم لتوليد رمز كابتشا
    char *chrs = "abcdefghijklmnopqrstuvwxyzABCDEFGHI"
                "JKLMNOPQRSTUVWXYZ0123456789"; 

    // اختيار العدد المطلوب من الحروف عشوائيًا من مجموعة الحروف السابقة
    // وإضافتها إلى رمز كابتشا
    string captcha = ""; 
    while (n--) 
        captcha.push_back(chrs[rand()%62]); 

    return captcha; 
} 

// اختبار الدالة السابقة
int main() 
{ 
    // توليد رمز كابتشا عشوائي
    string captcha = generateCaptcha(9); 
    cout << captcha; 

    // نطلب من المستخدم إدخال الرمز
    string usr_captcha; 
    cout << "\nEnter above CAPTCHA: "; 
    cin >> usr_captcha; 

    // تنبيه المستخدم حول حالة التطابق
    if (checkCaptcha(captcha, usr_captcha)) 
        printf("\nCAPTCHA Matched"); 
    else
        printf("\nCAPTCHA Not Matched"); 

    return 0; 
}

يمكن استخدام الدالة randomrange()‎ الموجودة في وحدة random في لغة بايثون لتوليد رقم صحيح غير عشري عشوائي ضمن النطاق المعطى للدالة.

import random

# تولد الدالة رمز كابتشا بالطول المطلوب
def generateCAPTCHA(n):
    # الحروف والأرقام المستخدم في توليد رمز كابتشا
    chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
    CAPTCHA = ''

    # اختيار العدد المطلوب من الحروف عشوائيًا من مجموعة الحروف السابقة
    # وإضافتها إلى رمز كابتشا
    while n > 0:
        CAPTCHA = CAPTCHA + chars[int(random.randrange(62))]
        n -= 1
    return CAPTCHA

# اختبار الدالة السابقة
if __name__ == '__main__':
    # توليد رمز كابتشا عشوائي
    CAPTCHA = generateCAPTCHA(9)
    print(CAPTCHA)
    
    # نطلب من المستخدم إدخال الرمز
    usr_CAPTCHA = input("Enter above CAPTCHA:")
    
    # تنبيه المستخدم حول حالة التطابق
    if (CAPTCHA == usr_CAPTCHA):
        print("\nCAPTCHA Matched")
    else:
        print("\nCAPTCHA Not Matched")

مصادر