33
تشکر

8 راهکار امنیتی مهم برای سایت ها

8 راهکار امنیتی مهم برای سایت ها

8 راهکار امنیتی مهم برای سایت ها

این مطلب در دسته بندی مطالب پی اچ پی است. پی اچ پی را در اینجا دنبال کنید.

به شخصه مطمئن هستم اگر از با PHP آشنایی داشته باشد و مطالب زیر را بخوانید و عمل کنید امنیت سایت خود را به میزان بسیار بالایی افزایش داده اید. این مطلب را به هیچ وجه از دست ندهید.

در این مطلب ما به توضیح 8 راهکار برای بالا بردن امنیت در سایتتان میپردازیم. در زیر به چنیدین عادت های برنامه نویسان در جهت بالا بردن امنیت در سایت را لیست کرده ایم:

–          اعتبار سنجی داده های ورودی

–          حفاظت در برابر حمله های XSS

–          حفاظت در برابر حمله های CSRF

–          جلوگیری از حمله های SQL Injection

–          حفاظت از سیستم فایل

–          حفاظت از داده های Session

–          رفع خطای مناسب

–          حفاظت از فایل های Include شده


 


اعتبار سنجی داده های ورودی

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

همیشه اعتبار سنجی را در داده های ورودی با استفاده از PHP انجام دهید. اگر اینکار را با استفاده از JavaScript انجام دهید ممکن است کاربر JavaScript را در مرورگر خودش غیر فعال کرده باشد. در اینصورت اعتبار سنجی شما قابل اعتماد نیست. اما میتوانید هردوی آنها را برای راحتی کاربران خوب داشته باشید.

 


حفاظت در برابر حمله های XSS

این حمله را در اینجا به عنوان یک مطلب جداگانه مورد بررسی قرار دادیم.

حملات XSS بر اساس حمله به کد صفحات وب آسیب پذیر انجام میشود. اگر شما داده های گرفته شده از کاربر را بدون کنترل در مرورگر نمایش دهید این خطر متوجه شما است.

فرض کنید شما در اپلیکشنتان نظرات را از کاربران گرفته و آن را در دیتابیس ذخیره کرده اید و آن را با موفقیت به کاربران نمایش میدهید. یک کاربر در نظر خودش کدهای مخرب JavaScript را مینویسد و نظر خود را Submit میکند و شما آن را در دیتابیس ذخیره میکنید. و زمانی که شما باید نطرات را به کاربران نمایش دهید کل نظرات را از دیتابیس میخوانید و آن کد مخرب JavaScript هم اجرا خواهد شد. آن کد جاوا اسکریپت ممکن است کاربر را به یک صفحه مخرب هدایت کند یا ممکن است حمله phishing به کاربر انجام شود.

برای محافظت در برابر چنین حملاتی زمان نمایش داده های ورودی کاربر آنها را از تابع strip_tags رد کنید تا اگر هرگونه تگی در آنها وجود دارد حذف شود. همچنین از تابع htmlentities نیز استفاده کنید.

 


حفاظت در برابر حمله های CSRF

در حملات جعل درخواست ورودی یا Cross Site Request Forgery (CSRF) حمله کننده از قربانی در لود کردن اطلاعات حساس یا انجام دادن یک تراکنش بدون اینکه خودش بداند کلاهبرداری میکند. به طور عمده در اپلیکشن هایی رخ میدهد از متد GET استفاده کردن باشند.

برای مثال حمله کنند یک لینک به کاربر لاگین کرده در وبسایت شما نمایش میدهد که این لینک در واقع یک عملیات در سایت شما است در حالی کاربر اصلا از آن خبر ندارد.

به طور معمولی درخواست های GET میتوانند چندین بار توسط کاربر ReLoad شوند بدون اینکه هیچ تاثیری در سمت سرور داشته باشد. به هر حال در خواست های GET در نمایش اطلاعات به کاربر و POST در گرفتن اطلاعات و انجام معاملات از کاربر استفاده میشود.

کد زیر را که یک کد ضعیف است و ندانسته از حملات CSRF پشتیبانی میکند مشاهده میکنید.

if(isset($_REQUEST["name"],$_REQUEST["amount"])){
    // process the request and transfer the amount from
    // from the logged in user to the passed name.
}

حالا علی میخواهد به مهدی یک حمله CSRF انجام دهد. و ساختار URL چیزی شبیه زیر است و آن را به مهدی ایمیل میکند.

<a href='http://example.com/process.php?name=Mahdi&amount=10000">Visit My Website</a>

اگر مهدی روی لینک کلیک کند و همچنین در سایت لاگین کرده باشد 10000 تومان از حساب وی کسر و به حساب مهدی ریخته میشود. همچنین علی میتواند به روش هوشمندانه تری نیز عمل کند و اینست که آدرس بالا را به عنوان src برای یک عکس بگذارد.

<img src="http://example.com/process.php?name=Bob&amount=1000" />

در کد بالا مرورگر نمیواتد عکسی نشان دهد اما درخواست را انجام میدهد.

راه حال CSRF اینست که از استفاده از $_REQUEST خودداری کنید. و همچنین متدهای GET را به POST تغییر دهید.

علاوه بر این شما باید یک token تصادفی هم همراه با POST ارسال کنید. زمانی که کاربر در سایت لاگین کرد یک رشته تصادفی که به آن token گفته میشود را در session کاربر ذخیره میکنیم. هر زمان که یک فرم به کاربر نمایش داده شد, token را به عنوان یک ورودی مخفی (Hidden Input) در فرم قرار میدهیم. و در صفحه مقصد فرم این مقدار را با مقداری که درون Session ذخیره شده بررسی میکنیم. اگر مقدارها یکسان بود که حمله ای در کار نیست.

 


