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

مشكلة في إغلاق ثغرة sql injection من خلال الprepared statement

Flutter Dev

السؤال

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

اهلا ي اخوان ..

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

احتاج تطبيق الفكره على الكود التالي:

<?php

if ($_SERVER['REQUEST_METHOD']=='POST') 
{
    	include 'connt.php';
    $phone = $_POST['phone'];
    $password = $_POST['password'];

    
  $sql = "SELECT * FROM user WHERE phone='$phone' AND password='$password' ";
 
   $response = mysqli_query($con, $sql);
 
   $result = array();
 
   $result['login'] = array();
  
  
    if ( mysqli_num_rows($response) === 1 ) {
        
     
   $row = mysqli_fetch_assoc($response);

   

            
            $index['name'] = $row['name'];
           
 $index['phone'] = $row['phone'];
         
	 
        array_push($result['login'], $index);

   
         $result['success'] = "1";
        
    $result['message'] = "success";
        
    echo json_encode($result);

  
          mysqli_close($con);

      
    }

}

?>

 

 

<?php


$db_name = "XXXXX";
$mysql_username = "root";
$mysql_password = "";
$server_name = "localhost";
$con = mysqli_connect($server_name, $mysql_username, $mysql_password,$db_name);
 


if($con){
	
	echo"connection OK";
	
}
else{
	
echo	"conection not";
}

?>
  

 

 

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

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

تحياتي أستاذ مروان

في الكود يوجد جملة SQL وحيدة وهي عرضة للSQL injection وهي:

$sql = "SELECT * FROM user WHERE phone='$phone' AND password='$password' ";

وهي عرضة للSQL injection بسبب المتغيرات $password و $phone.

لذلك عليك تجهيز هذه الجملة أولا عن طريق الprepared statements.

نقوم بتجهيز الجملة بوضع علامة إستفهام مكان المتغيرات كالآتي:

$stmt = $mysqli->prepare("SELECT * FROM user WHERE phone=? AND password=?");

وبعد ذلك نقوم بربط علامات الإستفهام بالمتغيرات التي نريد تمريرها إلى الجملة كالآتي:

$stmt->bind_param("ss", $phone, $password);

إذا كان المتغير phone$ من النوع int يجب تغيير الparameter الأول إلى "is" وتصبح الجملة كالآتي:

$stmt->bind_param("is", $phone, $password);

بالتالي يكون الكود الكامل لتجهيز الجملة وتنفيذها هو:

$stmt = $mysqli->prepare("SELECT * FROM user WHERE phone=? AND password=?");
$stmt->bind_param("ss", $phone, $password);
$result $stmt->execute();

ويمكنك التعامل مع الresult المرجعة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 6 دقائق مضت قال مصطفى القباني:

تحياتي أستاذ مروان

في الكود يوجد جملة SQL وحيدة وهي عرضة للSQL injection وهي:


$sql = "SELECT * FROM user WHERE phone='$phone' AND password='$password' ";

وهي عرضة للSQL injection بسبب المتغيرات $password و $phone.

لذلك عليك تجهيز هذه الجملة أولا عن طريق الprepared statements.

نقوم بتجهيز الجملة بوضع علامة إستفهام مكان المتغيرات كالآتي:


$stmt = $mysqli->prepare("SELECT * FROM user WHERE phone=? AND password=?");

وبعد ذلك نقوم بربط علامات الإستفهام بالمتغيرات التي نريد تمريرها إلى الجملة كالآتي:


$stmt->bind_param("ss", $phone, $password);

إذا كان المتغير phone$ من النوع int يجب تغيير الparameter الأول إلى "is" وتصبح الجملة كالآتي:


$stmt->bind_param("is", $phone, $password);

بالتالي يكون الكود الكامل لتجهيز الجملة وتنفيذها هو:


$stmt = $mysqli->prepare("SELECT * FROM user WHERE phone=? AND password=?");
$stmt->bind_param("ss", $phone, $password);
$result $stmt->execute();

ويمكنك التعامل مع الresult المرجعة.

اهلا بك اخي الكريم

في البداية ربي يعطيك الف صحه وعافيه عزيزي ويزيدك من واسع فضله من العلم باذن الله 

اول نقطة افهمك من كلامك ان كل المشكلة في هذا اول 3 اسطر الي فيها الاستعلام فقط اما باقي الملف لا يتغير شكله سوى كان josn او لا.

