بعد از گذاشتن 2 آموزش مفید و بسیار خوب در مورد توابع include در سایت یعنی فرق include و require و توضیح include_once و require_once در زبان PHP و مباحث حرفهای تغییر basedir در include کردن در زبان PHP و همینطور href در HTML آموزشی تکمیلی در راستای همان دو آموزش برایتان قرار خواهم داد تا این آموزشها کامل تر شوند. حتما به همان دلایلی که در آموزشهای قبل ذکر شده است شما هم بارها و بارها از این توابع در اسکریپتهای خود استفاده کردهاید مثلا برای وارد کردن هدر یا فوتر برای سایر صفحات اما همیشه استفاده از این توابع توسط برنامه نویس نمیباشد و در برخی موارد مثلا انتخاب کردن زبان سایت یا انتخاب قالب توسط کاربر از این توابع استفاده میشود به عنوان مثال در اسکریپت خود مینویسیم:
که متغییر lan$ توسط کاربر توسط یک combo box مشخص میشه و به عنوان مثال یکی از مقادیر farsi.php و یا english.php را برای متغییر lan$ برنامه نویس در نظر میگیرد و توسط فرمی فرستاده میشود سمت سرور و در نهایت فایل درستور include خواهد شد:
و در شاخه language یکی از دو فایل farsi.php و یا english.php انتخاب خواهد شد و در ظاهر همه چیز درست به نظر میرسد و همه چیز امن اگر این چنین فکر میکنید باید بگم که در اشتباه هستید اگر باور نمیکنید به نکتههای زیر توجه کنید:
فکر کنید به جای اینکه فایلهای زبان سایت در یک شاخه جدا بودن در شاخه اصلی کنار بقیه فایلها بودن و یا اینکه کنار فایلهای زبان سایت فایلهای دیگهای هم وجود داشتن که توسط نرمافزارهایی کاربر میتوانند لیست کامل فایلها و شاخههای موجود بر روی هاست شما را بدست آورد حال کافی میباشد که کاربر خودش یک فرم ایجاد کند و به سرور و آدرس مشخص شده ارسال نمایید و به جای اینکه یکی از دو متغییر farsi.php و یا english.php فرستاده بشود برای متغییر lan$ اسم یکی دیگر از فایلهای موجود را برای این متغییر ارسال خواهد کرد فایلهای مهمی در همان شاخه و به همین راحتی به آنها دسترسی پیدا کند نه تنها فایل php بلکه سایر فایلها چون اسم فایل و پسوند آن توسط کاربر مشخص میگردد!!
خوب حالا شاید بگید خوب رفع این مشکل کار چندانی نخواهد برد و به راحتی قابل حل خواهد بود به این صورت که ما پسوند فایل رو خودمان تعیین میکنیم یعنی مینویسیم:
و به این ترتیب کاربر فقط میتونه فایلهایی با پسوند php را اجرا نماید و برای اینکه نتواند بقیه فایلها را اجرا کند این فایلها را داخل شاخهی جدا قرار خواهیم داد مثلا داخل شاخه Language که فقط شامل 2 فایل زبان سایت یعنی farsi.php و english.php میباشد و مشکلات حل خواهد شد به همین راحتی و موقع ارسال فرم هم برای متغییر lan$ مقادیر farsi و english را تعیین خواهیم کرد که فقط اسم فایل فرستاده شود.
اما واقع با این کار دیگه مشکلی وجود نداره و این تابع امن خواهد بود؟!
اگر جواب شما بله میباشد باز در اشتباه هستید! خوب بیاید دقیقتر شویم بر روی موضوع.
ما مقادیر farsi و english رو فقط فرستادیم و پسوند هم که از قبل تعیین شده پس مشکل کجا میباشد؟ شاید در اینجا ما بتوانیم فایلها را جدا کنیم اما در مواقعی که نتوانیم فایلهای مورد نظر رو از سایر فایلها جدا کنیم چه طور؟
حالا بگذارید باز هم دقیقتر شویم به نظر شما اگر در همه حالات فایلها را در شاخهای جدا قرار دهیم کاربر دیگر نمیتواند سایر فایلها را اجرا نماید؟
اگر جواب شما نمیتواند است باز هم در اشتباه هستید !
به نظرتان اگر کاربر بهجای مقادیر farsi و یا english مقداری زیرکی بخرج دهد و عباراتی مثل زیر را وارد نماید چه خواهد شد؟ عبارتی مانند:
.../.../.../.../.../.../.../.../.../page
نظرتان چیست؟ ( کلمه page نام یکی از فایلها دلخواه با پسوند php میباشد) به این ترتیب کاربر میتونه با عبارت /... بین شاخههای هاست شما حرکت رو به عقب داشته باشد و یا با بدست آوردن نام شاخهها و فایلهای هاست شما حرکت رو به جلو داشته باشد به این صورت که با تعدادی /... به شاخه اصلی یعنی root خواهد رسید و بعد از آن آدرس دلخواه خود را وارد میکند و به راحتی در بین شاخههای سایت شما حرکت خواهد کرد!!! و حتی میتواند به فایلهای بسیار مهم و حیاتی هاست شما مانند config و یا passwd که در سی پنل موجود است دسترسی پیدا کند و .... اما خوب شما ممکنه بگید فقط میتونه به فایلهایی با پسوند php دسترسی پیدا کند نه هر فایل دلخواهی مثل passwd و غیره ولی باز هم در اشتباه هستید!! میپرسید چطور؟
ادامه آموزش در صفحهی دوم ...