کانفیگ صحیح فایل .htaccess برای ارتقاء امنیت سایت وردپرسی شما و نیز کاهش آسیب پذیری آن حیاتی است. به طور معمول هدف اصلی از ایجاد یک فایل .htaccess سفارشی، ارتقاء امنیت و در نتیجه ممانعت از هک وب سایت است اما همچنین میتواند یک روش عالی برای مدیریت ریدایرکت ها و نیز مدیریت وظایف مرتبط با کش باشد.
.htaccess در واقع یک فایل پیکربندی است که برای وب سرور Apache استفاده می شود. اکثر سایت های وردپرسی بر روی وب سرور Apache راه اندازی می شود. اگر چه بخش کوچکی نیز از وبسرور Nginx و یا Litespeed استفاده می کنند. که البته LiteSpeed نیز از .htaccess پشتیبانی می کند.
در این مقاله مجموعه ای از دستورات بسیار مفید و کاربردی را برای .htaccess می یابید که اکثرا به ارتقاء امنیت وبسایت شما کمک می کند.
فراموش نکنید قبل از هر تغییری در فایل .htaccess یک بکاپ از آن تهیه کنید تا در صورتی بروز هر مشکلی بتوانید به راحتی به نسخه بکاپ بازگردید.
در صورتی که شما از آن دسته از افراد هستید که نگران ایجاد تغییر به صورت دستی در .htaccess هستند، استفاده از پلاگین BulletProof Security را که یکی از قدیمی ترین و همچنین قابل اعتمادترین پلاگین های امنیتی رایگان موجود برای وردپرس است را به شما پیشنهاد می کنیم.
ساخت فایل .htaccess با محتویات پیشفرض برای وردپرس
.htaccess می تواند برای هر دایرکتوری به طور مجزا کار کند این بدان معانی است که میتوانیم برای هر دایرکتوری یک فایل .htaccess مجزا داشته باشیم. ممکن است سایت وردپرسی شما فاقد .htaccess باشد، اگر در محل نصب وردپرس خود فایلی با نام .htaccess نمی یابید، کافی است یک فایل متنی ساده ایجاد کنید و نام آنرا .htaccess بگذارید.
در ادامه شما میتوانید محتویات پیشفرض فایل .htaccess را برای وردپرس ببینید:
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
خط اول با #
کامنت شده است. توجه کنید هیچ چیزی را بین # BEGIN WordPress
و # END WordPress
ویرایش نکنید و کد مورد نظر خود را زیر این دستورات پیشفرض قرار دهید.
تمام دستوراتی که در ادامه می اید باید در فایل .htaccess موجود در ریشه سایت شما قرار گیرد.
1- منع کردن Deny دسترسی به تمام فایلهای .htaccess موجود
دستور زیر دسترسی به تمام فایل های .htaccess موجود در وردپرس شما را منع Deny می کند. با این روش شما مانع دیده شده فایل پیکربندی وب سرور توسط دیگران می شوید.
# Denies access to all .htaccess files <Files ~ "^.*\.([Hh][Tt][Aa])"> Order Allow,Deny Deny from all Satisfy all </Files>
2- محافظت از فایل کانفیگ وردپرس
فایل wp-config.php دربردارنده تمام اطلاعات پیکربندی وردپرس شماست و همچنین محتوی نام کاربری و پسورد دیتابیس شما نیز هست.شما می توانید دسترسی همه را به این فایل قطع کنید و یا فقط به مدیر مجوز دسترسی بدهید.
اگر # را از ابتدای # Allow from xx.xx.xx.xxx
در کدی زیر بردارید و ip مدیر را جایگزین xx.xx.xx.xxx
نمایید، تنها مدیر امکان دسترسی به این فایل را خواهد داشت.
# Protects wp-config <Files wp-config.php> Order Allow,Deny # Allow from xx.xx.xx.xxx # Allow from yy.yy.yy.yyy Deny from all </Files>
3- ممانعت از حملات DDOS به XML-RPC
وردپرس به طور پیشفرض از XML-RPC پشتیبانی می کند. که در واقع یک اینترفیس است که ارسال مطالب از راه دور را ممکن می سازد.در هرحال در عین حال که یک امکان خوب است یکی از بزرگترین آسیب پذیری های وردپرس نیز به شما می آید که می تواند زمینه ای برای حملات DDOS باشد.
اگر شما تمایلی به استفاده از این قابلیت ندارید کافی است آنرا با دستورات زیر غیرفعال کنید.درست مثل دستور قبلی به همان روش می توانید دسترسی را برای مدیر باز بگذارید.
# Protects XML-RPC, prevents DDoS attack <FilesMatch "^(xmlrpc\.php)"> Order Deny,Allow # Allow from xx.xx.xx.xxx # Allow from yy.yy.yy.yyy Deny from all </FilesMatch>
4- بخش مدیریت وردپرس را امن کنید
محدود کردن دسترسی به بخش مدیریت وردپرس تنها برای مدیران سایت می تواند ایده خوبی برای ارتقاء امنیت وردپرس باشد.
# Protects admin area by IP AuthUserFile /dev/null AuthGroupFile /dev/null AuthName "WordPress Admin Access Control" AuthType Basic <LIMIT GET> Order Deny,Allow Deny from all Allow from xx.xx.xx.xxx Allow from yy.yy.yy.yyy </LIMIT>
فراموش نکنید رول Allow با ip مدیر قرار دهید در غیر این صورت دسترسی به بخش مدیریت کاملا بسته خواهد شد.
5- جلوگیری از لیست شدن محتویات دایرکتوری
اکثر وبسایت های وردپرسی لیست شدن دایرکتوری را غیرفعال نکرده اند، این بدان معنی است که هر کسی میتواند دایرکتوری ها و فایلهای آنها را مرور کند! باید گفت این یک باگ امنیتی بسیار خطرناک است.
در تصویر زیر می بینید، محتویات یک فولدر وردپرس چطور نمایش داده می شود:
خوشبختانه شما تنها به اضافه کردن یک خط نیاز دارید تا این امکان را غیرفعال کنید، این کد باعث می شود هر کسی قصد مرور محتویات فولدرها را داشته باشد با خطای 403 مواجه شود.
# Prevents directory listing Options -Indexes
6- ممانعت از شمارش کاربران مدیر
اگر پیوندهای یکتای وردپرس فعال باشد، به آسانی میتوان نام کاربری کاربران مدیر سایت را با مرور آرشیو مطالب نویسندگان سایت کشف کرد! یافتن نام کاربری مدیران سایت (که شامل مدیرکل سایت نیز میشود) اولین مرحله برای حملات brute force می باشد.
از کد زیر برای ممانعت از مرور و یافتن نام کاربری مدیران سایت استفاده کنید:
# Prevents username enumeration RewriteCond %{QUERY_STRING} author=d RewriteRule ^ /? [L,R=301]
7-مسدود کردن ربات ها و اسپم ها
ممکن است شما بخواهید دسترسی به سایت را از یک ip خاص مسدود کنید و در نتیجه با مسدود کردن ip ربات ها و اسپم هایی که شناسایی کرده اید دسترسی آنها را نیز به سایت قطع نمایید.
دستورات زیر به این منظور به کار می روند:
# Blocks spammers and bots <Limit GET POST> Order Allow,Deny Deny from xx.xx.xx.xxx Deny from yy.yy.yy.yyy </Limit> Allow from all
8- ممانعت از hotlinking تصاویر سایت شما
گرچه تهدید امنیتی نیست، اما hotlinking تصاویر یک امر آزاردهنده است. افراد نه تنها از تصاویر سایت شما بدون کسب مجوز استفاده می کنند بلکه به حساب شما این کار را انجام می دهند!
با این چند کد ساده شما می توانید از hotlinking تصاویر بر روی سایتتان ممانعت کنید:
# Prevents image hotlinking RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourwebsite.com [NC] RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourwebsite2.com [NC] RewriteRule \.(jpe?g?|png|gif|ico|pdf|flv|swf|gz)$ - [NC,F,L]
9- محدود کردن دسترسی مستقیم به فایلهای php قالب و پلاگین های وردپرس
این می تواند خطرناک باشد اگر فردی فایل های قالب و یا پلاگین های شما را مستقیما فراخوانی کند، چه این فراخوانی به طور تصادفی اتفاق بیوفتد و یا توسط یک حمله مخرب انجام شود.
کدهای زیر می تواند در این مورد به شما کمک کنند:
# Restricts access to PHP files from plugin and theme directories RewriteCond %{REQUEST_URI} !^/wp-content/plugins/file/to/exclude\.php RewriteCond %{REQUEST_URI} !^/wp-content/plugins/directory/to/exclude/ RewriteRule wp-content/plugins/(.*\.php)$ - [R=404,L] RewriteCond %{REQUEST_URI} !^/wp-content/themes/file/to/exclude\.php RewriteCond %{REQUEST_URI} !^/wp-content/themes/directory/to/exclude/ RewriteRule wp-content/themes/(.*\.php)$ - [R=404,L]
10- تنظیم تغییر مسیر دایمی
شما به راحتی می توانید تغییر مسیر لینکها را توسط .htaccess مدیریت کنید. ابتدا باید مسیر قدیمی را وارد کنید و سپس مسیر جدیدی که مایلید کاربر به آن هدایت شود.
# Permanent redirects Redirect 301 /oldurl1/ http://yoursite.com/newurl1 Redirect 301 /oldurl2/ http://yoursite.com/newurl2
11- بازدیدکنندگان را به صفحه maintenance (درحال تعمیر) هدایت کنید
شما باید ابتدا یک صفحه تعمیرات مثلا با نام maintenance.html
ایجاد کنید و سپس با دستورات زیر بازدید کننده سایت را به صفحه تعمیرات هدایت کنید.
# Redirects to maintenance page <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REMOTE_ADDR} !^123\.456\.789\.000 RewriteCond %{REQUEST_URI} !/maintenance.html$ [NC] RewriteCond %{REQUEST_URI} !\.(jpe?g?|png|gif) [NC] RewriteRule .* /maintenance.html [R=503,L] </IfModule>
12- مسدود کردن تماس دسترسی ها به WP includes
فولدر /wp-includes/
فایل های هسته وردپرس را در بردارد که سیستم مدیریت محتوا برای کار کردن به آنها احتیاج دارد. در واقع این محتویات، قالب یا پلاگین و یا محتوایی نیست که لازم باشد کاربر به آن دسترسی داشته باشد. پس برای کسب امنیت در سطح بالاتر تمام دسترسیها به این فولدر را می بندیم.
# Blocks all wp-includes folders and files <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^wp-admin/includes/ - [F,L] RewriteRule !^wp-includes/ - [S=3] RewriteRule ^wp-includes/[^/]+\.php$ - [F,L] RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L] RewriteRule ^wp-includes/theme-compat/ - [F,L] </IfModule>
13- مسدود کردن حملات تزریق کد (Cross Site Scripting) – XSS
دستورات زیر می تواند جلوی برخی از حملات معمول تزریق کد XSS را بگیرد:
# Blocks some XSS attacks <IfModule mod_rewrite.c> RewriteCond %{QUERY_STRING} (\|%3E) [NC,OR] RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) RewriteRule .* index.php [F,L] </IfModule>
14- فعال کردن کش مرورگر
همانطور که در ابتدای این مقاله هم گفتیم، هدف اصلی از شخصی سازی فایل .htaccess ارتقاء امنیت سایت است اما در کنار آن می توان برای مدیریت تنظیمات کش نیز از آن بهره برد. کدی که در ادامه خواهد آمد کش مرورگر بازدید کننده را فعال خواهد کرد و مرورگر کاربر را وادار می کند تا فایلهای ثابت را یک بار دانلود و ذخیره نماید و در نتیجه لازم نباشد هر بار این فایل ها دانلود شود.
# Enables browser caching <IfModule mod_expires.c> ExpiresActive On ExpiresByType image/jpg "access 1 year" ExpiresByType image/jpeg "access 1 year" ExpiresByType image/gif "access 1 year" ExpiresByType image/png "access 1 year" ExpiresByType text/css "access 1 month" ExpiresByType application/pdf "access 1 month" ExpiresByType text/x-javascript "access 1 month" ExpiresByType application/x-shockwave-flash "access 1 month" ExpiresByType image/x-icon "access 1 year" ExpiresDefault "access 2 days" </IfModule>
15- تنظیم صفحات خطای شخصی سازی شده
همیچنین می توانید از .htaccess برای تنظیم صفحات خطای دلخواه برای وردپرس نیز استفاده کنید. برای پیاده سازی این روش، شما در ایتدا نیاز دارید تا صفحات خطا را ایجاد کنید. (custom-403.html, custom-404.html در این مثال) و آن ها را در ریشه وردپرس خود آپلود نمایید.
شما میتوانید صفحه دلخواه خود را برای تمامی خطای معمول http یعنی (4XX and 5XX status codes) ایجاد کنید.
# Sets up custom error pages ErrorDocument 403 /custom-403.html ErrorDocument 404 /custom-404.html
امیدوارم این مطلب به شما در ارتقای امنیت وبسایت و پیکربندی بهتر .htaccess کمک کند.
در صورتی که سوالی در مورد این مطلب دارید و یا مایلید چیزی به این مقاله اضافه کنید خوشحال می شویم در بخش نظرات آنها را مطرح نمایید.
بسیار کاربردی بود
خوشحالم به کارتون اومد
عالی بود
ممانعت از hotlinking تصاویر رو دنبالش میگشتم
متشکرم :)
خوب بود
تنظیمات که برای سئو و کش هستن هم اضافه کنید مثل جی زیپ
سلام
برای پچ کردن clickjacking من از گیت هاب یه تگ دیدم به ادرس :
https://gist.github.com/rbl00/7993166
که یه تگ بود :
#
# Header set X-Frame-Options “DENY”
#
# Header unset X-Frame-Options
#
#
گذاشتمش توی .htaccess اما باز پچ نشد
ممنون میشم راهنمایی کنید در مورد این باگ و نحوه پچ کردنش !!
سپاس بابت مقاله عالی
خوشحالم که مفید بوده :)
خیلی تشکر بابت آموزش ها
خیلی کاربردی و مهم بودن
آموزش جامع و کاملی بود و عالی توضیح دادین