الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[كلاس] Dssafer للحماية من ثغرات ال Xss, Sql Injection, Local File Include

بدأه DeaD SouL في 18 نوفمبر 2008 · 16 رد · 2,270 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

بســم الله الـرحمــن الرحيــم

اخواني الأعزاء..

كلاس الـ dsSafer هو صنف للحمايه من اخطار

  1. XSS
  2. SQL INJECTION
  3. LOCAL FILE INCLUDE
  4. REMOTE FILE INCLUDE

محتويات الصنف

1) المتغيرات العامه التي يستلزم اعدادها

$dsTags

يحتوي على الوسوم المسموحه، وهو من نوع نص، مثال

<div>,
,<a>

فإن تركتها فارغه.. فهذا يعني انه غير مسموح بأي وسم هتمل..

وان كتبت فقط 'all' فهذا يعني انك ترغب بالسماح بجميع وسوم الهتمل

$dsAttributes

وهو من نوع مصفوفه.. ويحتوي على وسوم الهتمل وخواصها المسموحه، مثال

array(
'img' => 'src,alt',
'a' => 'href'
);

فإن تركتها فارغه.. فإن هذا يعني أنك تسمح بجميع الخواص للوسوم المسموحه

$dsQuotes

وهو من نوع الثوابت المعروفه في الphp القيم المسموحه فيه هي:

ENT_COMPAT
ENT_QUOTES
ENT_NOQUOTES

$dsCharset

وهو متغير نصي، يحتوي على نوع الترميز المستخدم

$dsDBLink

وهو متغير نصي.. يحتوي على اسم المتغير الذي يحتوي على مقبض الاتصال بالقاعده

2) الدوال العامه وعملها:

الداله dsInclude()

وهي داله تقوم بنفس عمل require, require_once, include, include_once

فائدتها انها تقوم بتأكد من ان المستخدم لم يقم بمحاولة تغيير مسار المجلد او الملف المراد استدعائه..

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

$myPath = 'path/to/folder/to/file/';
$dsSafer = dsSafer();
$dsSafer->dsInclude('myPath');

الداله dsInput()

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

وتحتوي على 7 باراميترات.. 2 منهم هما الاجباريان

الباراميترات الاجباريه

$dsStr وهو النص المراد تأمينه.. سواء كان نص او متغير يحتوي على نص

$dsType وهو نوع التأمين المراد عمله على النص.. والانواع المتوفر هي

  • str يقوم هذا النوع بتأمين النص من اخطار ال xss دون ال sql inj معتمد في ذلك على الاعدادات السابقه في متغيرات الصنف العامه..
  • int يقوم بجل المتغير يحتوي على ارقام فقط.. فهو يأمن المتغير من اخطار ال xss وال sql inj
  • float لجعل المتغير من نوع قيمة عشريه
  • bool لجعل المتغير من نوع 0 او 1 (true,false)
  • array لجعل المتغير من نوع مصفوفه
  • sql لتأمين المتغير من اخطار ال xss وال sql ويتم استدعاء هذا النوع فقط للمتغيرات النصيه التي سيتم ادخالها للقاعده.. دون المتغيرات العدديه.. لأن نوع ال int يكفي بالنسبة للمتغيرات العدديه

الباراميترات الاختياريه..

$dsAllowedTags

$dsAllowedAttributes

$dsQuotesStyle

$dsUsedCharset

$dsUsedDBLink

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

الداله dsOutput()

وهي للتعامل مع ماتريد اخراجه للعرض او الطباعه

وتحتوي على 4 باراميترات.. 2 منهم اجبارين

الباراميترات الاجباريه

$dsStr وهو النص المراد اخراجه

$dsType وهو نوع الاخراج المراد عرضه.. والانواع هي

  • sql ان كان النص قد تم جلبه من القاعده.. فيجب اولا استدعاء هذا النوع ومن ثم احد الانواع التاليه
  • plain لتجريد النص من جميع وسوم الهتمل ومعاملته كنص عادي دون اي علاقه بالهتمل
  • html لعرض النص مع تطبيق مايحتويه من وسوم هتمل
  • code لعرض النص ووسوم الهتمل على هيئة وسوم مقروءة دون تطبيقها

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

$dsQuoteStyle

$dsUsedCharset

وينطبق عليهما ما سبق التكلم عنه في المتغيرات العامه للصنف ولذا الحكمه الموجوده في الداله dsInput()

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

