در حال ارتباط با سرور...




لطفا نظرات و پيشنهادات خود را بمنظور ارتقاء کيفي هرچه بيشتر سايت با ما در ميان بگذاريد.

ویدیوها مقالات کتاب ها اخبار پرسش و پاسخ
برنامه‌های رومیزی مبتنی بر وب زبان های برنامه سازی پایگاه داده سیستم عامل شبکه 
مقاله بگذارید
توسط : hamedkh دسته بندی : مبتنی بر وب تاریخ : 1392-1-16 18:53:09

حملات Cross-site Request Forgery (CSRF):

یکی از نکات بسیار مهمی که باید همواره مد نظر قرار دهید اینست که تمامی درخواست هایی که منجر به عملیات بروز رسانی (درج، حذف یا ویرایش) می گردد حتما باید از طریق پروتکل POST صورت پذیرد تا از ارسال مجدد و ناخواسته درخواست به سرور جلوگیری به عمل آید. شاید بنظر بسیاری از برنامه نویسان این روش به امنیت برنامه بسیار کمک کند اما باید گفت که استفاده از پروتکل پست بتنهایی تقریبا هیچ حفاظ امنیتی ای را برای برنامه شما ایجاد نخواهد نمود. یکی از نمونه های این مسئله حملات CSRF می باشد که در خواست های POST نیز از آنها نمی توانند جلوگیری کنند. خوشبختانه Yii Framework روش و مکانیزمی را برای مقابله با این تهدید دارد که البته بطور پیش فرض غیر فعال است و باید فعال گردد.

 

پیکربندی سرور :

روش ها و مطالبی که در این مقاله بیان می شود بر اساس سیستم عامل UNIX و وب سرور Apache بهمراه ماژول PHP می باشد. بنابراین سایر پیکر بندی ها (windows, nginx, PHP-fpm) ممکن است نیاز به تنظیمات دیگری داشته باشند.

 

محیط دیباگ :

هنگامی که در برنامه Yii مقدار ثابت YII_DEBUG برابر true مقدار دهی می گردد، برنامه در محیطی اجرا می شود که اطلاعاتی با ارزش را به برنامه نویس می دهد. البته توجه داشته که این اطلاعات در اختیار سایرین نیز قرار خواهد گرفت، از جمله مهاجمان. بعنوان مثال فرض کنید مهاجمی می فهمد که شما در یکی از فرم های خود اعتبار سنجی (validation) را انجام ندادید، بعنوان مثال آرایه ای از طریق فرم ارسال می شود و تابع PHP مسئول دریافت پارامتر های ارسالی، مقداری غیر صحیح را دریافت می کند. در این حالت چنانچه برنامه شما در حالت دیباگ باشد، پشته فرآخوانی برنامه (call stack) بهمراه کدهای برنامه به کاربر (مهاجم) نشان داده می شود.

متاسفانه حالت دیباگ برنامه در فایل index.php برنامه ست می شود که اصلا مطلوب نمی باشد. بهمین علت کد شما باید دائما در وضعیت های مختلف (زمان توسعه، تست و یا بارگذاری نهایی) تغییر کند. یک راه حل برای این مسئله استفاده از DVCS است تا بتوانید بصورت محلی این تغییرات را دنبال کنید. مشکل این راه حل اینست که پیکربندی های متعددی باید بصورت محلی مدیریت شود. اما راه حل پیشنهادی بازنویسی فایل index.php است، بگونه ای که فایل پیکربندی مربوط به دیباگ را از فایلی خارجی بخواند یا اینکه از وب سرور بگیرد.

در Apache می توان متغییر هایی محیطی را از طریق کد  زیر مقدار دهی نمود :

 

SetEnv YII_ENV testing

متغییر این متغیر را هم می توانید در یک فایل پیکربندی سراسری در VistualHost یا یک پوشه ست کنید و یا اینکه در فایل .htaccess آن را اعمال کنید. با این کار می توانید از طریق کد PHP ($_SERVER[“YII_ENV”]) به آن دسترسی داشته و آن را بصورت پیش فرض بر روی حالت استفاده نمایی (production mode) تنظیم کنید تا به اشتباه برنامه شما در حالت دیباگ در اختیار کاربران قرار نگید.

 

نکات امنیتی در یک برنامه Yii Framework:

توجه داشته باشید که در یک برنامه Yii نباید فایل های مربوط به Yii را در شاخه اصلی سرور (root) قرار دهید، چرا که دلیلی ندارد که یک کاربر به فایلی مانند yiilite.php در وب سرور شما دسترسی داشته باشد.

 

توجه داشته باشید که تنها سه پوشه از برنامه شما باید قابل نوشتن باشند.

  • Assets
  • Protected/runtime
  • Protected/data

 

