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

السؤال

نشر

السلام عليكم ورحمة الله وبركاته 

لدي كود التالي لتعديل بيانات لماذا عندما اطبع متغير يظهر كاملا اسم مستخدما لكن عندما اطبعه داخل input يطبع اول كلمة فقط 

مثلا اريد تعديل اسم تالي محمد خالد احمد يطبعه لكن انا اريد طبعه داخل input يطبعه محمد فقط 

مرفق كود ياريت تعديل من اخوة وكيف حماية مدخلات من حقن sql وطباعة html داخل input وبارك الله فيكم جميعا تحياتي .

update.php

Recommended Posts

  • 1
نشر

المشكلة التي تواجهها تحدث عندما تقوم بإدراج قيمة متغير داخل `input` في النموذج، حيث يجب أن تقوم بتضمين قيمة المتغير داخل علامات الاقتباس (`"`).

في هذا السياق، يمكنك تعديل محتوى الـ `input` في النموذج ليكون كالتالي:

<input type="text" class="form-control" name="fname" required value="<?php echo $fname ?>">

قمت بإضافة علامات الاقتباس حول `<?php echo $fname ?>`، وهذا يساعد في ضمان أنه عند طباعة القيمة في الـ `input`، يتم استخدام القيمة بكاملها، بما في ذلك الفراغات إذا كان هناك أي.

بالنسبة لحماية مدخلاتك من حقن SQL، يفضل دائمًا استخدام استعلامات معلمة محددة (`prepared statements`) بدلاً من تضمين القيم مباشرة في الاستعلام. يمكنك استخدام ميزات mysqli المدمجة لتحقيق ذلك.

لحماية طباعة HTML داخل `input`، يمكنك استخدام `htmlspecialchars` لتحويل الرموز الخاصة بـ HTML إلى ترميزها المقابل. على سبيل المثال:

<input type="text" class="form-control" name="fname" required value="<?php echo htmlspecialchars($fname, ENT_QUOTES, 'UTF-8') ?>">

هذا يضمن أن أي رموز HTML غير آمنة يتم تحويلها بشكل صحيح لتجنب حقن HTML.

  • 0
نشر
بتاريخ On 2‏/12‏/2023 at 15:34 قال Khaled Osama3:

المشكلة التي تواجهها تحدث عندما تقوم بإدراج قيمة متغير داخل `input` في النموذج، حيث يجب أن تقوم بتضمين قيمة المتغير داخل علامات الاقتباس (`"`).

في هذا السياق، يمكنك تعديل محتوى الـ `input` في النموذج ليكون كالتالي:

<input type="text" class="form-control" name="fname" required value="<?php echo $fname ?>">

قمت بإضافة علامات الاقتباس حول `<?php echo $fname ?>`، وهذا يساعد في ضمان أنه عند طباعة القيمة في الـ `input`، يتم استخدام القيمة بكاملها، بما في ذلك الفراغات إذا كان هناك أي.

بالنسبة لحماية مدخلاتك من حقن SQL، يفضل دائمًا استخدام استعلامات معلمة محددة (`prepared statements`) بدلاً من تضمين القيم مباشرة في الاستعلام. يمكنك استخدام ميزات mysqli المدمجة لتحقيق ذلك.

لحماية طباعة HTML داخل `input`، يمكنك استخدام `htmlspecialchars` لتحويل الرموز الخاصة بـ HTML إلى ترميزها المقابل. على سبيل المثال:

<input type="text" class="form-control" name="fname" required value="<?php echo htmlspecialchars($fname, ENT_QUOTES, 'UTF-8') ?>">

هذا يضمن أن أي رموز HTML غير آمنة يتم تحويلها بشكل صحيح لتجنب حقن HTML.

بارك الله فيك علي الرد اخي خالد في ميزان حسناتك فعلا علامة التنصيص المزدوجه كانت سبب في عدم اظهار بيانات في input 