<?php

$dsSafer = dsSafer();
//  الاعدادات
$dsSafer->dsCharset	= 'UTF-8';
$dsSafer->dsQuotes	 = ENT_QUOTES;
$dsSafer->dsDBLink	 = $link; //$link = the connection to mysql
$dsSafer->dsTags	   = '<br>,<b>,<i>,<p>,<div>,<hr>,<ul>,<ol>,<li>,<img>,<a>'; // 'all' = allow all tags && '' = allow none
$dsSafer->dsAttributes = array('img' => 'src,alt',  'a' => 'href' );


//  بدئ عملية الفلترة للمدخلات
$name = $dsSafer->dsInput($_POST['name'], 'str');
$title = $dsSafer->dsInput($_POST['title'], 'str');
echo $name;
echo $title;
//  او بطريقة اخرى ان كان لدينا محموعة متغيرات نريد تطبيق عملية الفلترة عليهم بنفس الخواص والقواعد
$dsSafer->dsInput(array('_POST'=>'name,title'), 'str');
echo $name;
echo $title;


// للمخرجات
$newsTitle = 'something'; // تم جلبه من قاعدة البيانات
$newsTitle = $dsSafer->dsOutput($newsTitle,'sql');
$newsTitle = $dsSafer->dsOutput($newsTitle,'html');
echo $newsTitle;

?>

لتحميل الصنف: إضغط هنا

اتمنى ان يكون مفيد لكم

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

بالتوفيق للجميع

أعتذر وبشده عن انقطاعي.. وذلك بسبب مشروعي الجديد

-------------------

100(سبحان الله وبحمده، سبحان الله العظيم) = 0 سيئة

-------------------

dssighg7.png

#2

ممتاز اخي DeaD SouL , لقد اعجبتنا طريقة استخدام الصنف ..

بالنسبه للكود , لم اتمكن من تحميله من على الربيد شير وغير مؤكد كذلك , يفضل لو تضعه كمرفقات ..

تحياتي ..

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

------------------------------------------------------------------------------------------------

gazabigBanner.jpg

------------------------------------------------------------------------------------------------

#3

شكرا جزيلا عزيزي محمد معاشر على هذا الاطراء

بالنسبة للصنف.. فهو في المرفقات

بانتظار الآراء والانتقادات.. ليتم التطوير وتعم الفائده

بالتوفيق

dsSafer.php.tar.gz

تم تعديل هذه المشاركة بواسطة DeaD SouL في 18 نوفمبر 2008 في 17:37

أعتذر وبشده عن انقطاعي.. وذلك بسبب مشروعي الجديد

-------------------

100(سبحان الله وبحمده، سبحان الله العظيم) = 0 سيئة

-------------------

dssighg7.png

#4

اعزائي

هناك بعض التعديلات..

قم بتحميل الكلاس بعد التعديلات من الرابط التالي الكلاس بعد التعديل

او قم باجراء التعديلات التاليه

السطر 124

استبدل هذا

$$dsVar = (Array_Key_Exists($dsVar,$dsMethod2)) ? $this->dsInuptTreatment($dsMethod2[$dsVar], $dsType, $dsAllowedTags, $dsAllowedAttributes, $dsQuotesStyle) :False;

بهذا

$$dsVar = (Array_Key_Exists($dsVar,$dsMethod2)) ? $this->dsInuptTreatment($dsMethod2[$dsVar], $dsType, $dsAllowedTags, $dsAllowedAttributes, $dsQuotesStyle,$dsUsedCharset,$dsUsedDBLink) :False;

السطر 128

استبدل هذا

$$dsVars = (Array_Key_Exists($dsVars,$dsMethod2)) ? $this->dsInuptTreatment($dsMethod2[$dsVars], $dsType, $dsAllowedTags, $dsAllowedAttributes, $dsQuotesStyle) :False;

بهذا

$$dsVars = (Array_Key_Exists($dsVars,$dsMethod2)) ? $this->dsInuptTreatment($dsMethod2[$dsVars], $dsType, $dsAllowedTags, $dsAllowedAttributes, $dsQuotesStyle,$dsUsedCharset,$dsUsedDBLink) :False;

السطر 133

استبدل هذا

$dsReturn = $this->dsInuptTreatment($dsStr, $dsType, $dsAllowedTags, $dsAllowedAttributes, $dsQuotesStyle);

بهذا

