سرفصل‌های آموزشی
آموزش PHP
آشنایی با فایل htaccess. و نحوهٔ محدود کردن دسترسی به دایرکتوری‌های سایت

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

یکی از فایل‌های اصلی تنظیمات وب سرور آپاچی، htaccess. نام دارد (در واقع، نام این فایل برگرفته از عبارت Hyper Text Access است). با قرار دادن این فایل در کنار دیگر فایل‌های وب‌سایت خود، می‌توان یکسری از قابلیت‌ها را به وب سرور آپاچی اضافه نمود که از آن جمله می‌توان به صفحات شخصی‌سازی شدهٔ خطای 404، گذاشتن پسورد روی صفحات سایت، بازنویسی آدرس‌های URLهای بسیار بلند به آدرس‌هایی کوتاه و به یاد ماندنی، مسدود کردن یکسری آدرس‌های IP خاص، ریدایرکت‌ کردن برخی صفحات به صفحات دیگر و بسیاری امکانات دیگر اشاره نمود.

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

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

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

شاید بتوان گفت که یکی از پرکاربردترین ویژگی این فایل، گذاشتن پسورد روی دایرکتوری‌هایی خاص از وب‌سایت است که تمایل داریم هر کاربری به آن ها دسترسی نداشته باشد. برای روشن شدن این موضوع، در ادامه نحوهٔ رمزگذاری یک دایرکتوری در سایت را به طور کامل توضیح خواهیم داد. 

نحوهٔ محدود کردن دسترسی به بخش‌هایی از سایت با استفاده از فایل htaccess.
در واقع، با قرار دادن یک نام کاربری و رمزعبور، می‌توان دسترسی به دایرکتوری یا دایرکتوری‌هایی از وب‌سایت‌مان را محدود به کاربرانی کنیم که دارای نام کاربری و رمزعبور مد نظر هستند. به عبارت دیگر، وب سرور آپاچی این فایل را پیش از باز شدن هر صفحه‌ای چک می‌کند و اگر پرمیشن (مجوز) صادر شده باشد، صفحه در معرض دید کاربران قرار خواهد گرفت. صفحه‌ای که برای وارد کردن نام کاربری و رمز عبور در نظر گرفته شده، صفحهٔ پیش‌فرضی است که شاید قبلاً هم با آن مواجه شده باشید:

اولین کاری که انجام می‌دهیم این است که پوشه‌ای به نام htaccess داخل نرم‌افزار ومپ، زمپ، لمپ یا ممپ ایجاد می‌کنیم (در این دورهٔ آموزشی، از اِستک LAMP استفاده می‌کنیم؛ لذا این پوشه را در مسیر var/www قرار می‌دهیم). سپس فایلی به نام htpasswd. ایجاد می‌کنیم که حاوی اطلاعاتی به شکل زیر می‌باشد:

behzad:123456

ابتدا نام کاربری را نوشته که در این مثال نامی دلخواه همچون behzad را در نظر گرفته‌ایم سپس یک علامت : قرار داده و پسوردی هم برای آن همچون اعداد ۱ تا ۶ در نظر گرفته‌ایم. به خاطر داشته باشیم که به هر تعداد که بخواهیم، در هر خط می‌توان یک جفت نام کاربری و رمز عبور جدید ایجاد کرد.

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

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

$ htpasswd .htpasswd behzad

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

$ New password:

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

$ Re-type new password:

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

$ Updating password for user behzad

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

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

پیش از ادامهٔ کار، فایلی تحت عنوان 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. قرار داده‌ایم).

    به خاطر داشته باشید
مسیردهی به فایل htpasswd. در داخل فایل htaccess. باید اصطلاحاً Absolute باشد. به عبارت دیگر، مسیر باید به صورت کامل -مثلاً var/www/htaccess/.htpasswd- درج گردد.

خط سوم نوع تأیید شدن نام کاربری و رمزعبور را مشخص می‌کند که در این آموزش Basic در نظر گرفته شده است چرا که در این آموزش ما به استفاده از یک تأییدیه HTTP پایه‌ای استفاده می‌کنیم (به خاطر داشته باشیم که عبارت AuthType مخفف واژگان Authentication Type به معنی «نوع تأییده» می‌باشد). این نوع تأییده، رایج‌ترین نوع محسوب می‌شود و در بسیاری از مواقع، نیاز دولوپر را مرتفع می‌سازد.

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

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.
همواره به خاطر داشته باشیم که پرمیشن‌های مناسبی برای این فایل در نظر بگیریم. به طور مثال، پرمیشن‌های این فایل باید به گونه‌ای باشند که هر کسی نتواند آن را ویرایش کند. پرمیشن ایمن برای این فایل 644 است به طوری که به هر سیستمی امکان خواندن آن را می‌دهد اما فقط یوزی که مجوز داشته باشد می‌تواند آن را ویرایش کند.

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

# This is a comment

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

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

online-support-icon