آژانس هواپیماییexchanging

مقاله امنیت در php

شروع موضوع توسط smit.doctor ‏23 آپریل 2010 در انجمن PHP

  1. smit.doctor

    smit.doctor Registered User

    تاریخ عضویت:
    ‏7 ژانویه 2008
    نوشته ها:
    448
    تشکر شده:
    12
    سلام
    تو این تاپیک قرار هست نکات تجربی و تئوریکی که در مورد امنیت یک کد میتونه کمک بکنه رو راجبش بحث کنیم!
     
    Last edited: ‏23 آپریل 2010
  2. smit.doctor

    smit.doctor Registered User

    تاریخ عضویت:
    ‏7 ژانویه 2008
    نوشته ها:
    448
    تشکر شده:
    12
    اما اولین مورد:
    امنیت در فرم ها یا مقابله با حملات form spoofing
    خوب تقریبا هیچ سایت داینامیکی نیست که حداقل یک فرم توش موجود نباشه! فرم ها برای گرفتن اطلاعات از کاربر استفاده میشن و خوب همین یعنی در بعضی موارد فاجعه! چرا خوب معلومه چون داریم از کاربر اطلاعاتی رو میگیریم و معلوم نیست اون چه چیزی رو وارد کنه!!! برای همین همیشه باید به فرم ها به یه چشم دیگه ای نگاه شه ! و نباید سرسری ازشون رد شد! البته یه بار دیگه هم گفتم هر چیزی باید به اندازه و به جا استفاده شه! پس اگر سایتی دارید که اطلاعات ورودی فرم براتون مهم هست حتما باید روش کار کنید!
    اولین نکته ای که توی فرم ها میشه رعایت کرد تا از ورود داده های غیر مجاز جلوگیری کنیم روشی هست به نام filter input
    درواقع تو این روش داده هایی که نباید وارد شن رو فیلتر میکنیم!
    حالا یه مثال راجبش:
    کد:

    <form action="form.php" method="POST">
    username: <input type=text name=username >
    username: <input type=text name=pass >
    favourite colour:
    <select name="color"<
    <option> red </option>
    <option> blue</option>
    <option> green </option>
    </select>
    <input type=submit<
    </form>

    خوب نیازی به توضیح نداره دو تافیلد تکست داریم یکی برای نام کاربری و یکی برای پسورد و یه سلکت داریم که کاربر رنگ مورد علاقه خودش رو وارد میکنه!
    فعلا بحث سر معتبر سازی بوسیله فیلتر ورودی هست پس روی مقادیر ورودی برای نام کاربری و کلمه عبور نمیتونیم نظارتی بکنیم! اما یه سلکت داریم که بحث فیلتر رو روی اون ادامه میدیم! شما از کجا میتونید مطمئن باشید که کاربر یکی از همون رنگ ها رو به عنوان ورودی وارد میکنه و مثلا رنگ yellow رو براتون نمیفرسته که تو سلکت ما موجود نبود! اینجا این روش به کارتون میاد که همونطور که گفتم میاید یک فیلترینگ برای ورودی های غیر مجاز انجام میدید!
    حالا چه جوری اینجوری:
    کد PHP:
    $colour=array('Red','Blue','Green');
    if(!in_array($_post[color],$colour){
    header("location: form.php);
    }
    خوب ما اومدیم برای این کار یک آرایه از رنگ های مجاز ایجاد کردیم و گفتیم آقای کامپایلر php اگر رنگی که ارسال شد داخل آرایه رنگ های مجاز نبود این کاربر شیطون رو باز بفرست به صفحه ای که فرم رو ایجاد میکنه!
    پس اولین نکته ای که توی فرم باید رعایت شه فیلتر کردن ورودی های کاربر هست!
    در پایان یک بار دیگه هم عرض میکنم همه چیز باید به جاش خرج شه حتی امنیت! اگر شما مقادیر ورودی کاربر برای این فیلد رو مهم نمیدونید پس لازم نیست این کار رو انجام بدید!
    یه نکته دیگه که راجب فرم ها هست مطمئن شدن از این نکته هست که واقعا فرم برای ماست سا نه کاربر خودش فرم رو ایجاد کرده! به عبارت دیگه فرض کنید شما اومدید یه فرم توی سایتتون ایجاد کردید و دارید از کاربر اطلاعاتی میگیرید و روش پردازشی انجاکم میدید. از کجا مطمئنید که فرم مال سایت خودتون هست به عبارت دیگه اگر من فرمی به شکل :
    کد:

    <form action="http://www.xxx.com/form.php" method="POST">
    username: <input type=text name=username >
    username: <input type=text name=pass >
    favourite colour:
    <select name="color"<
    <option> red </option>
    <option> blue</option>
    <option> green </option>
    </select>
    <input type=submit<
    </form>

    درست کنم روی سایت خودم خوب میتونم مقادیر دلخواه خودم رو برای شما بفرستم!
    پس این نکته میمونه که باید ریفر فرم رو همیشه چک کرد! برای چک کردن ریفرز هم که مطوئن شید این اطلاعات از طریق فرم موجود توی سایت خودتون ایجاد شده میتونید از:
    کد PHP:
    $_SERVER['HTTP_REFERER']
     
  3. smit.doctor

    smit.doctor Registered User

    تاریخ عضویت:
    ‏7 ژانویه 2008
    نوشته ها:
    448
    تشکر شده:
    12
    Register Globals

    سلام
    خوب همتون تا حالا حتما هاست خریدید. و حتما هم برنامه هایی رو دیدید که برای کار
    احتیاج به متغییر هایی دارن:D!!
    خوب تا حالا هم حتما اسم Register Globals و تنظیم اون یعنی register_globals رو شنیدید.
    امروز میخوایم در مورد تنظیم register_globals بحث کنیم و ثابت کنیم که بر خلاف تصور
    این تنظیم به خودی خود یه خطر نیست بلکه نحوه به کار گیریش میتونه خطرناک باشه!!
    اول یکم راجب این تنظیم توضیح بدیم. register_globals یک تنظیم php هست که میاد داده ها رو از ارایه های فوق عمومی
    یعنی:
    کد:

    ($_GET, $_POST, $_SERVER, $_COOKIE, $_REQUEST and $_FILE)

    میگیره و اونها رو به عنوان متغییر های عمومی رجیستر میکنه. یعنی میاد متغییر
    کد:

    $_POST['message']

    مثلا میگیره و اون رو به متغییر عمومی
    کد:

    $message

    میده. که خوب همونطور که میبینید در بعضی جاها این تنظیم میتونه واقعا مفید باشه و بعضی کار ها رو ساده کنه.
    که خیلی خوبه کی از ساده شدن کار ها بدش میاد!!
    اما این تنظیم در نسخه های جدید php غیرفعال شده و هاستینگ ها هم فعالش نیمیکنن
    و دلیل اون رو مسائل امنیتی میدونن!! کاملا هم حق دارن چرا !!
    اینجاش جالبه شما فرض کنید من یه کد بزنم برا لوگین کاربر به صورت:
    کد PHP:
    if($_POST['username'] == 'rob' && $_POST['password'] == 'foo') {
    $authenticated = true;
    }

    if($authenticated) {
    // do some admin thing
    }
    اگر register_globals غیر فعال یا خاموش باشه این یه سیستم لوگین خوب و کاراست اما
    فرض کنیم register_globals فعال یا روشن باشه
    اتفاق جالبی که میفته اینه که اگر یه نفوذگر یا هکر یا هر چیزی که اسمش رو بزارید توی ادرس بار و بعد از نام اسکریپت تایپ کنه :
    کد:

    script.php?authenticated=true

    اونوقت فکر کنم تا تهش رو خوندید!!
    این کاربر به همین راحتی حق دسترسی گرفت. واقعا راحت تر از این نمیشد:D
    همونطور که دیدید این تنظیم واقعا در صورت فعال بودن میتونه یه خطر بزرگ باشه! اما خود این تنظیم یه خطر بزرگ نیست
    بلکه نوع کدنویسی ما خطرناکش میکنه!! و چون هاستینگ ها و حتی خود توسعه دهندگان
    php نمیتونن مسئول کد نویسی دریت ما باشن این تنظیم رو غیر فعال کردن و به عنوان یه تهدید
    امنیتی ازش نام میبرن که خوب حق هم دارن! اگر مسائلی رعایت نشه دقیقا این تنظیم میتونه فاجعه بار باشه!
    مثلا اگر کد بالا به صورت:
    کد PHP:
    if($_POST['username'] == 'rob' && $_POST['password'] == 'foo') {
    // do some admin thing
    }
    بود هیچ خطر امنیتی ای وجود نداشت و هیچ اتفاق خاصی نمیافتاد مگر اینکه کلمه عبور و نام کاربری رو نفوذگر میدونست!!
    ولی با این وجود چون واقعا بعضی موقع ها آدم حواسش نیست چه جوری داره کد میزنه:D بهتره این تنظیم همیشه غیر فعال باشه
    تا از اینجور اتفاقات هم نیفته!
    حالا فکر کنم دیگه با من هم عقیده هستید که این تنظیم به خودی خود یه تهدید امنیتی نیست اما نوع
    کد نویسی ما اون رو یه تهدید امنیتی خطرناک میکنه.
    موفق باشید
     
  4. ITstudio

    ITstudio Registered User

    تاریخ عضویت:
    ‏16 سپتامبر 2009
    نوشته ها:
    365
    تشکر شده:
    7
    محل سکونت:
    Tehran - IRAN
    خیلی عاااااااااااالی، خواهشاً فقط ادامه بدین واقعاً مفید بود، اگر امکانش هم هست چند تا کتاب خارجی منبع معرفی کنید، ممنون!
     
  5. imangh

    imangh Registered User

    تاریخ عضویت:
    ‏17 می 2006
    نوشته ها:
    44
    تشکر شده:
    1
    ممنون از این تاپیک خوب.
    در مورد ارسال شماره 2 در مورد REFERER می خواستم این نکته را یاداور بشم که از آنجایی که این REFERER را مرورگر ست می کند و به سرور می فرستد چندان قابل اطمینان نیست چون ممکن است بعضی مرور گرها در شرایط خاصی آن را ارسال نکنند و یا با اعمال تغییراتی در مرورگر مقدار آن توسط کاربر شیطون تغییر کنه. می تونید برای پیدا کردن اکستنشن این کار یک سرچ در addon های فایرفاکس بزنید.