بتاريخ 7 دقائق مضت قال ايمن ميلاد:

بارك الله فيك علي الرد اخي خالد في ميزان حسناتك فعلا علامة التنصيص المزدوجه كانت سبب في عدم اظهار بيانات في input 

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

 

index.php

  • 0
نشر

بالطبع اخي ايمن
حتي تعمل حمايه للبيانات يمكنك اتخاذ بعض الاجراءات 

1. تجنب استخدام الإدخالات المباشرة:
   تجنب استخدام البيانات المدخلة مباشرة في استعلام SQL بدون فحص أو تنقية. يمكن استخدام `mysqli_real_escape_string` لتنقية البيانات. ومع ذلك، يُفضل استخدام Prepared Statements (البنيات الجاهزة) بدلاً من ذلك.

   $fname = mysqli_real_escape_string($conn, $_POST['fname']);
   $course_name = mysqli_real_escape_string($conn, $_POST['course_name']);
   $course_code = mysqli_real_escape_string($conn, $_POST['course_code']);
   $mid_exam = mysqli_real_escape_string($conn, $_POST['mid_exam']);
   $fir_exam = mysqli_real_escape_string($conn, $_POST['fir_exam']);
   $final = mysqli_real_escape_string($conn, $_POST['final']);
   $id_code = mysqli_real_escape_string($conn, $_POST['id_code']);

2. التحقق من البيانات:
   يمكنك فحص نوع البيانات المدخلة للتأكد من تناسبها مع نوع البيانات المتوقع. على سبيل المثال:

   if (!is_numeric($mid_exam) || !is_numeric($fir_exam) || !is_numeric($final)) {
     // رسالة خطأ
   }

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

   if (empty($fname) || empty($course_name) || empty($course_code) || empty($mid_exam) || empty($fir_exam) || empty($final) || empty($id_code)) {
       // رسالة خطأ
   }

4. استخدام Prepared Statements:
   يُفضل استخدام Prepared Statements لتجنب هجمات حقن SQL. في PHP، يمكنك استخدام `mysqli` بالتالي:

   $stmt = $conn->prepare("INSERT INTO student (fname, course_name, course_code, mid_exam, fir_exam, final, id_code) VALUES (?, ?, ?, ?, ?, ?, ?)");
   $stmt->bind_param("sssssss", $fname, $course_name, $course_code, $mid_exam, $fir_exam, $final, $id_code);

   if ($stmt->execute()) {
       // تم الإدخال بنجاح
   } else {
       // خطأ في الإدخال
   }

   $stmt->close();

   باستخدام Prepared Statements، سيتم التعامل بشكل صحيح مع البيانات وتجنب تأثير هجمات حقن SQL.

 وهذا هو الكود كامل بعد التحسين

<?php
include 'database.php';
include 'navbar.php';

if (isset($_POST['submit'])) {
  // تنقية البيانات باستخدام mysqli_real_escape_string
  $fname = mysqli_real_escape_string($conn, $_POST['fname']);
  $course_name = mysqli_real_escape_string($conn, $_POST['course_name']);
  $course_code = mysqli_real_escape_string($conn, $_POST['course_code']);
  $mid_exam = mysqli_real_escape_string($conn, $_POST['mid_exam']);
  $fir_exam = mysqli_real_escape_string($conn, $_POST['fir_exam']);
  $final = mysqli_real_escape_string($conn, $_POST['final']);
  $id_code = mysqli_real_escape_string($conn, $_POST['id_code']);

  // التحقق من صحة البيانات
  if (empty($fname) || empty($course_name) || empty($course_code) || !is_numeric($mid_exam) || !is_numeric($fir_exam) || !is_numeric($final) || empty($id_code)) {
    echo '<div class="alert alert-danger text-center w-25" role="alert">
       الرجاء إدخال بيانات صحيحة
    </div>';
    header("refresh:2;url=index.php");
    exit();
  }

  // استخدام Prepared Statements لتجنب حقن SQL
  $stmt = $conn->prepare("INSERT INTO student (fname, course_name, course_code, mid_exam, fir_exam, final, id_code) VALUES (?, ?, ?, ?, ?, ?, ?)");
  $stmt->bind_param("sssssss", $fname, $course_name, $course_code, $mid_exam, $fir_exam, $final, $id_code);

  if ($stmt->execute()) {
    echo '<div class="alert alert-success text-center w-25" role="alert">
      تم حفظ البيانات بنجاح
    </div>';
    header("refresh:2;url=display.php");
  } else {
    echo '<div class="alert alert-danger text-center w-25" role="alert">
      حدث خطأ أثناء حفظ البيانات
    </div>';
    echo mysqli_error($conn);
  }

  $stmt->close();
}
?>

 

  • 0