$dsReturn = $this->dsInuptTreatment($dsStr, $dsType, $dsAllowedTags, $dsAllowedAttributes, $dsQuotesStyle,$dsUsedCharset,$dsUsedDBLink);

في السطر 159

استبدل هذا السطر

$dsReturn = html_entity_decode($dsReturn, $dsQuoteStyle, $dsUsedCharset);

بهذا

$dsReturn = html_entity_decode($dsReturn, $dsQuotesStyle, $dsUsedCharset);

السطر 162

استبدل هذا

$dsReturn = ($this->dsMBConvert ? @mb_convert_encoding($dsReturn, $this->dsCharset, $this->dsCharset) : $dsReturn);

بهذا

$dsReturn = ($this->dsMBConvert ? @mb_convert_encoding($dsReturn, $dsUsedCharset, $dsUsedCharset) : $dsReturn);

السطر 164

استبدل هذا

$dsReturn = htmlentities($dsReturn, $this->dsQuotes, $this->dsCharset);

بهذا

$dsReturn = htmlentities($dsReturn, $dsQuotesStyle, $dsUsedCharset);

السطر 187

استبدل هذا

$dsReturn = html_entity_decode($dsReturn, $dsQuoteStyle, $dsUsedCharset);

بهذا

$dsReturn = html_entity_decode($dsReturn, $dsQuotesStyle, $dsUsedCharset);

السطر 190

استبدل هذا

$dsReturn = ($this->dsMBConvert ? @mb_convert_encoding($dsReturn, $this->dsCharset, $this->dsCharset) : $dsReturn);

بهذا

$dsReturn = ($this->dsMBConvert ? @mb_convert_encoding($dsReturn, $dsUsedCharset, $dsUsedCharset) : $dsReturn);

السطر 194

استبدل هذا

$dsReturn2 = @MySQL_Real_Escape_String($dsReturn,$this->dsDBLink);

بهذا

$dsReturn2 = @MySQL_Real_Escape_String($dsReturn,$dsUsedDBLink);

السطر 200

استبدل هذا

$dsReturn = htmlentities($dsReturn, $this->dsQuotes,$this->dsCharset);

بهذا

$dsReturn = htmlentities($dsReturn, $dsQuotesStyle,$dsUsedCharset);

السطر 244

استبدل هذا

$dsReturn = htmlentities($dsReturn, $this->dsQuotes,$this->dsCharset);

بهذا

$dsReturn = htmlentities($dsReturn, $dsQuoteStyle,$dsUsedCharset);

السطر 281

استبدل هذا

$text = ($this->dsMagicQuotes == 0) ? $text : $this->dsStripSlashes($text);

بهذا

$text = $this->dsStripSlashes($text);

بالتوفيق

dsSafer2.php.tar.gz

dsSafer3.php.tar.gz

تم تعديل هذه المشاركة بواسطة DeaD SouL في 20 نوفمبر 2008 في 09:57

أعتذر وبشده عن انقطاعي.. وذلك بسبب مشروعي الجديد

-------------------

100(سبحان الله وبحمده، سبحان الله العظيم) = 0 سيئة

-------------------

dssighg7.png

#5

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

اخي الكريم لو تضعه بالمرفقات بعد التعديل، جزاكم الله خيراً.

والفكرة رائعة ماشاء الله وإن شاء الله يكون مفيد جداً وبإذن الله نتشارك جميعاً في تطويره للأفضل.

#6

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

نسيت ان ارفقه :P

بالتوفيق

أعتذر وبشده عن انقطاعي.. وذلك بسبب مشروعي الجديد

-------------------

100(سبحان الله وبحمده، سبحان الله العظيم) = 0 سيئة

-------------------

dssighg7.png

#7

شكرا لك 00 اكيد سأجرب الكلاس وأتعلم منه 0 زادك الله علما وتوفيقا

mytrial_a.gif

نحن بحاجة لتدوين تجاربنا , نحن بحاجة إلى اكتشاف قيمة التجربة, هذه تجربتى مثيرة ومفيدة ...,

هنا
#8

لا شكر على واجب.. فلا خير في كاتم العلم

بالتوفيق عزيزي

أعتذر وبشده عن انقطاعي.. وذلك بسبب مشروعي الجديد

-------------------

100(سبحان الله وبحمده، سبحان الله العظيم) = 0 سيئة

-------------------

dssighg7.png

#9

هل من الممكن

ان ارسل للكلاس

