php  نقل البيانات عبر عنوان الويب

php التأكد من وجود البيانات

آخر تحيين: 09-01-2015

php نقل البيانات عبر الإستمارة php حماية البيانات ، ثغرة : XSS


التأكد من وجود البيانات : isset()

يجب دائما التأكد من وجود البيانات التي ننتظرها ، في بعض الأحيان قد تكون مختلفة عما تودونه ، مثلا إذا كنت أنتظر $_GET['name']; و كتبت سهوا $_GET['names']; فسيشعرني الخادوم بوجود خطأ ، كالآتي :
Notice: Undefined index: names in C:\...\...\site\hello.php on line 10
و هذا النوع من الأخطاء له نتيجتان سلبيتان :
الأولى أنها تُنفر الزوار من موقعكم
و الثانية ، قد تقدّم معلومات جد مهمة للهايكر .

إذاً ، للتأكد من وجود البيانات التي ننشدها ، سنستعمل الدالة()isset مع شرط if...else
بكل بساطة ، سنختبر الشرط إن كان ما ننتظره موجودا ، سنقوم بعرض بياناتنا . أمّا إذا كان الشرط خاطئا ، سنخبر الزائر بعدم التلاعب معنا . و ستكون شيفرتنا أكثر حماية كالتالي :

<?php 
  if(isset($_GET['age'])) {   // التأكد من وجود البيانات
    $age= (int)$_GET['age'];  // حماية البيانات

    echo 'age= '.$age.'<br>';  // عرض البيانات
  }else{
    echo 'البيانات غير صحيحة ';
  }

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

<?php
$age= isset($_GET['age']) ? (int)$_GET['age'] : 'البيانات غير صحيحة';

echo $age;
?>

هذه الطريقة و إن كانت تبدو لكم غريبة نوعا ما أجدها جد عملية ، و هي تؤدي نفس وظيفة الشيفرة السابقة :

ـ isset($_GET['age']) : نتأكد من وجود البيانات بإضافة علامة استفهام بعدها .
ـ إن كان الشرط صحيحا فإن $age تساوي (int)$_GET['age']
ـ أما إذا كان خاطئا فإن $age تساوي النص الموجود بعد النقطتين .

يمكننا التأكد من أكثر من متغير في نفس الوقت :

<?php 
  if(isset($_GET['name']) AND isset($_GET['age'])) {
    $name = htmlspecialchars($_GET['name']);
    $age = (int)$_GET['age'];

    echo 'name = '.$name.'<br>';
    echo 'age= '.$age;
  }else{
    echo 'المرجو التأكد من المعلومات ، فهي غير صحيحة ';
  }
الدالة isset تقوم بالتأكد من وجود البيانات ، تذكروا بأنه حتى إن كان محتوى القيمة فارغ مثلا name=&age= ، فإن هذه التعليمة تعتبر البيانات موجودة و بالتالي فالشرط صحيح . إلا في حالة خاصّة ، و ذلك عندما يكون لدينا متغير قيمته تساوي null . مثال :
<?php
  $a = null;
  if(isset($a)) {
     echo ' تم تعيين المتغير '; // true
  }else{
     echo ' المتغير غير مُحدّد '; // false
  }
?>

هذه الشيفرة ستعطينا :
المتغير غير مُحدّد
رغم أننا قمنا بتعريف المتغير a$ لكن الدالة ()isset تعتبره غير مُعرّف ما دام يأخذ قيمة null.
هذه حالة خاصة ، لكن يجب أن تبقى حاضرة في أذهانكم .

لكن غالبا ما لا نريد لبياناتنا أن تكون فارغة . و للتأكد من ذلك نضيف تعليمة أخرى و هي empty()

php empty()

empty تعني "فارغ"
للتأكد من عدم فراغ المحتوى أيضا . نضيف empty كما استخدمنا isset ، كالتالي :

<?php 
  if(isset($_GET['age']) AND !empty($_GET['age'])) {  
    $age= (int)$_GET['age']; 

    echo 'age= '.$age.'<br>';
  }else{
    echo 'المرجو التأكد من المعلومات ، فهي غير صحيحة ';
  }

!empty: تعني ليس فارغا

هذه بياناتنا السابقة ، محمية و تم أيضا التأكد من صحتها

<?php
if (isset($_GET['pseudo']) AND !empty($_GET['pseudo'])) {
   $pseudo = htmlspecialchars($_GET['pseudo']);
   echo $pseudo;
} else {
   echo 'البيانات غير صحيحة';
}

if (isset($_GET['age']) AND !empty($_GET['age'])) {
   $age= (int)$_GET['age'];
   echo $age;
} else {
   echo 'البيانات غير صحيحة';
}

قطعتم أهم شوط في تأمين بياناتكم ، و تبدو الشيفرة أطول بكثير مما كانت عليه قبل حمايتها ، لكن الأهم هو اتباع الطرق السليمة و الإعتياد عليها ، فالطبع يغلب التطبع