نشر
بتاريخ 15 ساعة قال Khaled Osama3:

بالطبع اخي ايمن
حتي تعمل حمايه للبيانات يمكنك اتخاذ بعض الاجراءات 

1. تجنب استخدام الإدخالات المباشرة:
   تجنب استخدام البيانات المدخلة مباشرة في استعلام SQL بدون فحص أو تنقية. يمكن استخدام `mysqli_real_escape_string` لتنقية البيانات. ومع ذلك، يُفضل استخدام Prepared Statements (البنيات الجاهزة) بدلاً من ذلك.

   $fname = mysqli_real_escape_string($conn, $_POST['fname']);
   $course_name = mysqli_real_escape_string($conn, $_POST['course_name']);
   $course_code = mysqli_real_escape_string($conn, $_POST['course_code']);
   $mid_exam = mysqli_real_escape_string($conn, $_POST['mid_exam']);
   $fir_exam = mysqli_real_escape_string($conn, $_POST['fir_exam']);
   $final = mysqli_real_escape_string($conn, $_POST['final']);
   $id_code = mysqli_real_escape_string($conn, $_POST['id_code']);

2. التحقق من البيانات:
   يمكنك فحص نوع البيانات المدخلة للتأكد من تناسبها مع نوع البيانات المتوقع. على سبيل المثال:

   if (!is_numeric($mid_exam) || !is_numeric($fir_exam) || !is_numeric($final)) {
     // رسالة خطأ
   }

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

   if (empty($fname) || empty($course_name) || empty($course_code) || empty($mid_exam) || empty($fir_exam) || empty($final) || empty($id_code)) {
       // رسالة خطأ
   }

4. استخدام Prepared Statements:
   يُفضل استخدام Prepared Statements لتجنب هجمات حقن SQL. في PHP، يمكنك استخدام `mysqli` بالتالي:

   $stmt = $conn->prepare("INSERT INTO student (fname, course_name, course_code, mid_exam, fir_exam, final, id_code) VALUES (?, ?, ?, ?, ?, ?, ?)");
   $stmt->bind_param("sssssss", $fname, $course_name, $course_code, $mid_exam, $fir_exam, $final, $id_code);

   if ($stmt->execute()) {
       // تم الإدخال بنجاح
   } else {
       // خطأ في الإدخال
   }

   $stmt->close();

   باستخدام Prepared Statements، سيتم التعامل بشكل صحيح مع البيانات وتجنب تأثير هجمات حقن SQL.

 وهذا هو الكود كامل بعد التحسين

<?php
include 'database.php';
include 'navbar.php';

