Flutter Dev نشر 22 يوليو 2020 أرسل تقرير نشر 22 يوليو 2020 (معدل) السلام عليكم ورحمة الله وبركاته مرحبا ي اخوان.. لدي استفسار لو تكرمتو رح اضع نموذجين من ملفات php واحتاج معرفة كيف ممكن احمي هذا النماذج من ثغرت SQL Injections انا استخدم قواعد mysql لحفظ بيانات تطبيقي اندرويد النموذج الاول: <?php include 'conntion.php'; $studentid = $_POST['studentid']; $CheckSQL = "SELECT * FROM student WHERE studentid='$studentid'"; $check = mysqli_fetch_array(mysqli_query($con,$CheckSQL)); if(isset($check)){ echo 'studentid Already Exist'; } else{ $sql = "SELECT * FROM student"; if ( mysqli_query($con, $sql) ) { $result["success"] = "1"; $result["message"] = "success"; echo json_encode($result); mysqli_close($con); } else { $result["success"] = "0"; $result["message"] = "error"; echo json_encode($result); mysqli_close($con); } } ?> النموذج الثاني: <?php include 'conntion.php'; $query = " Select * FROM student WHERE IsActive = 5; "; $result = mysqli_query($con, $query); $number_of_rows = mysqli_num_rows($result); $temp_array = array(); if($number_of_rows > 0) { while ($row = mysqli_fetch_assoc($result)) { $temp_array[] = $row; } } header('Content-Type: application/json'); echo json_encode(array("students"=>$temp_array)); mysqli_close($con); ?> ياليت يكون مع الشرح بشكل مختصر حتى افهم الفكره ولكم جزيل الشكر تم التعديل في 22 يوليو 2020 بواسطة مروان مروان3 اقتباس
1 مصطفى القباني نشر 23 يوليو 2020 أرسل تقرير نشر 23 يوليو 2020 (معدل) تحياتي أستاذ مروان في النموذج الأول، لنفرض أن المتغير $studentid قيمته تساوي الstring التالي: "1; DROP TABLE student;" وعند ترجمة الطلب الآتي: $CheckSQL = "SELECT * FROM student WHERE studentid='$studentid'"; يصبح: SELECT * FROM student WHERE studentid=1; DROP TABLE student; لذلك الكود به ثغرة sql injection. لتجنب ذلك لابد من إستخدام الprepared statements و parameterized queries. تنفيذ الprepared statement يكون على خطوتين، الأولى التجهيز prepare ثم التنفيذ execute.بما أنك تستخدم MySQLi يمكنك عمل ذلك عن طريق الآتي: $stmt = $mysqli->prepare("SELECT * FROM student WHERE studentid = ?") $stmt->bind_param('s', $studentid); $stmt->execute(); $result = $stmt->get_result(); في السطر الثاني ال's' تشير إلى أن نوع المتغير هو string، إذا كان studentid هو int عليك تغييره إلى 'i'. بهذه الطريقة تصبح العبارة آمنة، بسبب أن جزء الأمر مفصول عن جزء الداتا، والسبب في أي sql injection هو خلط البيانات بالأوامر، حيث يمكن تمرير أمر إلى الداتابيز في شكل داتا. بتاريخ 2 ساعات قال مروان مروان3: ايضا هل انا مجبور اني اعدل كل ملفات مشروعي او فقط ملفات في مواقع محدده؟ يعني مثلا عندي ملفات تعرض لي البيانات في listview مثلا هل تحتاج حمايه؟او فقط اعدل الملفات الي فيها insert مثل صفحة تسجيل عضويه وصفحة دخول بمعنى فيه مكان لداخل البيانات؟ أي أمر ترسله إلى الداتابيز سواء إضافة أو قراءة، ويكون في هذا الأمر parameter، يجب تجهيزه بهذه الطريقة. بالتوفيق تم التعديل في 23 يوليو 2020 بواسطة مصطفى القباني 1 اقتباس
1 سمير عبود نشر 23 يوليو 2020 أرسل تقرير نشر 23 يوليو 2020 مرحباً مروان .. للحماية من ثغرة SQL injection يُنصح دائما بإستعمال prepared statment و parameterized queries فمثلا إن كنت تستخدم PDO تستعمل الشيفرة التالية: <?php $stmt = $pdo->prepare('SELECT * FROM table_name WHERE name = :name'); $stmt->execute([ 'name' => $name ]); و إن كنت تستخدم MySQLi تستعمل الشيفرة التالية: <?php $stmt = $dbConnection->prepare('SELECT * FROM table_name WHERE name = ?'); $stmt->bind_param('s', $name); // 's' من أجل تعيين نوع المتغير => string $stmt->execute(); و للحماية من xss أي Cross-Site Scripting يُنصح بإستعمال الفلترة و التعقيم للبيانات التي تأتي من المُستخدم قبل تخزينها في قاعدة البيانات هناك قاعدة تقول لا تثق ابدا ً بمدخلات المستخدم موضوع الحماية كبير جداً و إذا كنت تستخدم pure php بدون اي إطار عمل فسيتوجب عليك البحث عن الثغرات المشهورة و كيفية تجاوزها و تطبيق الحلول أما إن كنت تستخدم إطار عمل فستجد أنه قد تم توفير حلول لمُعظم الثغرات المشهورة من طرف مطورين الإطار بالتوفيق 1 اقتباس
0 Flutter Dev نشر 22 يوليو 2020 الكاتب أرسل تقرير نشر 22 يوليو 2020 ايضا هل انا مجبور اني اعدل كل ملفات مشروعي او فقط ملفات في مواقع محدده؟ يعني مثلا عندي ملفات تعرض لي البيانات في listview مثلا هل تحتاج حمايه؟او فقط اعدل الملفات الي فيها insert مثل صفحة تسجيل عضويه وصفحة دخول بمعنى فيه مكان لداخل البيانات؟ اقتباس
0 Flutter Dev نشر 23 يوليو 2020 الكاتب أرسل تقرير نشر 23 يوليو 2020 بتاريخ 4 ساعات قال مصطفى القباني: تحياتي أستاذ مروان في النموذج الأول، لنفرض أن المتغير $studentid قيمته تساوي الstring التالي: "1; DROP TABLE student;" وعند ترجمة الطلب الآتي: $CheckSQL = "SELECT * FROM student WHERE studentid='$studentid'"; يصبح: SELECT * FROM student WHERE studentid=1; DROP TABLE student; لذلك الكود به ثغرة sql injection. لتجنب ذلك لابد من إستخدام الprepared statements و parameterized queries. تنفيذ الprepared statement يكون على خطوتين، الأولى التجهيز prepare ثم التنفيذ execute.بما أنك تستخدم MySQLi يمكنك عمل ذلك عن طريق الآتي: $stmt = $mysqli->prepare("SELECT * FROM student WHERE studentid = ?") $stmt->bind_param('s', $studentid); $stmt->execute(); $result = $stmt->get_result(); في السطر الثاني ال's' تشير إلى أن نوع المتغير هو string، إذا كان studentid هو int عليك تغييره إلى 'i'. بهذه الطريقة تصبح العبارة آمنة، بسبب أن جزء الأمر مفصول عن جزء الداتا، والسبب في أي sql injection هو خلط البيانات بالأوامر، حيث يمكن تمرير أمر إلى الداتابيز في شكل داتا. أي أمر ترسله إلى الداتابيز سواء إضافة أو قراءة، ويكون في هذا الأمر parameter، يجب تجهيزه بهذه الطريقة. بالتوفيق وصلت عزيزي كل الشكر لك عزيزي بتاريخ 2 ساعات قال عبود سمير: مرحباً مروان .. للحماية من ثغرة SQL injection يُنصح دائما بإستعمال prepared statment و parameterized queries فمثلا إن كنت تستخدم PDO تستعمل الشيفرة التالية: <?php $stmt = $pdo->prepare('SELECT * FROM table_name WHERE name = :name'); $stmt->execute([ 'name' => $name ]); و إن كنت تستخدم MySQLi تستعمل الشيفرة التالية: <?php $stmt = $dbConnection->prepare('SELECT * FROM table_name WHERE name = ?'); $stmt->bind_param('s', $name); // 's' من أجل تعيين نوع المتغير => string $stmt->execute(); و للحماية من xss أي Cross-Site Scripting يُنصح بإستعمال الفلترة و التعقيم للبيانات التي تأتي من المُستخدم قبل تخزينها في قاعدة البيانات هناك قاعدة تقول لا تثق ابدا ً بمدخلات المستخدم موضوع الحماية كبير جداً و إذا كنت تستخدم pure php بدون اي إطار عمل فسيتوجب عليك البحث عن الثغرات المشهورة و كيفية تجاوزها و تطبيق الحلول أما إن كنت تستخدم إطار عمل فستجد أنه قد تم توفير حلول لمُعظم الثغرات المشهورة من طرف مطورين الإطار بالتوفيق ربي يعطيك الف صحه وعافيه عزيزي اقتباس
السؤال
Flutter Dev
السلام عليكم ورحمة الله وبركاته
مرحبا ي اخوان.. لدي استفسار لو تكرمتو رح اضع نموذجين من ملفات php واحتاج معرفة كيف ممكن احمي هذا النماذج من ثغرت SQL Injections
انا استخدم قواعد mysql لحفظ بيانات تطبيقي اندرويد
النموذج الاول:
النموذج الثاني:
ياليت يكون مع الشرح بشكل مختصر حتى افهم الفكره ولكم جزيل الشكر
تم التعديل في بواسطة مروان مروان34 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.