بسیاری از برنامه نویس ها فکر می کنند اگر کدی بنویسند که “کار کند”، یعنی کارشان تمام شده است. اما از نگاه یک متخصص امنیت یا باگ بانتی، کد شما فقط یک مسئله نیست؛ بلکه یک نقشه راه برای حمله است.
در این مقاله، میخواهم از تجربه ی خودم در دنیای باگ بانتی بگویم و چند از رایج ترین اشتباهاتی را بررسی کنم که من به عنوان یک هکر، اولین چیزهایی هستند که برای پیدا کردن راه ورود به یک سیستم، به دنبالشان میگردم.
بزرگترین اشتباهی که من در مسابقات CTF و در دنیای واقعی با آن روبرو شده ام، اعتماد به ورودی های کاربر است. وقتی شما یک فرم ثبت نام، یک فیلد جستجو یا حتی یک پارامتر در URL دارید، آنجا دقیقاً نقطه ای است که من با آن شروع میکنم.
از نظر برنامه نویس: “من فقط یک نام کاربری میگیرم، چه آسیبی می تواند داشته باشد؟”
از نظر هکر: “من به جای نام کاربری، یک قطعه کد SQL یا یک اسکریپت می گذارم تا ببینم آیا دیتابیس شما یا مرورگر کاربر قربانی من می شود یا خیر!”
مثال های عملی:

حمله SQL Injection:
اگر برنامه نویس ورودی را فیلتر نکند، من می توانم با وارد کردن عبارت زیر، از منطق دیتابیس عبور کنم و بدون پسورد وارد شوم
1' OR '1'='1
حمله XSS (Cross-Site Scripting):
اگر دیدم فیلد ورودی (مثلاً فیلد کامنت) نسبت به اسکریپت ها آسیب پذیر است، از این کد برای اجرای دستورات جاوااسکریپت در مرورگر بقیه استفاده میکنم:
نمایش کد
alert('Hacked!')
💡 راه حل: همیشه از Input Validation و Parameterized Queries استفاده کنید تا از حملاتی مثل SQL Injection و XSS جلوگیری کنید.
برنامه نویس ها گاهی در مدیریت Sessionها یا JWTها (JSON Web Tokens) اشتباه می کنند. اگر توکن های شما قابل پیش بینی باشند یا در URL نمایش داده شوند، من به راحتی می توانم هویت یک کاربر دیگر را جعل کنم.
از نظر هکر: “اگر الگوریتم ساخت توکن شما ضعیف باشد، من می توانم توکن مدیر سایت را تولید کنم و بدون نیاز به پسورد، وارد سیستم شوم!”
💡 راه حل: از کتابخانه های استاندارد و امن برای مدیریت نشست ها استفاده کنید و هرگز اطلاعات حساس را در URL یا کدهای سمت کلاینت (Client-side) قرار ندهید.
این یکی از لذت بخش ترین بخش ها برای یک هکر است! وقتی کدی را اجرا می کنید و به جای یک پیام ساده مثل “خطایی رخ داد”، با یک Stack Trace طولانی یا مشخصات دیتابیس و ورژن سرور روبرو می شوید، شما عملاً دارید به من نقشه ساختمان را می دهید.
از نظر برنامه نویس: “این پیام خطا خیلی کمک می کند تا بفهمم مشکل از کجاست!”
از نظر هکر: “ممنون! حالا دقیقاً میدانم از چه نسخه ای از پایتون یا چه نوع دیتابیسی استفاده میکنید و کدام اکسپلویت (Exploit) برای شما جواب می دهد.”
مثال اشتباه:
در فرم ورود اگر ایمیل یا رمز عبور اشتباه باشد، نباید بگویید: «ایمیل شما پیدا نشد» یا «رمز عبور اشتباه است». چون این یعنی من تایید گرفتم که این ایمیل در سایت هست و می توانم با خیال راحت رمز آن را بشکنم.
مثال درست:
باید بنویسید: «ایمیل یا رمز عبور اشتباه است.» (بدون اینکه مشخص شود کدام یک مشکل دارد).
نحوه اجرا sql injection به صورت تصویر :

نحوه اجرا xss به صورت تصویر :

امنیت، یک مرحله نیست، بلکه یک فرآیند است. اگر می خواهید برنامه نویس خوبی باشید، باید یاد بگیرید که مثل یک هکر فکر کنید. یادگیری امنیت، باعث نمی شود کد شما کند شود؛ بلکه باعث میشود کد شما “قابل اعتماد” شود.
شما در پروژه های خود چطور با امنیت برخورد میکنید؟ آیا تا به حال با اشتباه امنیتی در کدهایتان روبرو شده اید؟ در کامنت ها برایم بنویسید خوشحال می شوم بدانم :)