if (isset($_POST['submit'])) {
  // تنقية البيانات باستخدام mysqli_real_escape_string
  $fname = mysqli_real_escape_string($conn, $_POST['fname']);
  $course_name = mysqli_real_escape_string($conn, $_POST['course_name']);
  $course_code = mysqli_real_escape_string($conn, $_POST['course_code']);
  $mid_exam = mysqli_real_escape_string($conn, $_POST['mid_exam']);
  $fir_exam = mysqli_real_escape_string($conn, $_POST['fir_exam']);
  $final = mysqli_real_escape_string($conn, $_POST['final']);
  $id_code = mysqli_real_escape_string($conn, $_POST['id_code']);

  // التحقق من صحة البيانات
  if (empty($fname) || empty($course_name) || empty($course_code) || !is_numeric($mid_exam) || !is_numeric($fir_exam) || !is_numeric($final) || empty($id_code)) {
    echo '<div class="alert alert-danger text-center w-25" role="alert">
       الرجاء إدخال بيانات صحيحة
    </div>';
    header("refresh:2;url=index.php");
    exit();
  }

  // استخدام Prepared Statements لتجنب حقن SQL
  $stmt = $conn->prepare("INSERT INTO student (fname, course_name, course_code, mid_exam, fir_exam, final, id_code) VALUES (?, ?, ?, ?, ?, ?, ?)");
  $stmt->bind_param("sssssss", $fname, $course_name, $course_code, $mid_exam, $fir_exam, $final, $id_code);

  if ($stmt->execute()) {
    echo '<div class="alert alert-success text-center w-25" role="alert">
      تم حفظ البيانات بنجاح
    </div>';
    header("refresh:2;url=display.php");
  } else {
    echo '<div class="alert alert-danger text-center w-25" role="alert">
      حدث خطأ أثناء حفظ البيانات
    </div>';
    echo mysqli_error($conn);
  }

  $stmt->close();
}
?>

 

