القائمة الرئيسية

الصفحات

كيفية إنشاء تسجيل آمن باستخدام PHP مع كلمة المرور

 

كيفية إنشاء تدفق تسجيل آمن باستخدام PHP وتجزئة كلمة المرور


يبدو أن إنشاء نموذج تسجيل مستخدم آمن باستخدام PHP مهمة مخيفة. كيف أحمي نفسي من حقن MySQL وطرق القرصنة الأخرى. والمثير للدهشة أنه باتباعك خطوات واحتياطات قليلة فقط ، يمكنك تقليل فرص نجاح الهجمات بشكل كبير.


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

<?php

// Replace $user and $pass with strong values for production
$host = 'localhost';
$db   = 'new_db';
$user = 'root';
$pass = '';

$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
$dsn = "mysql:host=$host;dbname=$db";
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

?>

قم بتأسيس اتصال قاعدة البيانات الخاصة بك باستخدام PDO . يمكنك نسخ ولصق ما ورد أعلاه وأنت على ما يرام.

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

<?php

// Get form field values
    $fname              = filter_input(INPUT_POST, 'fname', FILTER_SANITIZE_STRING);
    $email              = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
    $pwd                = filter_input(INPUT_POST, 'password');
    $pwd_confirm        = filter_input(INPUT_POST, 'confirm-password');

?>

تأكد من عدم استخدام FILTER_SANITIZE_STRING في كلمة المرور لأنك لا تبطل صلاحية كلمة مرور المستخدم. قد يرغب شخص ما ، وخاصة الأشخاص المتمرسين في مجال التكنولوجيا ، في الحصول على شيء مثل "<script>" كجزء من كلمة المرور الخاصة بهم.

<?php

$activation_key     = bin2hex(random_bytes(15));
$activation_link    = 'https://www.example.com/activate?id='.$activation_key.'&name='.$fname;

?>

قم بإنشاء مفتاح تنشيط واطلب من المستخدمين الجدد تأكيد تسجيل حسابهم عبر البريد الإلكتروني. سيؤدي هذا إلى تقليل عدد حسابات البريد العشوائي بشكل كبير. في حالتي ، اعتدت

bin2hex

لإنشاء سلسلة عشوائية مكونة من 15 حرفًا لتجنب أي تعارضات في حالة اشتراك عدد كبير من المستخدمين في موقعك. أضفت أيضًا الاسم الأول للمستخدم إلى السلسلة ، والتي يمكنني بعد ذلك التحقق من جانب الخادم.

<?php 

// Check if passwords match
    if ($pwd !== $pwd_confirm) {
        $errors[] = "Passwords don't match";
    }

    // Check if password is secure
    if (strlen($pwd) < 8) {
        $errors[] = "Password not long enough! Must be at least 8 characters long";
    }

    // Check if username equals password
    if ($fname === $pwd) {
        $errors[] = "Your name cannot be your password!";
    }

?>

أنا الآن أتحقق من وجود أخطاء في إرسال النموذج. لاحظ أن التحقق مما إذا كانت كلمة المرور آمنة ليس معقدًا جدًا في هذه المرحلة. أوصي بإجراء مزيد من عمليات التحقق ، مثل الأحرف الكبيرة وغير الكبيرة ، والأحرف الخاصة وما إلى ذلك. يمكنك القيام بذلك باستخدام تعبير عادي .

<?php 

// Check if email address exists in database
    $email_query = $pdo->prepare("SELECT count(1) FROM users WHERE email = :email");
    $email_query->bindParam(':email', $email);
    $email_query->execute();
    $email_found = $email_query->fetchColumn();
    if ($email_found) {
        $errors[] = "Your email address is associated with another account.";
    }

?>

أتحقق أيضًا مما إذا كان عنوان البريد الإلكتروني موجودًا بالفعل في قاعدة البيانات. عندما انت

SELECT

 أو 

INSERT INTO

 القيم من / إلى قاعدة البيانات الخاصة بك ، استخدم دائمًا عبارات تحضير وربط المعلمات لتجنب إدخال SQL.

<?php 

// If no errors, continue with user account creation
    if (!$errors)
    {   
        // Hash password
        $hashed_password = password_hash($pwd, PASSWORD_DEFAULT);

        // Create database entry
        $create_account = $pdo->prepare("INSERT INTO users (first_name,email,password, activation_key) VALUES (:fname, :email, :password, :activation_key)");
        $create_account->bindParam(':fname', $fname);
        $create_account->bindParam(':email', $email);
        $create_account->bindParam(':password', $hashed_password);
        $create_account->bindParam(':activation_key', $activation_key);
        $create_account->execute();

        // Send out activation email
        $to=$email;
        $subject="Activate your account";
        $from = 'no-reply@example.com';
        $body='Thank you for creating your account, '.$fname.'. Please click on the following link to activate your account: <a href="'.$activation_link.'">'.$activation_link.'</a>';
        $headers = "From:".$from;
        mail($to,$subject,$body,$headers);

        // Redirect user to the dashboard
        header("Location: /dashboard.php");
        exit;
    }

?>

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


أخيرًا وليس آخرًا ، تريد إرسال بريد التفعيل الإلكتروني. في هذا المثال ، استخدمت وظيفة البريد () في PHP ولكنك قد ترغب في استخدام PHPMailer بدلاً من ذلك. أيضا ، قد ترغب في استخدام

http_build_query()

 لبناء سلسلة التنشيط في حالة عدم توافق الاسم الأول للمستخدم مع عنوان url ، على سبيل المثال استخدام علامات العطف

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

هل اعجبك الموضوع :

تعليقات