دوره آموزش رایگان زبان برنامه نویسی مقدماتی پی اچ پی (PHP)- جلسه شانزدهم

آشنایی با فایل htaccess. و نحوه ی محدود کردن دسترسی به دایرکتوری های سایت

یکی از فایل های اصلی تنظیمات وب سرور آپاچی، htaccess. نام دارد (در واقع نام این فایل برگرفته از عبارت Hypertext Access است.) با قرار دادن این فایل در کنار دیگر فایل های وب سایت خود، می توان یکسری از قابلیت ها را به وب سرور آپاچی اضافه نمود که از آن جمله می توان به صفحات Customized شده خطای ۴۰۴، گذاشتن پسورد روی صفحات سایت، بازنویسی آدرس‌های یو آر ال بسیار بلند به آدرس هایی کوتاه و به یاد ماندنی، مسدود کردن آی پی های خاص و بسیاری امکانات دیگر اشاره نمود.

در واقع اگر بخواهیم تنظیمات کلی وب سرور را که شرکت ارائه دهنده ی خدمات میزبانی هاستینگ در اختیار ما قرار می دهد بسته به نیاز خود شخصی سازی کنیم، می توان این فایل را حاوی تنظیمات مد نظر خود در دایرکتوری روت وب سایت (یا همان دایرکتوری اصلی) روی هاست قرار دهیم. از مزایای استفاده از این فایل می توان به موارد زیر اشاره کرد:

– از آنجا که این فایل در هر درخواستی که برای وب سرور ارسال می شود خوانده می شود، پس می توان این انتظار را داشت که دستورات قرار گرفته داخل آن به سرعت در وب سایت اعمال شوند.
– در سرورهای اشتراکی مسلماً تنظیمات اولیه ممکن است با نیازهای کاربران متفاوت هم خوانی نداشته باشد لذا در بسیاری از مواقع امکان دستکاری فایل‌های تنظیمات آپاچی مثل httpd.conf وجود ندارد. بنابراین این فایل امکانی در اختیار کاربران مختلف قرار می دهد تا بسته به نیاز خود تنظیمات خاصی را برای وب سرور آپاچی در نظر بگیرند.

[tie_list type=”starlist”][/tie_list]هشدار

در کل این فایل بسیار حساس بوده و یک اشتباه کوچک در آن مثل فراموش کردن در قرار دادن یک ; در کدهای این فایل می تواند روند اجرای وب سایت مان را تحت تاثیر قرار دهد. از این رو پیشنهاد می شود همواره پیش از ویرایش این فایل، یک نسخه از آن در جایی روی سیستم خود کپی کرده که اگر مشکلی برای فایل در حین ویرایش پیش آمد به سرعت بتوانیم از فایل بکاپ خود استفاده کنیم.
شاید بتوان گفت که پرکاربردترین ویژگی این فایل، گذاشتن پسورد روی دایرکتوری هایی از وب سایت است که تمایل داریم هر کاربری به آن ها دسترسی نداشته باشد. برای روشن شدن این موضوع، نحوه رمزگذاری یک دایرکتوری در سایت را به طور کامل توضیح خواهیم داد. در واقع با قرار دادن یک نام کاربری و رمزعبور، می توان دسترسی به دایرکتوری یا دایرکتوری هایی از وب سایتمان را محدود به کاربرانی کنیم که دارای نام کاربری و رمز عبور هستند. به عبارت دیگر، وب سرور آپاچی این فایل را پیش از باز شدن هر صفحه یی چک می‌کند و اگر پرمیشن یا مجوز صادر شده باشد، صفحه در معرض دید کاربران قرار خواهد گرفت. صفحه ای که برای وارد کردن نام کاربری و رمز عبور در نظر گرفته شده، صفحه ی پیش فرضی است که شاید قبلا هم با آن مواجه شده باشید:
htaccess
اولین کاری که انجام می دهیم این است که پوشه یی به نام htaccess داخل نرم افزار ومپ، زمپ، لمپ یا ممپ ایجاد می کنیم (در این دوره ی آموزشی، از استک LAMP استفاده می کنیم.) سپس فایلی به نام htpasswd. ایجاد می کنیم که حاوی اطلاعاتی به شکل زیر می باشد:
abolfazl:123456789