$_post

$_get

وهي تتصرف معاهم ؟

#10
rewsh كتب:
هل من الممكن

ان ارسل للكلاس

$_post

$_get

وهي تتصرف معاهم ؟

نعم ممكن , مثلهاً مثل اي بيانات اخرى ..

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

------------------------------------------------------------------------------------------------

gazabigBanner.jpg

------------------------------------------------------------------------------------------------

#11

معلش انا جربت مثال لسه في الكلاس مشكله

بمعنى

ااذا ارسلت

مع <a>

جافا سكربت تمر بسلام ولاكاني اسند الى الفنكشن امر الازاره؟

جربت المثال المعطى في البرنامج

include("dsSafer3.php");
$dsSafer =new dsSafer();
//  الاعدادات
$dsSafer->dsCharset	= 'UTF-8';
$dsSafer->dsQuotes	 = ENT_QUOTES;
$dsSafer->dsDBLink	 = $link; //$link = the connection to mysql
$dsSafer->dsTags	   = '<br>,<b>,<i>,<p>,<div>,<hr>,<ul>,<ol>,<li>,<img>,<a>'; // 'all' = allow all tags && '' = allow none
$dsSafer->dsAttributes = array('img' => 'src,alt',  'a' => 'href' );

// للمخرجات
	foreach ($_POST as $key => $value)
	{
	$key = $dsSafer->dsOutput($value,'html');
	$key = $dsSafer->dsOutput($value,'str');
	$key = $dsSafer->dsOutput($value,'sql');
	echo $key;
	}

هل هذا الاستخدام صحيح ام لا

وعندي سؤال اخر

هل من الممكن اعطي الكلاس ال قيمه وهو يتشك عليهم كلهم

مافايده

html

str

sql

#12

لم افهمك نصف كلامك اخي ! ..

عموماً , راجع شرح الكلاس لتجد ضالتك ..

اقتباس
لداله dsOutput()

وهي للتعامل مع ماتريد اخراجه للعرض او الطباعه

وتحتوي على 4 باراميترات.. 2 منهم اجبارين

الباراميترات الاجباريه

$dsStr وهو النص المراد اخراجه

$dsType وهو نوع الاخراج المراد عرضه.. والانواع هي

* sql ان كان النص قد تم جلبه من القاعده.. فيجب اولا استدعاء هذا النوع ومن ثم احد الانواع التاليه

* plain لتجريد النص من جميع وسوم الهتمل ومعاملته كنص عادي دون اي علاقه بالهتمل

* html لعرض النص مع تطبيق مايحتويه من وسوم هتمل

* code لعرض النص ووسوم الهتمل على هيئة وسوم مقروءة دون تطبيقها

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

------------------------------------------------------------------------------------------------

gazabigBanner.jpg

------------------------------------------------------------------------------------------------

#13

عزيزي

قم بتحميل اخر اصدار من كلاس dsSafer

بالنسبة لاستخدامك فهو خاطئ..

الفرق بين الداله dsInput() و dsOutput()

الـ dsInput هي للتعامل مع القيم المرسله من المتصفح اما عن طريق المستخدم او عن طريق وصلة اخرى مثل

$_POST $_GET $_REQUEST $_SESSION $_COOKIE

اي للتعامل معها وانت في صفحة ال php اما لطباعتها او حفظها في القاعدة قبل او بعد اجراء بعض العمليات عليها

راجع اول مشاركه

اقتباس
الداله dsInput()

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

وتحتوي على 7 باراميترات.. 2 منهم هما الاجباريان

.....

اما ال dsOutput فهي للتعامل مع البيانات المستخرجه من القاعده والتي سبق وان قمت بتمريرها على الداله dsInput قبل حفظها

وتستخدم كذلك مع البيانات المرسله بعد تمريرها على الداله dsInput لتأمينها ومن ثم تقم بطباعتها بشكل آمن

راجع اول مشاركه

اقتباس
الداله dsOutput()

وهي للتعامل مع ماتريد اخراجه للعرض او الطباعه

وتحتوي على 4 باراميترات.. 2 منهم اجبارين

الباراميترات الاجباريه

......

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

اقتباس
  1. // او بطريقة اخرى ان كان لدينا محموعة متغيرات نريد تطبيق عملية الفلترة عليهم بنفس الخواص والقواعد
  2. $dsSafer->dsInput(array('_POST'=>'name,title'), 'str');  
  3.  

