اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

يمكنك استخدام رمز CSRF و هو رمز مميز يتم إنشاؤه لكل طلب فورم ويتم التحقق منه عند إعادة تقديم الفورم، يمكن أن يساعد في منع تكرار تقديم البيانات، أو كحل آخر يمكنك استخدام حالة الجلسة (Session State) حيث يتم تخزين حالة الفورم بعد تقديمها في الجلسة لتتبع ما إذا كان الفورم قد تم تقديمه من قبل أم لا، 

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

 

  • 0
نشر

هذا يعتمد  على ما الذي تقصده . هل تقصد إذا قام بإرسال بيانات لا يحق له إرسالها مرة أخري ؟ أم يحق له إرسال بيانات أكثر من مرة ولكن لا تتكرر ؟

على العموم يوجد أكثر من حل من خلال ال Session أو من خلال قاعدة البيانات .

  • استخدام الجلسات (Sessions):

عندما يتم إرسال البيانات لأول مرة من خلال الفورم قم بتخزين متغير والذى يدل على أنه تم إرسال البيانات في جلسة المستخدم.

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

// في صفحة إرسال الفورم
session_start();
if (isset($_SESSION['form_submitted'])) {
    // لا تسمح بإرسال البيانات مرة أخرى
    // يمكنك عرض رسالة خطأ أو إعادة توجيه المستخدم إلى صفحة أخرى
} else {
    // معالجة البيانات هنا
    // ...
    $_SESSION['form_submitted'] = true;
}
  • استخدام من قاعدة البيانات:

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

 

  • 0
نشر
بتاريخ On 9‏/7‏/2024 at 18:23 قال محمد عاطف17:

هذا يعتمد  على ما الذي تقصده . هل تقصد إذا قام بإرسال بيانات لا يحق له إرسالها مرة أخري ؟ أم يحق له إرسال بيانات أكثر من مرة ولكن لا تتكرر ؟

على العموم يوجد أكثر من حل من خلال ال Session أو من خلال قاعدة البيانات .

  • استخدام الجلسات (Sessions):

عندما يتم إرسال البيانات لأول مرة من خلال الفورم قم بتخزين متغير والذى يدل على أنه تم إرسال البيانات في جلسة المستخدم.

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

// في صفحة إرسال الفورم
session_start();
if (isset($_SESSION['form_submitted'])) {
    // لا تسمح بإرسال البيانات مرة أخرى
    // يمكنك عرض رسالة خطأ أو إعادة توجيه المستخدم إلى صفحة أخرى
} else {
    // معالجة البيانات هنا
    // ...
    $_SESSION['form_submitted'] = true;
}
  • استخدام من قاعدة البيانات:

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

 

انا اقصد... لا اريد ارسال معلومات أكثر من مرة... يعني المتقدم يستطيع ارسال العديد من المعلومات لكن غير مكرره... كيف يتم ذلك 

  • 0
نشر
بتاريخ On 11‏/7‏/2024 at 15:50 قال Baker Mohammed:

انا اقصد... لا اريد ارسال معلومات أكثر من مرة... يعني المتقدم يستطيع ارسال العديد من المعلومات لكن غير مكرره... كيف يتم ذلك 

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

وهناك طرق مختلفة مثل استخدام قاعدة البيانات لمنع تكرار تلك البيانات من خلال التحقق من البيانات المرسلة في قاعدة البيانات وإن كانت مكررة يتم رفضها والتعامل معها حسب ما تريده مثل رفض الطلب من الأساس، مثل التالي في ملف معالجة الطلب:

<?php
$data = $_POST;
$db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $db->prepare('SELECT COUNT(*) FROM submissions WHERE data = :data');
$stmt->execute(['data' => serialize($data)]);
if ($stmt->fetchColumn() > 0) {
    header('Location: error.php');
    exit;
} else {
    $stmt = $db->prepare('INSERT INTO submissions (data) VALUES (:data)');
    $stmt->execute(['data' => serialize($data)]);
}

 أو من خلال التعرف على المستخدم من خلال id معين وربط ذلك بالبيانات التي يرسلها، ثم مقارنًة البيانات التالية بالبيانات الخاصة به ورفض الطلب إن كانت مكررة. 

أو من خلال طريقة Checksum-based وهي الأفضل حسب ما فهمت ما تريد تنفيذه، عند إرسال النموذج، نستخدم دالة هاش (مثل MD5, SHA1, SHA256) لإنشاء Checksum للبيانات المرسلة، وتضمين جميع الحقول المهمة التي تريدين التحقق منها في عملية حساب الـ Checksum.

ولديك دالة sha256 لحساب ذلك.

ثم تخزين الـ Checksum المحسوب في جدول خاص بقاعدة البيانات واستخدام حقل UNIQUE لضمان عدم تكرار قيمة الـ Checksum في الجدول.

عند إرسال نموذج جديد، يتم حساب الـ Checksum للبيانات المرسلة بنفس الطريقة السابقة والتحقق من وجود الـ Checksum المحسوب في جدول قاعدة البيانات.

لو كان الـ Checksum موجودًا، فيعني أن نفس البيانات تم إرسالها من قبل، ويتم عرض رسالة خطأ للمستخدم، وإن لم يكن الـ Checksum موجودًا، فيعني أن البيانات جديدة، ويتم إضافتها إلى قاعدة البيانات ومعالجتها كالمعتاد.

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...