الله يرحم والديك اخي خالد سؤال لماذا وضعت علامات استفهام في جملة ادخال وماذا تقصد بي sssss  داخل bind_param("sssssss"

ماذا تعني $stmt هل هو مجرد اسم متغير 

بتاريخ 19 دقائق مضت قال ايمن ميلاد:

الله يرحم والديك اخي خالد سؤال لماذا وضعت علامات استفهام في جملة ادخال وماذا تقصد بي sssss  داخل bind_param("sssssss"

ماذا تعني $stmt هل هو مجرد اسم متغير 

بالبحث علي معني ssssssss وجدت انه تعني string وبما انه لدي 7 متغيرات لهذا كتبت 7 وقد تكون ii  يعني int  ياريت تشرح باقي سؤال 

  • 0
نشر
بتاريخ 11 ساعة قال ايمن ميلاد:

الله يرحم والديك اخي خالد سؤال لماذا وضعت علامات استفهام في جملة ادخال وماذا تقصد بي sssss  داخل bind_param("sssssss"

ماذا تعني $stmt هل هو مجرد اسم متغير 

بالبحث علي معني ssssssss وجدت انه تعني string وبما انه لدي 7 متغيرات لهذا كتبت 7 وقد تكون ii  يعني int  ياريت تشرح باقي سؤال 

تم وضع علامات استفهام في جملة الادخال بسبب استخدام prepared statements في PHP.

Prepared statements تسمح لنا بالاعداد مسبقا لعملية الادخال ولكن بدون تحديد القيم بعد. فالعلامات الاستفهام تعني ان هذه القيم سوف تعطى لاحقا قبل تنفيذ العملية.

اما بالنسبة ل$stmt فهو ليس مجرد اسم متغير بل هو object من نوع Statement يمثل العملية المعدة مسبقا. 

عندما نستخدم prepared statements فانه يتم انشاء عضو Statement وتخزين التعليمة المعدة فيه قبل تحديد القيم. ثم نستخدم ميثودات على هذا العضو لتعيين القيم وتنفيذ العملية مثل bind_param و execute.

بشكل مختصر:

- العلامات استفهام لان القيم لم تحدد بعد في التعليمة المعدة
- $stmt هو عضو Statement يمثل التعليمة المعدة قبل تحديد القيم

بتاريخ 9 ساعة قال ايمن ميلاد:

لماذا في كود تعديل عندما اضع عنصر html  يظهر بعد تعديل رغم استخداما دوال التي قلت عليه مرفق ملف 

update.php 3.7 kB · 1 تنزيل

السبب في ظهور العناصر ال HTML بعد تعديلها رغم استخدام دوال التنقية مثل mysqli_real_escape_string هو:

- دوال التنقية مثل mysqli_real_escape_string تقوم بتنقية البيانات فقط من أخطار الاقتحام عبر SQL Injection. 

- لكنها لا تقوم بتنقية البيانات من الشوائب أو الرموز ال HTML.

- فعندما نعدل بيانات تحتوي على عناصر HTML مثل <b>، <script> إلخ فسيظل هذا المحتوى HTML موجوداً.

- مثل ما اخبرتك سابقا 

بتاريخ On 2‏/12‏/2023 at 15:34 قال Khaled Osama3:

لحماية طباعة HTML داخل `input`، يمكنك استخدام `htmlspecialchars` لتحويل الرموز الخاصة بـ HTML إلى ترميزها المقابل. على سبيل المثال:

<input type="text" class="form-control" name="fname" required value="<?php echo htmlspecialchars($fname, ENT_QUOTES, 'UTF-8') ?>">

- لذا يجب إما تنقية البيانات يدوياً من الرموز الخطرة أو استخدام الدوال الخاصة بتنقية المحتوى HTML مثل strip_tags() أو htmlspecialchars().

- فهذه الدوال تقوم بترميز أو إزالة الرموز ال HTML لإبقاء البيانات آمنة عند عرضها.

لذا الحل هنا هو إما تنقية يدوية للبيانات أو استخدام دوال تنقية HTML أيضاً مع mysqli_real_escape_string.

  • 0
نشر
بتاريخ 16 ساعة قال Khaled Osama3:

تم وضع علامات استفهام في جملة الادخال بسبب استخدام prepared statements في PHP.

Prepared statements تسمح لنا بالاعداد مسبقا لعملية الادخال ولكن بدون تحديد القيم بعد. فالعلامات الاستفهام تعني ان هذه القيم سوف تعطى لاحقا قبل تنفيذ العملية.

اما بالنسبة ل$stmt فهو ليس مجرد اسم متغير بل هو object من نوع Statement يمثل العملية المعدة مسبقا. 

عندما نستخدم prepared statements فانه يتم انشاء عضو Statement وتخزين التعليمة المعدة فيه قبل تحديد القيم. ثم نستخدم ميثودات على هذا العضو لتعيين القيم وتنفيذ العملية مثل bind_param و execute.

بشكل مختصر:

- العلامات استفهام لان القيم لم تحدد بعد في التعليمة المعدة
- $stmt هو عضو Statement يمثل التعليمة المعدة قبل تحديد القيم

السبب في ظهور العناصر ال HTML بعد تعديلها رغم استخدام دوال التنقية مثل mysqli_real_escape_string هو:

- دوال التنقية مثل mysqli_real_escape_string تقوم بتنقية البيانات فقط من أخطار الاقتحام عبر SQL Injection. 

- لكنها لا تقوم بتنقية البيانات من الشوائب أو الرموز ال HTML.

- فعندما نعدل بيانات تحتوي على عناصر HTML مثل <b>، <script> إلخ فسيظل هذا المحتوى HTML موجوداً.

- مثل ما اخبرتك سابقا 

- لذا يجب إما تنقية البيانات يدوياً من الرموز الخطرة أو استخدام الدوال الخاصة بتنقية المحتوى HTML مثل strip_tags() أو htmlspecialchars().

- فهذه الدوال تقوم بترميز أو إزالة الرموز ال HTML لإبقاء البيانات آمنة عند عرضها.

لذا الحل هنا هو إما تنقية يدوية للبيانات أو استخدام دوال تنقية HTML أيضاً مع mysqli_real_escape_string.

اخي خالد بارك الله فيك ممكن تعمل لي كود تعديل باستخدامpdo  وبارك الله فيك 

update.php

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...