قاعدة المصفوفه:

  1. 'method1'=>'var1,var2,...var10'
  2. ); 
  3.  

مثال

ان كان لدينا

  1. $_POST['name']
  2. $_POST['email']
  3. $_GET['Action']
  4. $_GET['Section'] 
  5.  

فتكون المصفوفه كالتالي

  1. $myVars = array(
  2. '_POST'=>'name,email',
  3. '_GET'=>'Action,Section'
  4. ); 
  5.  

  1. dsSafer->dsInput($myVars, 'str'); 
  2.  

وبذلك تكون المتغيرات التاليه قد تم تأمينها وجاهزه للتعامل معها

  1. $name
  2. $email
  3. $Action
  4. $Section  
  5.  

مثال اخر

ان اردنا طباعة اهلا بك $_GET['name']

  1. $name = $dsSafer->dsInput($_GET['name'],'str','');
  2. $name = $dsSafer->dsOutput($name,'plain');
  3. echo "اهلا بك $name";
  4.  

استخدمنا في ال dsInput ال str لأننا نتوقع ان يحتوي المتغير المرسل على نص واستخدمنا '' لأننا لا نريده ان يحتوي على اي كود

واستخدمنا في ال dsOutput plain لأننا نريد تجريده من اي كود..

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

اما ان اردنا حفظه في القاعده

  1. $name = $dsSafer->dsInput($_GET['name'],'sql','');
  2. mysql_query("....$name...");
  3.  

وان اردنا جلبه من القاعده

  1. $name = $dsSafer->dsOutput($row->name,'sql');
  2.  

استخدمنا ال sql لأن المتغير قادم من القاعده وقد سبق واستخدمنا ال sql في الداله dsInput عند حفظه

ان كنا قد حفظنا المتغيرات بشفراته الامنه مثلا

فعلينا الاختيار بين ان نعرض النص بما يحتويه من شفرات واكواد.. ليكون الامر كالتالي

  1. $name = $dsSafer->dsOutput($name,'html');
  2.  

او ان نعرض النص مع الشفرات ولكن في حالة عرض مصدرها دون تنفيذها.. ليكون الامر كالتالي

  1. $name = $dsSafer->dsOutput($name,'code');
  2.  

او ان نجرده تماما من اي شفرات او اكواد ممكن ان يحتويها.. ليكون الامر كالتالي

  1. $name = $dsSafer->dsOutput($name,'plain');
  2.  

وهكذا..

بالتوفيق

dsSafer_0.0.7.zip

تم تعديل هذه المشاركة بواسطة DeaD SouL في 19 ديسمبر 2008 في 03:25

أعتذر وبشده عن انقطاعي.. وذلك بسبب مشروعي الجديد

-------------------

100(سبحان الله وبحمده، سبحان الله العظيم) = 0 سيئة

-------------------

dssighg7.png

#14

كلاس قمة في الإبداع

كل الإحترام

جاري تجربتها...

لا اله الا الله محمد رسول الله

شبكة شباب IT

http://www.shababit.net

shababit.gif

#15
اقتباس
كلاس قمة في الإبداع

كل الإحترام

جاري تجربتها...

وانت قمة في الذوق

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

بالتوفيق عزيزي

أعتذر وبشده عن انقطاعي.. وذلك بسبب مشروعي الجديد

-------------------

100(سبحان الله وبحمده، سبحان الله العظيم) = 0 سيئة

-------------------

dssighg7.png

#16

تمام التوضيح الاخير لكما كان شامل شكرا لك

انا استخدمت اللوب لسبب

انا كنت اريد ان اعمل include بشكل عام لصفحه تنفذ الكلاس بشكل مباشر

بدل مااحدد انا اسامي المرسل عبر post خاصه اني لو عدلت شئ مثلا في الفورم لا اعدل على الملف مره اخرى

هذا ماكنت اقصده

#17

عزيزي rewsh

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

--------------

اتمنى من الاخوة الاعضاء الذين لديهم درايه وخبرة في الثغرات ان يقوموا بتجربة الكلاس واختباره.. لكي يستفيد الجميع منه ان شاء الله

بالتوفيق للجميع

أعتذر وبشده عن انقطاعي.. وذلك بسبب مشروعي الجديد

-------------------

100(سبحان الله وبحمده، سبحان الله العظيم) = 0 سيئة

-------------------

dssighg7.png

مواضيع مشابهة