الان قمت بتطبيق ما ذكرته لي وظهر لي الخطا التالي 

( ! ) Parse error: syntax error, unexpected '$stmt' (T_VARIABLE) in C:\wamp64\www\login.php on line 10

ويمكنك التعامل مع الresult المرجعة ... بنسبة ل هذا الي فهمته رح يبقا شكل الكود على ما هو عليه صحيح ذلك؟

 

 

الكود كامل الان كالتالي:

 

<?php


    	include 'conn.php';
    $phone = $_POST['phone'];
    $password = $_POST['password'];

$stmt = $mysqli->prepare("SELECT * FROM user WHERE phone=? AND password=?");
$stmt->bind_param("ss", $phone, $password);
$result $stmt->execute();

   $response = mysqli_query($con , $sql);

   $result = array();

   $result['login'] = array();
  
if ( mysqli_num_rows($response) === 1 ) {
        
     
$row = mysqli_fetch_assoc($response);

             
$index['name'] = $row['name'];
           
 $index['phone'] = $row['phone'];
         
	 
        array_push($result['login'], $index);

   
         $result['success'] = "1";
        
    $result['message'] = "success";
        
    echo json_encode($result);

  
          mysqli_close($mysqli );

      
    }



?>

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

العفو لا شكرا على واجب، بالنسبة للخطأ كان هناك خطأ في الكتابة جرب مرة أخرى:

$stmt = $mysqli->prepare("SELECT * FROM user WHERE phone=? AND password=?");
$stmt->bind_param("ss", $phone, $password);
$response =  $stmt->execute();

بالنسبة لتغير باقي الكود أم لا، أعتقد أنه لا يجب التغيير فيه، للتأكد من ذلك عليك مقارنة الreturn type للmysqli_query المستخدمة في الكود الأصلي، والmysqli_stmt::execute

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 5 دقائق مضت قال مصطفى القباني:

العفو لا شكرا على واجب، بالنسبة للخطأ كان هناك خطأ في الكتابة جرب مرة أخرى:


$stmt = $mysqli->prepare("SELECT * FROM user WHERE phone=? AND password=?");
$stmt->bind_param("ss", $phone, $password);
$response =  $stmt->execute();

بالنسبة لتغير باقي الكود أم لا، أعتقد أنه لا يجب التغيير فيه، للتأكد من ذلك عليك مقارنة الreturn type للmysqli_query المستخدمة في الكود الأصلي، والmysqli_stmt::execute

 طيب عزيزي الحين عدلت الكود واصبح كالتالي:

<?php


    	include 'conn.php';
    $phone = $_POST['phone'];
    $password = $_POST['password'];

$stmt = $mysqli->prepare("SELECT * FROM user WHERE phone=? AND password=?");
$stmt->bind_param("ss", $phone, $password);
$response =  $stmt->execute();

   $response = mysqli_query($con , $sql);

   $result = array();

   $result['login'] = array();
  
if ( mysqli_num_rows($response) === 1 ) {
        
     
$row = mysqli_fetch_assoc($response);

             
$index['name'] = $row['name'];
           
 $index['phone'] = $row['phone'];
         
	 
        array_push($result['login'], $index);

   
         $result['success'] = "1";
        
    $result['message'] = "success";
        
    echo json_encode($result);

  
          mysqli_close($mysqli );

      
    }



?>

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

 

المشكلة كالتالي:

eee.png.62588e71e8b6e87cc267e24ff4651637.png

قمت بوضعها كصوره عشان تكون اوضح

 

 

بتاريخ 30 دقائق مضت قال مصطفى القباني:

العفو لا شكرا على واجب، بالنسبة للخطأ كان هناك خطأ في الكتابة جرب مرة أخرى:


$stmt = $mysqli->prepare("SELECT * FROM user WHERE phone=? AND password=?");
$stmt->bind_param("ss", $phone, $password);
$response =  $stmt->execute();

بالنسبة لتغير باقي الكود أم لا، أعتقد أنه لا يجب التغيير فيه، للتأكد من ذلك عليك مقارنة الreturn type للmysqli_query المستخدمة في الكود الأصلي، والmysqli_stmt::execute

صار معي ربي يعطيك العافيه اخي تسلم 

تم التعديل في بواسطة مروان مروان3
رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...