یک وبلاگ دیگر از یک برنامه نویس دیگر
CSRF یا چطور چرخ رو دوباره اختراع کردم
امروز یه اتفاق خیلی ساده، یه درس بزرگ بهم داد. داشتم یه برنامه ساده CRUD مینوشتم، یعنی یه برنامه ای که یه سری فیلد رو توی دیتابیس بنویسه، ویرایش داشته باشه و حذف کنه و در نهایت نشون بده.
این برنامه فقط برای نمایش برای یه نفر بود که میخواست یه چیزی یاد بگیره :دی خیلی ساده.
مساله لینک حذف بود، این لینک :
http://localhost/admin.php?del=10
در حقیقت این میومد و ردیف شماره ۱۰ رو حذف میکرد. البته توی admin.php بررسی میشد که آیا کاربر اجازه دسترسی داره یا نه. اگه اجازه حذف داشت اونوقت حذف رو انجام میداد. به نظر همه چی درست بود، ولی یه اتفاق باعث شد بفهمم یه جای کار میلنگه.
این لینک رو اتفاقی کپی کردم توی کلیپ برد. خودمم همزمان میخواستم یه جایی تو یه پیغام شخصی فروم، یه عکس بگذارم. منتها اشتباها این لینک کپی شد به جای لینک عکس اصلی. از اونجایی که دقت منم در حد تیم ملیه :) عکس رو با بدون اینکه آدرسش رو چک کنم گذاشتم توی پیغام، دکمه پیشنمایش رو زدم و …
باقیش معلومه. فیلد ۱۰ حذف شد، و من حتی متوجه نشده بودم تا یه کم بعد رفتم دوباره سراغ برنامه.
خوب این یعنی که با اینکه من امنیت رو کاملا حفظ کرده بودم توی فایل admin.php ولی این امنیت خیلی راحت به هم ریخت با وادار شدن من برای دیدن یه عکس. خوب اگه اینکار رو یه نفر دیگه انجام میداد و یه پیغام حاوی لینک حذف برای من میفرستاد که مثلا به صورت عکس جاسازی شده بود، خیلی راحت به مقصودش میرسید. من اجازه حذف دارم، و فقط کافیه اون لینک یه بار توسط من ویزیت بشه، به هر صورتی.
راه چاره چیه؟؟ اینکه از متد GET استفاده نکنیم.یا اینکه تو صفحه دوم هم یه سوال بپرسیم و بعد از طریق متد پست حذف نهایی رو توی مرحله دوم انجام بدیم، یه کمی به نظر من اعصاب خورد کنه.
البته من یه پیشنهاد هم دارم، که فکر میکنم بد نباشه. یه کلمه رندوم ایجاد بشه تو هر جلسه برای هر کاربر، مثلا به اسم $salt . از هر جلسه به جلسه دیگه متفاوت باشه. به جای لینک بالا، از این لینک استفاده بشه (یا چیزی شبیه اون):
http://localhost/admin.php?del=10&salt=$slat
وقت حذف علاوه بر بررسی سطح دسترسی کاربر این “نمک” هم بررسی بشه :) اگه اونم با متغییری که تو جلسه ذخیره شده برابر بود کاری که باید انجام بشه،انجام بشه.
اینطوری، کسی نمیتونه لینک رو درست کنه. (مگه اینکه یه جوری جلسه مدیر رو بدزده، که خوب در اون صورت دسترسی خود مدیر رو داره و دیگه لازم نیست یه همچین کارهایی رو انجام بده، خودش دسترسی داره و میتونه هر کاری میخواد بکنه!!)
پ.ن : به این روش میگن CSRF یا Cross-Site Request Forgery که جالب اینه که خودم هم میدونستم ولی هیچوقت دقت نکرده بودم یعنی همیشه طور دیگه ای بهش نگاه میکردم، اینکه مثلا یه سایت خطرناک رو به خورد کاربر بدن نه سایتی که اصلا خطری نداره و اتفاقا کاربر اجازه دسترسی بهش رو داره و از دسترسی کاربر سواستفاده بشه. این روش هم من دوباره کشف کردم، قبل از من بازم کشف شده بوده :D و من فقط دوباره چرخ رو اختراع کردم!!
بیشتر درباره این قضیه که بگردید دوباره منابع بهتری رو پیدا میکنید و راه حلهای دقیقتر و بهتری.
| چاپ این نوشته | این نوشته توسط فرود در روز 2010/08/13 در ساعت 19:01 نوشته شده است و در دسته PHP, امنیت در PHP, برنامه نویسی, فوت کوزه گری دسته بندی شده است. پاسخهای این نوشته را از طریق RSS 2.0 دنبال کنید. شما میتوانید نظر خود را ارسال کنید یا از سایت خود دنبالک ارسال کنید. |





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