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

السؤال

نشر (معدل)

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

مرحبا ي اخوان.. لدي استفسار لو تكرمتو رح اضع نموذجين من ملفات  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);

?>

 

ياليت يكون مع الشرح بشكل مختصر حتى افهم الفكره ولكم جزيل الشكر

تم التعديل في بواسطة مروان مروان3

Recommended Posts

  • 1
نشر (معدل)

تحياتي أستاذ مروان
في النموذج الأول، لنفرض أن المتغير $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، يجب تجهيزه بهذه الطريقة.

بالتوفيق

تم التعديل في بواسطة مصطفى القباني
  • 1
نشر

مرحباً مروان ..
للحماية من ثغرة 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 بدون اي إطار عمل فسيتوجب عليك البحث عن الثغرات المشهورة و كيفية تجاوزها و تطبيق الحلول أما إن كنت تستخدم إطار عمل فستجد أنه قد تم توفير حلول لمُعظم الثغرات المشهورة من طرف مطورين الإطار 

بالتوفيق

  • 0
نشر

ايضا هل انا مجبور اني اعدل كل ملفات مشروعي او فقط ملفات في مواقع محدده؟ يعني مثلا عندي ملفات تعرض لي البيانات في listview مثلا هل تحتاج حمايه؟او فقط اعدل الملفات الي فيها insert مثل صفحة تسجيل عضويه وصفحة دخول بمعنى فيه مكان لداخل البيانات؟

  • 0
نشر
بتاريخ 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 بدون اي إطار عمل فسيتوجب عليك البحث عن الثغرات المشهورة و كيفية تجاوزها و تطبيق الحلول أما إن كنت تستخدم إطار عمل فستجد أنه قد تم توفير حلول لمُعظم الثغرات المشهورة من طرف مطورين الإطار 

بالتوفيق

ربي يعطيك الف صحه وعافيه عزيزي 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...