Archive for the ‘PHP’ Category

إجراء عملية تراجعيا

2010/05/14
نحتاج أحيانا إلى القيام بعمل ما على شيء ما يقتضي تنفيذه القيام به نفسه على شيء آخر … حتى نصل لحد يتوقف فيه العمل، عند وجود حالات مشابهة يمكن تحديد كيف يتم العمل على شيء واحد ثم إعادة طلب هذا العمل على الشيء الجديد أثناء تنفيذ العمل الحالي.
لو أخذنا مثال تنظيف درج، العمل هنا هو تنظيف درجة من الدرج، فإذا كان العمل معرف بالشكل التالي (طبعا تنظيف الدرج يتم من الأعلى إلى الأدنى):

إذا كان هناك درجة أعلى من الدرجة الحالية نظفها ثم نظّف الدرجة الحالية.

يأتي الشخص الذي سيقوم بالتنظيف، يقف عند أول درجة ليبدأ بتنفيذ العمل فينظر هل هناك درجة أعلى منها؟ فيجد ، فيقول سأنظف الدرجة الأعلى ثم أعود لهذه بعد ذلك، ينتقل للدرجة الأعلى لينظفها فيقرأ التعليمة، إذا كان هناك واحدة أعلى نظفها ثم عد و نظف الدرجة الحالية … حتى يصل للدرجة الأعلى في الدرج فلا يجد فوقها درجات، فينظفها و ينظف ما تحتها تراجعيا.
هذه الفكرة إذا أردنا أن نستفيد منها برمجيا، سأتحدث عن مثالين:

هناك قائمة في موقع انترنت تحوي عناوين أساسية و تحت كل عنوان أساسي تظهر العناوين الفرعية منه و كذلك بالنسبة للعناوين الفرعية من أجل كل منهم تظهر العناوين الفرعية تحته و هكذا، طبعا تظهر تحته و هي منزاحة للخارج قليلا بما يوحي بأن هذا الشيء فرع من الشيء أعلاه.
يمكن تحقيق ذلك برمجيا كما في المثال التالي:

(لدينا قاعدة بيانات تحوي جدولا اسمه cats فيه الحقول: رقم الفئة catid، اسم الفئة cname، و رقم الفئة الأب cparent. نعرف تابعا له الشكل:

function getCats($id){
    $q = mysql_query(“select * from cats where cparent=’$id‘”);
    if(mysql_num_rows($q)>0){
        print “<ul>\n”;
        for($i=0;$i<mysql_num_rows($q);$i++){
            print “<li>”.mysql_result($q,$i,“cname”).“</li>\n”;
            getCats(mysql_result($q,$i,“cid”));
        }
        print “</ul>\n”;
    }
}
getCats(0);

المثال الثاني هو عن الحذف، أيضا، لو كان هناك أقسام تحوي أقسم تحوي أقسام … و كل قسم قد يحوي محتويات، عند حذف قسم يتم حذف كل المحتويات ضمنه إضافة إلى حذف الأقسام الفرعية التي تُحذف بنفس الآلية حتى نصل إلى الأقسام التي لا تحوي أقساما فرعية.
المثال برمجيا يُكتب بالشكل:

احذف (س)
بدء
احذف جميع المحتويات في القسم س
أحضر أرقام الأقسام الفرعية من القسم س و من أجل كل منها: احذف (رقم القسم الفرعي).
انتهاء

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

Advertisements

Install XAMPP, Java, Python3.0 On Linux

2009/05/02

XAMPP
الحصول على آخر إصدار من XAMPP الخاص بنظام التشغيل لينكس، حاليا هو هذا.
فك ضغط الملف إلى المسار /opt:

sudo tar xvfz xampp-linux-1.7.1.tar.gz -C /opt

فقط.
لتشغيل XAMPP:

/opt/lampp/lampp start

و ملفاتك سوف يجب أن تضعها في المسار /opt/lampp/htdocs
ملحوظة: قد يظهر أن سيرفر آخر يعمل، و لذلك تحتاج لإغلاق هذا الأخير، يمكن استخدام التعليمة ps -A لاستعراض العمليات تمهيدا لإنهاء العملية التي نبغي.
المزيد هنا حول XAMPP.

Java

sudo apt-get install sun-java6-jdk

Python3.0

sudo apt-get install build-essential libncursesw5-dev libreadline5-dev libssl-dev libgdbm-dev libbz2-dev libc6-dev libsqlite3-dev tk-dev g++ gcc
wget http://www.python.org/ftp/python/3.0/Python-3.0.tgz
tar xvzf Python-3.0.tgz
cd Python-3.0/
./configure
make
sudo make install

مختصر سريع في أمن المواقع

2008/08/08

في كل مرة أحاول أن أكتب كتيّب صغير (PDF صغير كما أقصد) أو مجموعة مقالات تتناول موضوع أمن المواقع أتراجع لعدة أسباب ، و لعل أهمها هو أني عندما أكتب موضوعا يتعلق بالبرمجة أختصر أو أكتب بطريقة غير مفهومة لذلك ألغي الفكرة.
في هذه المرة لن أكتب مقالات ولا كتيّبا ، سأكتفي بسطر يلخص من وجهة نظري أمن المواقع.

لكي تبني موقعا آمنا يجب ألّا تسمح بحصول أمر غير متوقع ، يجب دائما الحصول على القيم الصحيحة أو الممكنة ، لا تسمح بشيء غير مسموح به.

سأذكر بعض الأمثلة للتوضيح:

  • عندما تحتاج لطلب محتوى ما اعتمادا على رقمه فلا يجب أن يقبل تطبيقك إلا رقما. مثلا طلب مقالة اعتمادا على رقمها الفريد في قاعدة بيانات.
  • عندما يكون المحتوى نص لا يجب أن يقبل تطبيقك إلا النصوص ، لا يجب أن يقبل بوجود HTML أو JavaScript أو أي شيء آخر. مثلا عند نشر مقالة ، تعليق ، … يجب فلترة المحتوى.
  • الـ URI يجب أن يكون URI ، الصورة يجب أن تكون صورة ، الـ HTTP_REFERER يجب أن يكون HTTP_REFERER ، الـ IP يجب أن يكون IP … يجب اختبار كل شيء ، استخدام التعابير النظامية Regular Expressions مفيد.
  • عند تضمين ملف يجب أن يكون هو الملف الذي يجب تضمينه، عند السماح برفع ملف للموقع يجب أن يكون نوعه من الملفات المسموحة ، عند حذف شيء يجب أن يتم حذفه هو فقط، عند السماح بـ HTML بشكل محدود يجب الحفاظ على هذه المحدودية
  • … إلخ

هذه بعض الأمثلة ، لا حدود لما يمكن أن يفعله من يريد اختراق موقع ما ، لا يوجد أمان 100%، إخفاء الأخطاء شيء جيد ، فحص كل شيء شيء ضروري ، استخدام اختبارات صارمة ، بعض التعديلات هامة في إعدادات الـ PHP (هنا قائمة مميزة كتبها أيمن).

لم أكتب بتفصيل عن كل نوع من أنواع الثغرات ، و لم أكتب عن كيفية سد كل منها لأني كما ذكرت أجد صعوبة في شرح ذلك إلا بأسلوب (فايت ببعضو).
مطوّر المواقع يجب أن يولي كبير الأهمية للأمان ، فمهما حوى الموقع من مؤثرات بصرية و ألوان مبهرة و … ، لن يكون ذلك مهما إذا كان ذلك الموقع معرض للاختراق بسهولة أو بصعوبة متوسطة.

تفعيل DOM في PHP

2008/04/22

بدأت العمل بمشروعي لهذا العام في الجامعة و هو CMS.
الفكرة تختلف عن الأنظمة الموجودة المفتوحة المصدر قليلا ، فأنا أعتمد بشكل كبير على XML في إنشاء بريمجات أو وحدات Modules.
هو في الحقيقة نواة أو Core يتحمل فيما بعد تركيب بريمجات حسب الرغبة ، فكرتي أن هذا الـCore يجب ألا يحوي أي شيء مسبق سوى مدير يمكنه إضافة و إزالة بريمجات ، حتى حسابات المستخدمين ستكون module.

المهم ما أود الحديث عنه هو كيفية التعامل مع الـ DOM في PHP :

الحصول على ملف php_domxml.dll و وضعه في المسار extensions

تعديل ملف php.ini بالشكل :

إزالة الـ ; من العبارة

;extension=php_domxml.dll

و إن لم تكن موجودة إضافتها

extension=php_domxml.dll

في المكان المخصص لذلك ، يمكنك البحث عن extension و ستجد الأسطر :

extension=php_pdo.dll

extension=php_sqlite.dll

أعد إقلاع السيرفر و المتصفح و الآن يمكنك إنشاء كائن Object DOM

$doc = xmldoc();