ابتدا نام کاربری را نوشته که در این مثال نامی دلخواه همچون abolfazl را در نظر گرفته ایم سپس یک علامت : قرار داده و پسوردی هم برای آن همچون اعداد یک تا نه در نظر گرفته‌ایم. به خاطر داشته باشیم که به هر تعداد که بخواهیم در هر خط از کد می توان یک جفت نام کاربری و رمز عبور جدید ایجاد کرد. نکته ای که در ارتباط با پسورد وجود دارد این است که هر پسوردی که بخواهیم استفاده کنیم، باید Encrypt یا «رمزنگاری» شود که این فقط به خاطر مسائل امنیتی است. ابزارهای آنلاین بسیاری برای ایجاد رمزعبور Encrypt شده وجود دارند اما یکی از ساده ترین راه کارها، استفاده از ابزاری است به نام htpasswd که به همراه وب سرور Apache نصب می شود.

برای اصطلاحا Hash (هش یا رمزنگاری) پسورد در سیستم عامل گنو/لینوکس توزیع اوبونتو، ابتدا ترمینال را باز کرده و وارد پوشه ی پروژه ی خود می شویم که در این آموزش htaccess نام دارد سپس دستور زیر را وارد می کنیم:

htpasswd .htpasswd abolfazl

در دستور بالا گفته ایم که برای نام کاربری abolfazl که در فایلی تحت عنوان htpasswd. قرار دارد یک رمزعبور هش شده ایجاد گردد. به محض اینتر کردن، با عبارت زیر مواجه می شویم:

New password:

رمزعبور مد نظر را وارد می کنیم و اینتر می زنیم. مجدد با پیغام زیر مواجه می شویم:

Re-type new password:

از ما خواسته می شود که رمزعبور جدید را مجدد وارد کنیم. پس از انجام موفقیت آمیز آپدیت رمزعبور، با پیغام زیر مواجه خواهیم شد:

Updating password for user abolfazl

اکنون اگر به فایل htpasswd. مراجعه کنیم، می بینیم که اعداد یک تا شش که قبلا وارد کرده بودیم، با معادل هش شده ی آن ها جایگزین شده اند:

abolfazl:$apr1$.EakMMZAXg.N$7kjUsvg9Jn..X1IDDR.

پیش از ادامه ی کار، فایلی تحت عنوان index.php به صورت زیر در پوشه ی پروژه ی خود ایجاد می کنیم:

<?php
echo 'In the name of the most high';

در واقع در دستور فوق قصد داریم عبارت In the name of the most high به معنی «به نام خدا» را چاپ کنیم. در ادامه بایستی تصمیم بگیریم که کدام دایرکتوری وب سایتمان را می خواهیم محدود کنیم (به خاطر داشته باشیم که کلیه فایل ها و دایرکتوری ها زیرشاخه آن دایرکتوری هم محدود خواهند شد.) در این مثال قصد داریم کلیه ی فایل های پروژه را از دید کاربرانی که نام کاربری و رمزعبور ندارند مخفی کنیم لذا فایلی با نام htaccess. حاوی اطلاعات زیر ایجاد کرده و آن را داخل دایرکتوری اصلی پروژه ی خود خود قرار می دهیم:

AuthName "Members` Area"
AuthUserFile /var/www/htaccess/.htpasswd
AuthType Basic
require valid-user

