مدلهای زبانی کدی مینویسند که «کار کند»: مسیر عادی را درست پیاده میکنند و چیزهایی را که در دستور نخواستهاید، مثل احراز هویت، اعتبارسنجی ورودی و محدودیت نرخ، جا میاندازند. پس قبل از انتشار، کد را نه برای اینکه «کار میکند؟» بلکه برای اینکه «چطور میشود از آن سوءاستفاده کرد؟» بخوانید.
ده نقطهضعف پرتکرار
| # | مشکل | چطور پیدا کنیم |
|---|---|---|
| ۱ | کلید و رمز داخل کد | جستجوی key، secret، password، token در پروژه |
| ۲ | مسیرهای API بدون احراز هویت | هر مسیر را بدون ورود صدا بزنید |
| ۳ | بررسی مالکیت نشده | با کاربر الف، دادهی کاربر ب را با تغییر شناسه در آدرس بخواهید |
| ۴ | تزریق SQL | هر جا متغیر داخل رشتهی SQL چسبانده شده |
| ۵ | XSS | هر جا ورودی کاربر با innerHTML یا بدون escape نمایش داده میشود |
| ۶ | آپلود فایل بیقید | نوع، حجم و محل ذخیره |
| ۷ | نبود محدودیت نرخ | ورود، ثبتنام، فرم تماس، هر مسیر پرهزینه |
| ۸ | پیام خطای پرجزئیات | نمایش stack trace و مسیر فایل به کاربر |
| ۹ | CORS باز برای همه | تنظیم * روی مسیرهای حساس |
| ۱۰ | وابستگی ساختگی یا قدیمی | نام هر پکیج را در مخزن رسمی بررسی کنید |
دربارهی شمارهی ۱۰
مدلها گاهی نام پکیجی را مینویسند که وجود ندارد. مهاجمان همان نامها را ثبت میکنند و کد مخرب در آن میگذارند. قبل از نصب هر پکیجی که نمیشناسید، ببینید واقعاً وجود دارد، چه کسی منتشرش کرده و چقدر استفاده میشود.
چیزهایی که به مرورگر میروند
هر چیزی که در کد سمت مرورگر است، عمومی است: کلیدها، منطق قیمتگذاری، بررسی دسترسی. بررسی دسترسی فقط روی سرور معتبر است؛ پنهان کردن یک دکمه در صفحه، امنیت نیست. (نگهداری کلید API)
روش بازبینی
- ورودیها را فهرست کنید: هر فرم، پارامتر آدرس، سربرگ و فایل.
- هر ورودی را دنبال کنید تا جایی که به دیتابیس، فایل، دستور سیستم یا صفحه میرسد.
- مسیرها را بدون ورود و با کاربر اشتباه امتحان کنید.
- از یک مدل دیگر، در گفتگوی تازه، بازبینی بخواهید.
- ابزار بررسی وابستگیها را اجرا کنید (مثل npm audit).
دستور بازبینی
این کد را بهعنوان بازبین امنیتی بخوان. فرض کن مهاجم هستی.
برای هر مورد فقط اگر واقعاً در کد هست گزارش بده، با فایل و خط:
احراز هویت، بررسی مالکیت، تزریق، XSS، آپلود، رمز در کد، محدودیت نرخ.
برای هر مورد یک سناریوی مشخص سوءاستفاده بنویس.
بهتر است از اول درست بخواهید
در دستور اولیه بنویسید: «همهی مسیرها احراز هویت داشته باشند، ورودیها اعتبارسنجی شوند، کوئریها پارامتری باشند، رمزها از متغیر محیطی خوانده شوند.» خروجی بهوضوح بهتر میشود، ولی بازبینی همچنان لازم است.
روی هاست
- فایل env. و بکاپها بیرون از پوشهی وب.
- نمایش خطا در production خاموش، لاگ روشن.
- SSL فعال.
- بکاپ قبل از هر استقرار.
سوالهای رایج
مدل نمیتواند خودش کد امن بنویسد؟
میتواند، اگر بخواهید و بعد بررسی کنید. مسئولیت با کسی است که منتشر میکند.
برای وردپرس؟
پروژهام کوچک است؛ لازم است؟
رباتها بین سایت کوچک و بزرگ فرق نمیگذارند.