سلام ببخشید من یه قسمت رو متوجه نشدم یعنی ما باید برای هر فایلی که داریم و میخوایم اونو امن کنیم از این شرط استفاده کنیم؟
سلام و احترام
قطعا این تنها روش برای جلوگیری از دسترسی فایلهای حساس نیست ولی فعلا با دانشی که تا الان ما کسب کردیم این راه مناسبی برای جلوگیری از دسترسی مستقیم به فایلهای حساس درون پروژه است، در واقع فایلهایی که میتوانند کدهای اصلی پروژه ما را لو بدهند.
در بخش MVC این مشکلات حل شده است چون فایلها به صورت مستقیم فراخوانی نمیشوند و آنها را با routeها صدا میزنیم.
امیر صالحی۱۵ اردیبهشت ۱۳۹۹، ۰۹:۴۷
سلام.
دقیقاً توضیحات آقا امیر درسته و هر چی جلوتر بریم راه حلهای بهتری برای چالشهای امروزمون آموزش داده میشه. برای مثال یکی از چالشهای الان، استفاده از includeهای زیاد در صفحات هست که در شی گرایی راه حل این چالش ارائه میشه. و بنظرم مسیر آموزشی خوبی پیش گرفته شده، که برنامه نویس چالش هارو حس میکنه و بعد راه حل بهترشو یاد میگیره.
اما اگر میخواید بصورت کلی بدونید، راه حل این موضوع، مدیریت درخواستها از طریق فایل کانفیگ وب سرور هست.
در بحثهای جلوتر که تمام درخواستها در یک صفحه index.php متمرکز شد، خیلی راحتتر میتونیم از طریق فایل .htaccess بگیم تمام درخواستها (با شرطهای مختلف) به چه صفحه هایی یا چه صفحه ای(منظور index.php) ریدایرکت بشن.
برای مثال روی همین پروژه ی ۷todo اگر یک فایل .htaccess در مسیر روت پروژه ایجاد کنیم و دستورات پایینو بنویسیم:
طبق شرط، درخواستهایی که حاوی /libs باشن به index.php ریدایرکت میشن.
ولی الان نمیتونید برای مثال با فایل assets چنین کاریو کنید، چون باید فایلهای css , js, font شما لود شن و اگر اینکارو کنید، مسیر فایلهای assets هم به index.php ریدایرکت میشه. میتونید تست کنید ctrl + f۵ بزنید و میبینید استایل لود نمیشه. همچنین برای دایرکتوری process و tpl هم نمیتونید چون صفحه هایی هستن که باید لود بشن و تفسیر بشن، نه اینکه ریدایرکت بشن به index.php و اگر چنین کاریو کنید یک loop اتفاق میوفته و اصلا سایت باز نمیشه.
این مسئله و ریدایرکت کردن تمام درخواست ها، به ساختار پروژه، مربوط هست که باید با آموزشها پیش برید تا جلوتر با ساختارهای جدیدتر آشنا بشید.
بنابراین، در این نقطه از مسیر آموزشی، از defined استفاده کنید.
محسن موحد۱۵ اردیبهشت ۱۳۹۹، ۱۱:۱۶
سلام مجدد.
یک راه دیگم هست، میتونید داخل دایرکتوری هایی که فایل هاش بصورت مستقیم باز نمیشه و در فایلی مثل index.php اینکلود شدن، (برای مثال در این پروژه ی ۷todo) داخل هر کدوم از دایرکتوریهای bootstrap, libs, tpl, vendor (بجز دایرکتوری process چون بصورت مستقیم از ajax صدا زده میشه) فایل .htaccess بسازید و این دو خط رو بنویسید:
Order Deny,Allow
Deny From All
به این دایرکتوریها و فایلهای درونشون، حتی فایلها و دایرکتوریهای بالاتر دسترسی بسته میشه.
برای مثال اگر در vendor فایل .htaccess ایجاد کنید و این آدرس رو بزنید:
Forbidden
You don't have permission to access /7todo/vendor/symfony/translation/Translator.php on this server.
یا مثلا:
http://localhost/7Todo/libs/helpers.php
داشتم فایلهای پروژههای قدیمو میدیدم که دیدم ازش استفاده کردم و توو این تاپیک اضافش کردم.
اما همونطور که میبینید، این هم یک کار تکراریه و حالا اینجا ۴ تا دایرکتوری بود ولی مثلا یک پروژه ی بزرگ کلی دایرکتوری داره و منطقی نیست، داخل تک تک دایرکتوری ها، این فایلو ایجاد کرد.
* البته بجای ایجاد این همه فایل میشه از تگ دایرکتوری استفاده کرد و مسیرهارو بهش داد ولی بازم راه مناسبتر با توجه به ساختار پروژه، راه پست قبلیه که تمام ریکوئستها به یکجا ارسال بشن.(البته پست قبلو براساس یک فریمورک PHP گفتم.)
یعنی مثلا فایلهای core پروژه رو داخل root قرار میدیم و فایل index.php و فایلهای assets و ... رو یک پوشه بالاتر قرار میدیم و وقتی درخواستی به صفحه ی روت پروژه رسید، اون درخواستو ریدایرکت میکنیم به یک پوشه بالاتر. همچنین خود اون پوشه ی بالاتر هم باز یک فایل htaccess نیاز داره برای ریدایرکت کردن درخواست ها به index.php.
توضیحات بیشتری نیاز داره ولی کلیت به این شکله از طریق وب سرور ازین راهها میشه استفاده کرد.