دسترسی وب سرور به بقیه شاخه ها حتما باید در حالت فقط خواندی باشد. به این ترتیب مهاجمان تنها قادر به تغییر و ایجاد فایل در پوشه های گفته شده هستند. یک از پوشه های خطرناک برنامه شما پوشه assets می باشد چراکه قابل نوشتن است و دسترسی مستقین از طریق HTTP دارد. بنابراین فایل های php آن نباید تفسیر شوند، بلکه تنها باید در حالت متنی ساده باز شوند تا قابلیت اجرا نداشته باشند. به مثال زیر توجه کنید :

 

برنامه های Yii بطور پیش فرض یک فایل .htaccee دارند که از طریق آن درستری مستقیم به شاخه های protected و  themes/classic/views را غیر ممکن می سازد. راه حل سریعتر و بهتر برای اینکار اینست که این محدودیت ها را در خود سرور apache اعمال کنیم. در ادامه مثالی از این کار را مشاهده می کنید که البته فایل های PHP موجود در شاخه assets را نیز غیر فعال می کند.

 

[apache]
# Example config for Yii-myapp and Apache
# Please set the pathes to their right values

# put the application in some custom url
# (instead of an Apache alias, a symbolic link can be used)
Alias /web/path/for/myapp "/home/myapp/www"

<Directory "/home/myapp/www">
    AllowOverride None
</Directory>

<Directory "/home/myapp/www/protected">
    Deny from All
</Directory>

<Directory "/home/myapp/www/assets">
    php_admin_flag engine off
    Options -Indexes
</Directory>

بجای استفاده از پیکربندی بالا، می توانید برنامه خود را برش زیر در یک میزبان مجازی (Virtual Host) قرار دهید.

 

[apache]
# Example config for Yii-myapp as an Apache VirtualHost
# Please set the pathes to their right values

<VirtualHost *:80>
    ServerName myapp.com
    DocumentRootAlias /home/myapp/www

    ErrorLog /var/log/apache2/myapp-error.log
    CustomLog /var/log/apache2/myapp-access.log common

    <Directory "/home/myapp/www">
        AllowOverride None
        php_flag register_globals Off
        php_flag gpc_magic_quotes Off

    #   <IfModule mod_rewrite.c>
    #       # The following block is for masking "index.php" in the url
    #       # We also need to configure the app: urlManager.showScriptName = false
    #       Options +FollowSymLinks
    #       IndexIgnore */*
    #       RewriteEngine on
    #       RewriteCond %{REQUEST_FILENAME} !-f
    #       RewriteCond %{REQUEST_FILENAME} !-d
    #       RewriteRule . index.php
    #   </IfModule>
    </Directory>

    <Directory "/home/myapp/www/protected">
        Deny from All
    </Directory>

    <Directory "/home/myapp/www/assets">
        php_admin_flag engine off
        Options -Indexes
    </Directory>
</VirtualHost>

نکات مفید و مهم در تمامی برنامه PHP :

در این قسمت می خواهیم برخی از نکات مفید در امنیت را برای شما عزیزان بیان کنیم :

 

  • allow_url_include باید off باشد.
  • register_globals  یکی از خطر ناکترین راه های نفوذ است که همواره باید off باشد.
  • magic_quotes_gpc  در بسیاری از برنامه های php مهم است و استفاده می شود، اما در Yii مورد استفاده نیست. باید off باشد.
  • open_basedir  می تواند دسترسی PHP را تنها به برخی از پوشه ها محدود نماید. از این مورد باید با دقت استفاده کنید.
  • error_reporting باید همیشه مقدار E_ERRORS را داشته باشد تا تنها خطا ها نمایش داده شوند. می توانید برای اطلاعات بیشتر به مستندات آن مراجعه کنید.  

 

توجه داشته باشید که تمامی این پارامتر ها را می توانید در فایل php.ini تنظیم نمایید. البته درصورتی که AllowOverride options در Apache فعال باشد، از طریق .htaccess نیز می توانید این کار را انجام دهید.

 

[apache]
# .htaccess file
php_flag display_errors off
php_value error_reporting -1

در صورت تمایل این امکان وجود دارد تا از طریق php_admin_flag   بصورت زیر امکان تغییر این پارامتر ها را بصورت داینامیک توسط .htaccess وini_set()  از بین ببرید.

 

[apache]
# Apache config file
<Directory "/var/www/myapp">
    php_admin_value open_basedir /var/www/myapp/:/tmp/
</Directory>

بررسی سطح دسترسی  (Authorization):

