خب سلام.
امشب داشتم روی پلاگین وردپرسیمون که به زودی عرضه میشه کار میکردم و به این نکته برخوردم که ممکنه یکم سحل انگاری به کار بدم و کد هام رو اونطوری که باید تست نکرده باشم.
متاسفانه اینطور هم بود و بعد چک کردن به باگ هایی برخوردم که اکثرا بخاطر مشغله زیاد یا کم تمرکز بودن ایجاد شده بودن.
مهترین مسأله این بود که اروری نداشتیم و این دقیقا چیزیه که همه ما درموردش اشتباه میکنیم؛هر کدی که کار میکنه صرفا یه کد خوب و تمیز نیست.
شروع کردم به رفع کردن باگ ها و طبق معمول یه کامیت به گیت عزیز دادم و پروژه رو آپدیت کردم و به خودم قول دادم از این به بعد بیشتر روی کد هایی که مینویسم فکر کنم و از اون مهمتر:کدهامو از هر نحوی تست کنم.
خب قطعا مهمترین باگ ها که باید خیلی مواظب بود باگ های امنیتی مخصوصا توی وب اپلیکیشن ها و API ها و حتی نرم افزار های native که ممکنه یه دیتای حساس داخلش نوشته بشه (مثل پسورد ادمین و دسترسی ها به کل از طریق API) و اینجاست که یه نفر رشته های نرم افزار شما رو به راحتی با نرم افزار های معکوس کننده برگردونه و...
یکی از این باگ های امنیتی که برای من هم پیش اومده اینه که شما وقتی به کاربر دسترسی آپلود فایل رو میدین کاربر میتونه یه فایلی که مخرب هست رو به سرور شما به اصطلاح inject یا تزریق کنه و اون فایل رو اجرا کنه و به سرور یا دیتای های شما آسیب بزنه یا از اون ها استفاده نادرست بکنه.
ممکنه که خیلی از ما این اشتباه رو کرده باشیم و بگیم که خب کاری نداره که من میام میگم من فقط فایل هایی که فرمتشون jpg هست رو قبول میکنم.
اینجاست که دقیقا اشتباه بزرگی کردین:توی دنیای لینوکس فایل ها از طریق فرمت شناخته نمیشن بلکه از طریق دیتای باینری یا هگزادسیمال اون ذخیره میشه و میشه با یه نرم افزار ساده ویرایشگر hex روش شناسایی فرمت رو دور زد و فایل php یا غیره خودمون رو توی سرور با فرمت jpg ذخیره و اجرا کرد.
برای جلوگیری از این نوع حمله شما میتونید از کتابخانه ها و ابزار های آماده امنیتی استفاده کنید که باگ های اونا اکثرا رفع شده یا از طریق فانکشن های خود php یا زبان برنامه نویسیتون نوع فرمت فایل رو به طور دقیق بفهمید.
یکی از توابع توی php برای چک کردن فرمت تابع mime_content_type هست که وابسته به توابع finfo هست و میتونه فرمت فایل رو از طریق کد هگز بفهمه و به شما کمک کنه از حملات از طریق آپلود جلوگیری کنین.
خیلی مهمه که شما قبل از نوشتن کد اون رو کاملا توی ذهنتون بنویسید و اجراش کنید و رو یه کاغذ تمامی مراحل و ویژگی ها و اصولی که باید در برنامه رعایت شه رو بنویسید این به شما کمک میکنه که راحت تر پروژه ای که قراره پیاده سازی بشه رو درک کنید.
از نظر من از مهمترین بخش های کد نویسی همینه که شما یک برنامه نویسی باشید که از تمامی زوایا به یک برنامه و مشکلاتی که توی اون میتونه بوجود بیاد نگاه کنه،اشتباه رایجی که گاهی مرتکب آن میشیم اینه که ما با اینکه مطلع هستیم که ممکنه این کدی که نوشتیم یا برنامه ای که ران کردیم دارای یه باگ امنیتی باشه ولی اون رو نادیده میگیریم(چون هیشکی اونو نمیبینه پس نمیتونه پیدا کنه) یا زمان رفع اون رو به تعویق میندازیم و با خودمون میگیم که "بعدا حلش میکنم" و این "بعدا" یعنی "هیچوقت".پس سعی کنید کدی که نوشتید رو قدم به قدم ران کنید و ببینید که مشکلی داره یا نه.
پیشنهاد من اینه که کدی که نوشتید رو از چند طریق تست کنید:
اجرا:قطعا وقتی ما کدنویسی میکنیم هدفمون اجرای اون کد و کار کردن به دلخواه ماست؛کد هایی که مینویسید رو به صورت گام به گام و با دقت تست کنید،به طور مثال اگر یه تابع نوشتید اون رو تست کنید و از درست اجرا شدن و کار کردن آن مطمعن بشید و بعد ادامه راه رو برید،این روش میتونه به شما کمک کنه که اگه مشکلی پیش اومد سریع تر رفع کنید؛چرا؟ چون تست کردن یه تابع با ۱۰ خط کد خیلی آسون تر از تست یه کلاس با کلی تابع یا یه فایل پر از کده که ممکنه پر از اشتباه باشه.
تحمل ارور:حتما برای شما هم پیش اومده که یه نرم افزار به اصطلاح کرش کنه یا ارور بده و خارج بشه و ممکنه اطالاعتی که از طریق متغییر ها توی رم ذخیره شده بود پاک شن و مشکلات دیگه،خیلی مهمه که برنامه که مینویسیم تحمل ارور رو داشته باشه و بتونه در صورت بروز یک خطا اون رو کنترل کنه و از طریق یک alert به کاربر هشدار بده که کاربر هم بتونه تعامل بهتری با نرم افزار داشته باشه.البته با اینکه این خطا ها کم پیش میاد اما باید توجه داشته باشیم.
باگ های امنیتی:همونطور که اشاره شد باگ های امنیتی خیلی میتونن خطرناک باشن و هر دولوپر خوبی باید بتونه باگ های امنیتی رو تست کنه و اونارو رفع کنه.البته باگ های امنیتی هر روز پیدا و رفع میشن و هزاران هزار باگ وجود داره که میتونه باعث نفوذ به سایت شما بشه.پس هیچوقت به امنیت کد هایی که نوشتید اعتماد نکنید :)
نرم افزار های تست امنیت وب سایت برخلاف اون ذهنیتی که ازشون دارن میتونن بهمون کمک کنن تا باگ های امنیتی مثل باگ های SQL Injection رو پیدا کرد و اون رو رفع کرد.
اگر یه کد حتی ساده نوشتید سعی کنید اون رو تمیز و به بهترین شکل بنویسید طوری که به خودتون بگید ایول این بهترین چیزی بود که میتونستم بنویسم و همچنین بعد نوشتن کدتون قطعا اون رو از هر طریق تست کنید(مثل کارفرما ها که با برنامه های ناز ما خشن رفتار میکنند :))
خیلی ممنون از مطالعه این نوشته :)
امضا : mhsn