جلوگیری از حمله های SQL Injection

این حمله را در اینجا به عنوان یک مطلب جداگانه مورد بررسی قرار دادیم.

در انجام دادن کوئری ها شما حتما باید از PDO استفاده کنید. با پارامتری کردن کوئری و پیش آماده سازی شما میتوانید از حملات SQL Injection خودداری کنید.

به مثال زیر دقت کنید:

<?php
    $sql="SELECT * FROM users WHERE name=:name and age=:age";
    $stmt=$db->prepare($sql);
    $stmt->execute(array(":name"=>$name,
                         ":age"=>$age                                
    ));
?>

در کد بالا ما ابتدا به جای مقدارهای واقعی از :name و :age استفاده کردیم. سپس این مقدارها را با استفاده از تابع prepare جایگزین کردیم. اگر به این صورت استفاده کنید حمله کنند نمیتواند حمله SQL Injection بر روی شما انجام دهد.

 


حفاظت از سیستم فایل

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

<?php
    if(isset($_GET&#91;'filename'&#93;)){
        $filename=$_GET&#91;'filename'&#93;;
        header('Content-Type: application/x-octed-stream');
        header('Content-Transfer-Encoding: binary');
        header('Content-Disposition: attachment; filename="'. $filename .'"');
        echo file_get_contents($filename);
    }
?>

این اسکریپت بسیار خطرناک است. زیرا میتواند هر فایلی را از هر دایرکتوری مانند دایرکتوری های Session و System بخواند و به کاربر بدهد. راه حل اینست که از اسکریپت ها مطمئن شوید که خودسرانه به فایل ها و دایرکتوری ها دسترسی نداشته باشند.

 


حفاظت از داده های Session

به طور پیش فرض اطلاعات Session درون پوشه temp ذخیره میشود. در مورد هاست های اشتراکی یک نفر میتواند که در آن هاست با شما مشترک است میتواند یک اسکریپت بنویسد و به راحتی اطلاعات Session شما را بخواند.

به عنوان یک راه خوب این است که شما اطلاعات Session را کدکذاری کنید. این روش کاملا جلوی حمله کنند را نمیگیرد اما حداقل از خواندن اطلاعات جلوگیری میکند. همچنین شما باید اطلاعات Session خود را یک جای دیگر نیز داشته باشید مانند دیتابیس. PHP از نسخه 5.4 به بعد متدی به نام SessionHandlerInterface را معرفی کرده است و با تابع session_set_save_handler میتوان اطلاعات Session را برای خودتان باقی بگذارید.

 


رفع خطای مناسب

به عنوان توسعه دهنده اپلیکیشن خوب است که از تمام خطاهای برنامه اطلاع داشته باشید. اما زمانی که ما یک برنامه را برای کاربر نهایی درست میکنیم باید خطاها را از دید کاربر پنهان کنیم. اگر خطاها به کاربر نمایش داده شود باعث آسیب پذیر شدن اپلیکیشن ما میشود. بنابراین بهترین روش این است که تنظیمات سرور برای محیط های توسعه و تولید متفاوت باشد.

در حالت تولید ما احتیاج داریم که display_error و display_start_up_errors را خاموش کنیم. و گزینه های error_reporitng و log_errors را روشن کنیم چون ما میخواهیم خطاها را داشته باشیم وقتی که آنها را از کاربر پنهان میکنیم.

شما همچنین باید از set_error_handler برای مشخص کردن خطاهای دیگر استفاده کنید. با این حال محدودیت هایی وجود دارد. بعضی از خطاها مکانیزم استاندارد مدیریت خطای PHP  را دور میزنند. بعضی از خطاها مانند E_CORE_ERROR , E_STRICT یا E_COMPILER_ERROR در همان فایلی که در کنترل خطا تعریف شده است نمیتوانند شناسایی شوند.

برای مدیریت خطاها به صورت بهتر میتوان از بلاک های try/catch استفاده کرد.

 


حفاظت از فایل های Include شده

اسکریپت های PHP اغلب شامل فایل هایی است که برای کارهای مختلف Include میشوند مانند اتصال به دیتابیس و غیره. بعضی توسعه دهندگان فرمت این فایل ها را به inc تغییر میدهند. چنین فایلهایی توسط PHP تفسیر نمیشوند و به صورت یک فایل متنی ساده نمایش داده میشوند. اگر حمله کنند آدرس این فایل ها را داشته باشد به راحتی میتواند به این فایل ها دسترسی داشته باشد. بنابراین همیشه از فرمت php استفاده کنید و در صورت امکان بیرون از پوشه public_html قرار دهید. در غیر اینصورت میتوان سطح دسترسی فایل را روی 600 گذاشت.

 


خلاصه

با عمل کردن به 8 نکته بالا به طور زیادی امنیت برنامه خود را بالا میبرید. یادتان باشد به داده های کاربر اعتماد نکنید. و همیشه از دیتابیس و سیستم فایل خود به خوبی محافظت کنید.

ما در آپارنت در مورد در حمله XSS و SQL Injection مطالب جداگانه قرار دادیم. در آینده نیز مطالبی در مورد رفع خطای مناسب و حفاظت از اطلاعات Session قرار میدهیم.

  • حامد مودی می‌گه:

    خیلی عالی بود

  • yasairane2014 می‌گه:

    سلام استاد خوبید می شود یک مقداری درباره فیلد های اساسی در درطراحی یک سایت صحبت کنید
    منظورم دیتابس مثلا همین token
    ممنون میشوم
    با تشکر

  • مسعود می‌گه:

    با سلام ممنون از آموزش های خوبتون اگر میشه یکم بیشتر در مورد کارایی فرستادن
    token
    توضیح بدید


  • نظرات این مطلب بسته است.