در این مقاله به بررسی 12 نکته کاربری به جهت امنیت وب سایتها اشاره می شود که با رعایت آنها مطمئنن سایت شما از هر نظر امن و غیر قابل نفوذ خواهد بود.
- عدم نمایش خطا در سایت
- استفاده از password protect
- استفاده از فایل robot.txt
- اعتبار سنجی کامل فرم ها
- Hash کردن رمزهای ورود یا داده های حساس
- کنترل کامل فایلهای در حال آپلود
- استفاده از htaccess
- ایجاد لاگ فایل از تراکنش ها
- تغییر سطوح دسترسی فایلها و فولدرها
- استفاده از بسته های بروز رسانی
- کد نویسی اصولی و صحیح
- استفاده از یک سرور خوب و مطمئن
1- عدم نمایش خطا در سایت
یکی از جذابترین و یا شاید ساده ترین راه های نفوذ به وب سایت استفاده از جستجوگر محبوب گوگل می باشد!
معمولا هکرها در سایتها به دنبال خطا می باشند خطایی که به صورت بصری قابل مشاهده بوده و می توان از آن در جهت نفوذ به سایت استفاده کرد.
گوگل این امکان را بطور کامل برای افرادی که تازه با چند متد هک آشنا شده اند فراهم کرده است.
به طور مثال سایتی دارای خطایی از نوع warning می باشد.
هکر با جستجوی عبارت intext:warning:mysql_result با لیستی از صفحات خطای سایتهایی که گوگل آنها را در دیتابیس خود ذخیره کرده روبرو می شود و با کمی تغییر در نوع جستجو به اهداف دقیق تر و یا سایتهای حساس تری روبرو می شود.
و باز به طور مثل با جستجوی عبارت site:.org intext:warning:mysql_result لیستی از سایتهای دولتی نمایش داده می شود.
در حالت خطای warning حتی نام کاربری ورود به پنل اصلی سایت نمایش داده می شود که هکر با استفاده از brute force
و کمی تلاش می تواند پسورد سایت را پیدا کند.
به همین دلایل است که باید تمامی خطا ها در هنگام بالا بودن سایت غیر قابل نمایش باشد.در حالت کلی بهتر است در یکی از فایلهای اصلی سایت خود که در بقیه قسمتها فراخوانی می شود که معمولا این فایل میتواند config.php باشد از تابع mysql_error(0) استفاده کنید تا حتی اگر خطایی هم در اجرای روند کدها رخ داده این خطا برای کاربران نمایش داده نشود.
2 - استفاده از password protect
یکی از بهترین راه ها برای جلوگیری از ورود هکر به فولدهای خاص استفاده از قابلیت password protect در پنل مدیریت cpanel می باشد.مثلا اگر فایلهای مدیریتی سایت شما در داخل پوشه ای به نام Admin قرار دارد و با وارد کردن نام کاربری و پسورد وارد این پوشه می شوید و به پنل مدیریت سایت دسترسی دارید با استفاده از این قابلیت می توانید بر روی این پوشه پسوردی قرار دهید.
از این پس قبل از ورود شما به صفحه Admin پنجره ای ظاهر شده که از شما نام کاربری و پسوردی را میخواهد که در قسمت password protect تنظیم کرده اید.
در این حالت حتی اگر هکر از طریق متد sql injection به پسورد مدیریت سایت دسترسی پیدا کرده باشد نمیتواند به پنل مدیریت سایت نفوذ کند زیرا ابتدا باید از پسوردی که شما بر روی پوشه خود گذاشته اید عبور کند.
در نتیجه بهتر است همیشه فایلهای مربوط به صفحات مدیریت خود را در پوشه ای جدا از فایلهای اصلی سایت قرار دهید تا بتونید از این طریق از آنها محافظت نمایید.
3 - استفاده از فایل robot.txt
فایل robots.txt یک فایل متنی ساده می باشد که بیشتر به جهت سئو (search engine optimaiz) در سایتها استفاده می شود. اما میتوان از این فایل جهت محافظت از فولدرهایی که نمیخواهید دیتا داخل آنها توسط موتورهای جستجو دیده شود استفاده نمایید.
فایل robots.txt را باید در ریشته سایت خود قرار دهید و مانند مثال از آن استفاده نمایید.
ابتدا یک فایل با نام robots.txt ایجاد کنید و سپس درون آن عبارتهای زیر را قرار دهید:
User-agent:*
Disallow: /upload/
با استفاده از این دستور رباتهای جستجوگر محتویات داخل پوشته upload را ایندکس نمیکنند.
اینکار از این جهت مهم است که شاید شما در سایت پوشه ای داشته باشد که محتوای فایلهای آپلود شده در آن مخصوص اعضای سایت باشد یا نخواهید اطلاعات داخل این پوشه در نتایج جستجوهای اینترنتی دیده شود یکی از ابتدایی ترین کارهایی که لازم است انجام دهید ایجاد همین فایل robots.txt می باشد که تاثیر بسزایی در این امر دارد و همچنین به سئو سایت شما نیز کمک شایانی میکند.
اگر میخواهید یک فایل خاص را از دید رباتها پنهان نمایید باید آدرس دقیق فایل را در داخل robots.txt وارد نمایید.
User-agent:*
Disallow: /upload/mypic.jpg
توجه نمایید که محتویاتی که داخل این فایل قرار میگیرد از دید رباتها حساس به حروف بزرگ و کوچک می باشد در نتیجه پوشه Upload با پوشه upload کاملا متفاوت می باشد. و همچنین شما میتوانید از الگوهای خاص مانند عبارت های با قاعده استفاده نمایید که البته در اینجا تنها میتوان از علامتهای (* ? $) استفاده کرد.
4 - اعتبار سنجی کامل فرم ها
هیچ سایت داینامیکی بدون فرم معنای داینامیک را نمی دهد. زمانی که در صفحات سایت خود از فرم های مختلف مانند ثبت نام , تماس با ما و... استفاده می نمایید فراموش نکنید که اطلاعات فرم ها را هم در سمت کلاینت و هم در سمت سرور قبل از ارسال آنها به دیتابیس بررسی نمایید.
برای اعتبار سنجی سمت کلاینت میتوانید از javascript یا jquery استفاده نمایید که یکی از بهترین پلاگینهای موجود برای اعتبارسنجی فرم jqueryvalidation می باشد که قابلیت های بسیار زیادی در اعتبار سنجی انواع فرم ها دارد.
در سمت سرور قبل از اینکه دیتا ارسالی توسط کاربر به دیتابیس برسد باید اعتبار سنجی کاملی انجام دهید زیرا ممکن است کاربری مزاحم کاراکترها یا عبارتهای خاصی را به جهت نفوذ به سایت در فرم وارد کرده باشد در صورتی که اعتبار سنجی شما کامل انجام نشده باشد ممکن است باعث هک شدن سایت و از بین رفتن اطلاعات شما شود.
یکی از ساده ترین کاراکترهایی که برای نفوذ به سایت از طریق متد sql injection انجام می شود ارسال ' از طریق فرم ها به دیتابیس می باشد که براحتی میتوانید توسط توابعی مانند addslashes یا mysql_real_escape_string جلوی آنرا بگیرید این توابع قبل از ' یک \ به جهت غیر فعال کردن آن قرار می دهند.
همچنین برای جلوگیری از حملات xss بهتر است از توابعی مانند striptags یا htmlentities استفاده نمایید.
نحوه استفاده از این توابع در سایت رسمی php به طور کامل شرح داده شده است.
5- Hash کردن رمزهای ورود یا داده های حساس
در زبان php توابع زیادی برای hash کردن داده ها وجود دارد که براحتی میتوانید از آنها برای کد کردن اطلاعات حساس خود استفاده کنید.
یکی از توابع کاربردی و ساده base64_encode() می باشد که معمولا از این تابع برای کد کردن عبارتهای طولانی مانند کپی رایت استفاده می شود که برای کاربر عادی تشخصیص و رمز گشایی آن کمی مشکل می باشد. برای استفاده کافی است تابع را نوشته و دیتایی که میخواهید encode شود داخل پرانتر بنویسید.
از دیگر تابع های کاربردی میتوان به md5 اشاره کرد. md5 یک تابع برگشت ناپذیر می باشد یعنی رمزگشایی از آن مانند base64 آسان نیست بلکه برای رمزگشایی دیتاهای مختلف با عبارت md5 شده مقایسه می شود و در صورتی که این مقایسه صحیح باشد جواب برگردانده می شود. از این تابع بیشتر به جهت رمز دار کردن پسوردها استفاده می شود .
تابع به صورتی عمل میکند که هر تعداد کاراکتری که به آن بدهید آنرا تبدیل به یک عبارت 32 تایی مینماید. به طور مثال 123456 در حالت md5 به صورت e10adc3949ba59abbe56e057f20f883e دیده خواهد شد.
تابع دیگری مانند md5 وجود دارد که sha1 نام دارد در این حالت عبارت ورودی به یک رشته 40 تایی تبدیل می شود.
شما میتوانید با استفاده از این توابع و عملیات salt پسوردهای پیچیده ای تولید نمایید که رمزگشایی آنها کاری زمانبر و بسیار سخت باشد.در واقع Salt یک روش است که از طریق آن رشته ای را میتوان به کد hash شده اضافه کرد تا کرک کردن آن سخت تر شود.
به طور مثال تابع زیر تابع hashing انجمن ساز Vbulletin می باشد
function hash_password($password, $salt)
{
// if the password is not already an md5, md5 it now
if ($password == '')
{
}
else if (!$this->verify_md5($password))
{
$password = md5($password);
}
// hash the md5'd password with the salt
return md5($password . $salt);
}
که خلاصه آن به صورت زیر خواهد بود
$hash=MD5(MD5($password)+$salt)
بهتر است همیشه تعداد کاراکترهای salt را بیشتر از 5 کاراکتر بگیرید تا کرک آن سخت تر شود.
6- کنترل کامل فایلهای در حال آپلود
اگر در سایت خود فرمی دارید که از طریق آن فایلی قرار است روی سایت آپلود شود باید دقت ویژه ای در بررسی فایلهای آپلود شده داشته باشید.
قبل از هرچیز باید پسوند فایلهای مجاز را مشخص نمایید یعنی اگر کاربر قرار است عکسی آپلود نماید حتما پسوند های مجاز را مشخص نمایید. هم در سمت کلاینت و هم در سمت سرور مانند آنچه در قبل گفته شده اعتبارسنجی فایل را انجام دهید.
برخی مواقع پیش میاید که مهاجم با تغییر در پسوند فایل سعی در دور زدن کدها اعتبارسنجی بر میاید به طور مثال مهاجم فایلی به نام shell.php دارد و آنرا به صورت shell.php.jpg تغییر نام می دهد در این حالت در صورتی که کد اعتبار سنجی شما کامل و کاربردی نباشد فایل به طور موفقیت آمیز بر روی سایت شما آپلود می شود.
همیشه سعی کنید فایل آپلود شده را با تغییر نام و پسوندی جدید بر روی سرور قرار دهید که دسترسی مستقیم به آن غیر ممکن باشد.
همچنین در سرورهای لینوکس با تغییر سطح دسترسی فولدر آپلود به 666 میتوانید از اجرای مستقیم فایلها جلوگیری کنید.
و یا با تغییراتی در فایل htaccess میتوانید از اجرا شدن فایلها با 2 پسوند جلوگیری کنید که در ادامه به آنها اشاره خواهیم کرد.
بهترین راه برای امنیت در این حالت جلوگیری از دسترسی مستقیم کاربران به فایلها می باشد که شما میتوانید پوشه آپلود خود را در یک سطح بالاتر از ریشه سایت قرار دهید و با استفاده از توابع یا اسکریپت های خاص به فایلها دسترسی داشته باشید تا نیازی به آدرس دهی مطلق به فایلها نباشد.
مثلا فایل تصویر خود را به صورت < img src="/imageload.php?id=133" / > در سایت قرار دهید و بعد با استفاده از متد get آنرا از دیتابیس فراخوانی نمایید.
ادامه دارد...