اولین خط از کد فوق به وب سرور آپاچی دستور می دهد که وقتی کاربری خواست به دایرکتوری که محدود شده است دست پیدا کند، پنجره ای با این عنوان برای وی باز گرداند تا بتواند نام کاربری و رمز عبور خود را در آن وارد سازد. مقداری که برای دستور AuthName یا «نام تصدیق هویت کاربر» در نظر گرفته می شود هر عبارتی می تواند باشد به طوری که در این مثال نام Members` Area به معنی «ناحیه اعضای سایت» در نظر گرفته شده است. در واقع، این عبارت زمانی ظاهر می شود که صفحه ای به صورت پاپ آپ برای گرفتن نام کاربری و رمز عبور ظاهر می شود.

خط دوم جایگاه فایل رمزعبور را مشخص می کند. به خاطر داشته باشیم که آدرس دایرکتوریی که در این خط از کد قرار می گیرد بایستی به فایل htpasswd. برسد که روی سایت خود قرار داده ایم. لازم به ذکر است جایگاه فایل htpasswd. هر کجای سایت مان می تواند باشد اما پیشنهاد می شود برای آن که این فایل از دید کاربران مخفی بماند آن را خارج از دایرکتوری روت سایت قرار دهید. اما همان طور که از آدرس دهی مشخص است، در این آموزش این فایل را در کنار فایل htaccess. قرار داده ایم.

[tie_list type=”checklist”][/tie_list]به خاطر داشته باشید
مسیر دهی به فایل htpasswd. در داخل فایل htaccess. باید اصطلاحا Absolute باشد. به عبارت دیگر، مسیردهی باید به صورت کامل مثلا var/www/htaccess/.htpasswd باشد.
خط سوم نوع تایید شدن نام کاربری و رمز عبور را مشخص می کند که در این آموزش نوع Basic در نظر گرفته شده است چرا که در این آموزش ما به استفاده از یک تاییدیه اچ تی تی پی پایه ای استفاده می کنیم (به خاطر داشته باشیم که عبارت AuthType مخفف واژگان Authentication Type به معنی «نوع تاییده» می باشد.) این نوع تاییده رایج ترین نوع محسوب می شود و در بسیاری از مواقع نیاز توسعه دهنده را مرتفع می سازد.

در خط چهارم هم این دستور را به وب سرور می دهیم مادامی که اطلاعات ورود صحیح نباشند،تمامی کاربران اجازه ی ورود به دایرکتوری های محدود شده را ندارند. اگر بخواهیم فقط و فقط برای یک کاربر خاص این محدودیت را اجرا کنیم، به جای valid-user، نام کاربری مد نظر را می نویسیم:

require user abolfazl

اکنون برای تست پروژه، وارد مسیر پروژه در لوکال هاست می شویم. از این پس جلوی کاربرانی که می خواهند محتویات فایل index.php را مشاهده کنند گرفته می شود و تا زمانی که نام کاربری و رمزعبور عبور صحیح وارد نشود، امکان مشاهده ی فایل وجود نخواهد داشت. در صورت صحیح وارد کردن نام کاربری و رمزعبور، محتویات فایل index.php در معرض دید ما قرار خواهند گرفت:

In the name of the most high

و در صورتی هم که یا نام کاربری و یا رمز عبور اشتباه باشند، با پیغام زیر مواجه خواهیم شد:

Unauthorized

This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn't understand how to supply the credentials required.

Apache/2.4.18 (Ubuntu) Server at localhost Port 80

نکاتی در مورد فایل htaccess.
همواره به خاطر داشته باشیم که پرمیشن های مناسبی برای این فایل در نظر بگیریم. به طور مثال پرمیشن های این فایل باید به گونه یی باشند که هر کسی نتواند آن را ویرایش کند. پرمیشن ایمن برای این فایل ۶۴۴ است به طوری که به هر سیستمی امکان خواندن آن را می دهد اما فقط یوزی که مجوز داشته باشد می تواند آن را ویرایش کند.

در برنامه نویسی کامنت گذاری باعث خوانایی بیشتر سورس کد می شود (در آموزش های آتی به طور مفصل در مورد کامنت ها در زبان برنامه نویسی پی اچ پی بحث خواهیم کرد.) برای کامنت گذاری در فایل htaccess. می بایست از علامت هش تگ یا # استفاده کرد:

#This is a comment

همان طور که مشاهده می شود، در ابتدای خط یک علامت # قرار داده ایم. این خط هرگز اجرا نشده و از دید وب سرور آپاچی مخفی می ماند.

در نظر داشته باشیم که اگر Performance (پرفورمنس یا راندمان) سایت برایمان خیلی مهم است، باید تا حد ممکن خود را درگیر این فایل نکنیم چرا که در هر بار ارسال درخواست برای سرور، این فایل نیز خوانده می شود و تنظیمات آن اعمال می گردد و صد البته کمی بار روی سرور می آورد. شاید برای سایت هایی که تعداد کاربران محدودی دارند این کاهش پرفورمنس خیلی محسوس نباشد، اما برای سایت هایی با چندین هزار کاربر در روز مسلما این کاهش پرفورمنس مشکل زا خواهد شد!

221

اسماعیلی هستم مدیر عصر فنون. فارغ التحصیل مقطع کارشناسی ارشد رشته مهندسی فناوری اطلاعات (IT)