لماذا أغلبية ملفات PHP في Joomla! تبدأ بـ "defined(' JEXEC')...؟
From Joomla! Documentation
غالبية ملفات PHP داخل Joomla! تبدأ بالتعبير التالي :
هذا التعبير يفحص ليرى فيما إذا كان استدعاء الملف من دخل جلسة Joomla! وهو يحمي موقعك وذلك بجعله أصعب على القراصنة/ المخربين من الاضرار بموقعك.
Why do most of the Joomla! PHP files start with defined(' JEXEC')?
وهي تساعد بطريقتين رئيسيتين:
1) هي تمنع الأخطاء من تشغيل ملف PHP متوقع تشغيله داخل جملة bootstrap ويمنع الكشف عن مسار الثغرات الناشئة عن ألاخطاء الفادحة PHP التي يتم إنشاؤها.
defined('_JEXEC') or die('Restricted access');
2) ويمنع الاقحام العرضي للمتغيرات من خلال تسجيل هجوم عالمي هدفه خداع ملف PHP في التفكير بانه من داخل التطبيق بينما هو في الحقيقة ليس من داخل التطبيق.
أن وضع الإعلام عن الأخطاء أسفل يكون له تأثير مماثل، ولكن هناك اعدادات حيث لا يسمح بتغيير إعدادات INI للـ PHP ل. يعمل اختيار JEXEC بغض النظر عن ما إذا كانيمكن تغيير الاعدادات \وليس له آثار جانبية أخرى (على سبيل المثال إذا كنت تقوم بالتصحيح كل ملف يقلل من التقرير عن الخطأ سيكون مزعج لأن عليك إما تعيين مؤشر التصحيح لوقفه أو بعد كل ملف يتم تضمين التقرير عن الخطأ إعادة تعيين، وليس متعة!).
ملاحظة, هذا السطر يجب أن يتواجد في ملف index.php الرئيسي , حيث أنه البرنامج الذي يبدأ جلسة Joomla!.
When?
The check should be added to files that when accessed directly cause a path exposure. For example, the following error occurs when the Backlink System Plugin (/plugins/system/backlink.php file) has had the _JEXEC check disabled:
Fatal error: Call to undefined function jimport() in /Users/pasamio/Sites/workspace/joomla_15/plugins/system/backlink.php on line 18
As is evidenced, the 'jimport' function doesn't exist when the file is directly called so PHP raises an error and exposes the path to the file. Adding the defined or die check to this file will cause a "Restricted access" message to be displayed when the file is accessed.
So the general rule for the JEXEC check is if the PHP file depends on another file to operate properly. Typically if you access a file directly without the JEXEC check and a PHP error is raised (presuming your PHP error reporting is set to show errors by default) about a missing variable, function, object or similar then the file needs to be protected.
Some files don't need to be protected from this check. They might be files with no external dependencies (e.g. a simple class or bit of code) or they might be external files that can operate without being within Joomla!. Examples of this include TinyMCE's GZip'd Javascript generator which is entirely self contained.