انجام عملیات مربوط به تعیین سطح دسترسی، به ما اطمینان می دهد که کاربران تنها به منابعی دسترسی خواهند داشت که اجازه آن را دارند. از آنجایی که این عمل، بسیار زمانبر و پر کار می باشد Yii Framework مکانیزم هایی را برای مدیریت دسترسی ها فراهم آورده است. برای اطلاعات بیشتر می توانید به Access Control Filter   و  Using Business Rules  مراجعه کنید. در کنار این دو منبع، می توانید سری به سیستم RBAC در Yii نیز بزنید. روشی دیگر اما تا حدودی محدود تر استفاده از CPhpAuthManage می باشد. در کنار موارد گفته شده، افزونه های دیگری نیز برای تامین سطح دستری (Authorization) وجود دارند که می توانند بسیار مفید باشند.

 

احراز هویت (Authentication):

 

رمز عبور :

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

 

<?php
class User extends CActiveRecord
{
    public function rules()
    {
        return array(
            array('password', 'checkPasswordStrength'),
        );
    }
 
    protected function checkPasswordStrength($attribute, $params)
    {
        $password = $this->$attribute;
        $valid = true;
        $valid = $valid && preg_match('/[0-9]/', $password); // digit
        $valid = $valid && preg_match('/\W/', $password); // non-alphanum
        // ... other rules ...
        $valid = $valid && (strlen($password) > 7); // min size
        if ($valid) {
            return true;
        } else {
            $this->addError($attribute, "Not secure enough");
            return false;
        }
    }

استفاده از اعتبار سنجی سمت سرویس گیرنده (client-side) از این بابت می تواند مفید باشد که کاربر بسرعت متوجه ضعیف بودن رمز عبور انتخابی خود می گردد، اما باید توجه داشته باشید که این دلیل بر حذف اعتبار سنجی سمت سرور نمی گردد و شما همواره باید توسط کد های PHP  رمز عبور کاربر را چک کنید. دقت کنید که هر دو نوع اعتبارسنجی برنامه شما باید از یک قانون پیروی کنند و مانند یکدیگر باشند که شاید این مسئله کار را کمی سخت تر نماید. برای سادگی کار می توانید از estrongpassword استفاده کنید.

 

رمز کردن رمز عبور :

این بخش مربوط به برنامه هایی است که سیستم احراز هویت داخلی دارند و از LADP، SSO، OpenID و یا سرویس های دیگر استفاده نمی کنند.

اگر علیات احراز هویت داخلی باشد، نباید رمز عبور را بصورت متنی ساده و رمز نشده ذخیره نمود. ساده ترین راهکار برای رمز گذاری استفاده از کتابخانه PHPass است. در Yii Framework می توانید اینکار را بسادگی در مدل User خود انجام دهید:

 

<?php
// autoload "protected/lib/PasswordHash.php"
Yii::import('application.lib.PasswordHash');
 
class User extends CActiveRecord
{
    public function validatePassword($password) // $password is the user input
    {
        // Try to use stronger but system-specific hashes, with a possible fallback to
        // the weaker portable hashes.
        $hasher = new PasswordHash(8, FALSE);
        return $hasher->checkPassword($password, $this->password);
    }
 
    public function beforeSave()
    {
        // Replace the raw password with the hashed one
        if (isset($this->password)) {
            $hasher = new PasswordHash(8, FALSE);
            $this->password = $hasher->HashPassword($this->password);
        }
        return parent::beforeSave();
    }

این کتابخانه در واقع از یک salt تصادفی استفاده می کند و با استفاده از بهترین الگوریتم هش (hash) چندین مرتبه رمز عبور را رمز می کند. البته نوشتن کد مربوط به اینکار توسط خودتان نیز کار دشواری نیست، اما چرا چرخ را دو مربته اختراع کنیم؟ علاوه براین نویسنده این کتابخانه یم متخصص امنیت است که ابزار معروف چک کردن رمز عبور “john the ripper” را نوشته است. اگر می خواهید مطالب بیشتری را در مورد رمز عبور بدانید، می توانید سری به وب سایت این کتابخانه بزنید.

 

ابزار های مفید :

ابزار های بسیاری هستند که می توانند باگ های امنیتی برنامه شما را برایتان تشخیص دهند. برخی از این ابزار ها عبارتند از :

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

 

موفق و پیروز باشید

منبع : امنیت در Yii Framework

 

 

 

 

hamedkh
5.8 k     1     18     72
نظرات
نظر داده نشده است
آموزش زبان برنامه نویسی C#
آموزش jquery

آموزش زبان جاوا Java
آموزش زبان انگلیسی
آموزش برنامه نویسی C
آموزش برنامه نویسی C++
آموزش جی کوئری jQuery
آموزش زبان سی شارپ C#
آموزش برنامه نویسی اندروید
آموزش برنامه نویسی اندروید
آموزش زبان اسمبلی Assembly
آموزش جاوا اسکریپت JavaScript
آموزش برنامه نویسی به زبان PHP