راهنمای کارفرما به‌روزرسانی ۱۴۰۵/۰۵/۳۱ ۱۶ دقیقه

تدوین و انتشار توسط

چک‌لیست برنامه‌نویسی امن؛ کنترل‌های ضروری از طراحی تا انتشار

برنامه‌نویسی امن فقط بررسی چند خط کد پیش از انتشار نیست. کنترل‌های امنیتی باید از نیازمندی و معماری آغاز شوند، در کد و زنجیره ساخت ادامه پیدا کنند و با تست، شواهد تحویل و فرایند پاسخ به آسیب‌پذیری کامل شوند.

تصویر راهنمای چک‌لیست برنامه‌نویسی امن؛ کنترل‌های ضروری از طراحی تا انتشار

پاسخ کوتاه

چک‌لیست برنامه‌نویسی امن باید حداقل نیازهای امنیتی و مدل تهدید، احراز هویت و مجوزها، اعتبارسنجی ورودی و Encode خروجی، حفاظت داده و Secrets، مدیریت وابستگی و زنجیره ساخت، Logging و مدیریت خطا، تست امنیتی و برنامه رفع آسیب‌پذیری را پوشش دهد. این فهرست نقطه شروع است و باید متناسب با داده، نقش‌ها، معماری و ریسک هر پروژه با الزام‌های قابل آزمون تکمیل شود.

OWASP ASVS برای تبدیل عبارت مبهم «سامانه امن باشد» به الزام‌های قابل آزمون و قراردادی مناسب است.
اسکن خودکار مفید است، اما جای Threat Modeling، بازبینی دسترسی و آزمون منطق کسب‌وکار را نمی‌گیرد.
خروجی امنیت باید قابل اثبات باشد: شناسه نسخه، نتیجه تست، یافته‌های باز و مالک اصلاح را ثبت کنید.

این چک‌لیست را چگونه در پروژه استفاده کنیم؟

همه کنترل‌ها برای همه سامانه‌ها وزن یکسان ندارند. ابتدا داده‌های حساس، نقش‌ها، مسیرهای اعتماد، سرویس‌های بیرونی و اثر سوءاستفاده را مشخص کنید؛ سپس هر کنترل مرتبط را به یک مسئول، مرحله اجرا و شاهد پذیرش متصل کنید.

کنترل

پرسش
چه رفتار یا محدودیتی لازم است؟
نمونه شاهد
الزام شماره‌دار یا معیار پذیرش

مالک

پرسش
چه کسی آن را پیاده و تأیید می‌کند؟
نمونه شاهد
تیم توسعه، زیرساخت یا مالک کسب‌وکار

مرحله

پرسش
طراحی، کدنویسی، Build یا استقرار؟
نمونه شاهد
Task متصل به نسخه یا Sprint

راستی‌آزمایی

پرسش
قبولی چگونه اثبات می‌شود؟
نمونه شاهد
تست، تنظیمات، Log یا گزارش بازبینی

نکته: NIST SSDF رویکرد مبتنی بر ریسک و نتیجه را توصیه می‌کند؛ چک‌لیست نباید به تیک‌زدن کنترل‌های نامرتبط تبدیل شود.

نیازمندی و طراحی امن

  • دارایی‌ها، داده‌های حساس، نقش‌ها و مرزهای اعتماد را پیش از پیاده‌سازی ثبت کنید.
  • Threat Model را برای جریان‌های حیاتی و اتصال‌های بیرونی تهیه و با تغییر معماری بازبینی کنید.
  • الزام‌های امنیتی را شماره‌دار، قابل آزمون و متناسب با سطح ریسک بنویسید.
  • فرض کنید Client، شبکه و ورودی بیرونی قابل اعتماد نیستند؛ کنترل اصلی را سمت سرور اجرا کنید.
  • مسیرهای خطا، سوءاستفاده، بازیابی و محدودیت نرخ را کنار مسیر موفق طراحی کنید.
  • داده‌ای را که نیاز ندارید جمع‌آوری نکنید و مدت نگهداری و حذف آن را تعیین کنید.

هویت، نشست و کنترل دسترسی

  • از سازوکار احراز هویت استاندارد و کتابخانه نگهداری‌شده استفاده کنید؛ الگوریتم اختصاصی نسازید.
  • گذرواژه را با الگوریتم Password Hashing مناسب و تنظیمات قابل ارتقا نگهداری کنید.
  • کنترل مجوز را در هر درخواست سمت سرور و بر اساس نقش، مالکیت و دامنه داده اعمال کنید.
  • شناسه قابل حدس را مجوز تلقی نکنید و دسترسی افقی و عمودی را جداگانه آزمایش کنید.
  • Session و Token باید انقضا، ابطال، Rotation و محافظت در برابر سرقت داشته باشند.
  • عملیات حساس مانند تغییر دسترسی یا حساب مقصد، تأیید و Audit متناسب با ریسک داشته باشد.

ورودی، خروجی، فایل و حفاظت داده

  • ورودی را بر اساس نوع، طول، محدوده و قالب مورد انتظار در مرز اعتماد اعتبارسنجی کنید.
  • برای Query از Parameterization استفاده کنید و داده را با رشته SQL یا Command ترکیب نکنید.
  • خروجی را متناسب با Context مقصد Encode کنید تا XSS و تزریق مشابه کاهش یابد.
  • آپلود فایل را از نظر نوع واقعی، اندازه، نام، محل ذخیره و دسترسی اجرا محدود کنید.
  • Serialization، Template، Redirect و درخواست‌های خروجی را با Allowlist و محدودیت بررسی کنید.
  • داده حساس را در انتقال و محل ذخیره با روش استاندارد محافظت و دسترسی آن را حداقلی کنید.
  • اطلاعات شخصی، Token، رمز و جزئیات داخلی را در پاسخ خطا یا Log نمایش ندهید.

Secrets، وابستگی‌ها و زنجیره ساخت

  • کلید و Secret را در کد، Git، Image، فایل قابل دانلود یا برنامه سمت کاربر قرار ندهید.
  • Secretها را برای هر محیط و سرویس جدا، با Scope حداقلی و برنامه Rotation مدیریت کنید.
  • نسخه وابستگی‌ها و ابزار Build را قفل و منبع دریافت Package را کنترل کنید.
  • وابستگی مستقیم و انتقالی را با SCA یا ابزار مناسب پایش و یافته‌ها را مالک‌گذاری کنید.
  • مجوز نرم‌افزاری، وضعیت نگهداری و End-of-Life وابستگی حیاتی را بررسی کنید.
  • دسترسی CI/CD، Registry و Artifact را حداقلی کنید و Branch/Release حساس را محافظت کنید.
  • Artifact نسخه نهایی را قابل ردیابی به Commit و Pipeline تأییدشده نگه دارید.

Logging، مدیریت خطا و پایش

  • رویدادهای امنیتی مانند ورود ناموفق، تغییر مجوز و عملیات حساس را با زمینه کافی ثبت کنید.
  • Log نباید شامل رمز، Token، Session، داده کامل پرداخت یا اطلاعات شخصی غیرضروری باشد.
  • پیام خطای کاربر ساده باشد و جزئیات فنی فقط در مسیر کنترل‌شده ثبت شود.
  • شناسه همبستگی برای اتصال درخواست، خطا و رخدادهای سرویس‌ها در نظر بگیرید.
  • Log را در برابر تغییر و دسترسی غیرمجاز محافظت و دوره نگهداری آن را مشخص کنید.
  • برای الگوهای غیرعادی، خطای تکرارشونده و سوءاستفاده از عملیات حساس هشدار تعریف کنید.

بازبینی، تست، انتشار و پاسخ به آسیب‌پذیری

  • تغییر حساس بدون بازبینی همتا و عبور تست‌های مرتبط وارد شاخه انتشار نشود.
  • SAST، SCA و Secret Scanning را در Pipeline اجرا کنید و قاعده برخورد با یافته را بنویسید.
  • DAST یا آزمون API را روی محیط مجاز و نزدیک به Production برای مسیرهای پرریسک اجرا کنید.
  • تست کنترل دسترسی، ورودی مرزی، Rate Limit و خطای سرویس بیرونی را به Regression اضافه کنید.
  • تنظیمات امن، Headerها، TLS، حساب سرویس و دسترسی زیرساخت را جدا از کد بازبینی کنید.
  • انتشار باید Health Check، مانیتورینگ و Rollback قابل اجرا داشته باشد.
  • مسیر دریافت، اولویت‌بندی، اصلاح و افشای مسئولانه آسیب‌پذیری‌های پس از انتشار را مشخص کنید.

کارفرما چه شواهدی باید تحویل بگیرد؟

ماتریس کنترل‌ها

حداقل محتوا
الزام، مالک، وضعیت و شاهد
هدف
جلوگیری از ادعای کلی امنیت

گزارش تست و بازبینی

حداقل محتوا
نسخه، محدوده، نتیجه و موارد باز
هدف
اتصال نتیجه به نسخه تحویلی

فهرست وابستگی

حداقل محتوا
نسخه، منبع و مورد آسیب‌پذیر شناخته‌شده
هدف
امکان نگهداری و Patch آینده

راهنمای Secrets و دسترسی

حداقل محتوا
مالک حساب، Rotation و ابطال
هدف
کاهش وابستگی به مجری

برنامه رخداد

حداقل محتوا
مسئول، مسیر گزارش و اولویت اصلاح
هدف
واکنش سریع پس از انتشار

پرسش‌های متداول

چک‌لیست برنامه‌نویسی امن برای همه پروژه‌ها یکسان است؟

خیر. این فهرست یک Baseline است. کنترل نهایی باید بر اساس نوع داده، نقش‌ها، معماری، سطح مواجهه، مقررات و اثر کسب‌وکاری سوءاستفاده انتخاب شود.

OWASP Top 10 برای توسعه امن کافی است؟

OWASP Top 10 آگاهی خوبی از ریسک‌های رایج می‌دهد، اما برای تعریف الزام قابل آزمون کامل نیست. ASVS، Developer Guide و چارچوب‌هایی مانند NIST SSDF مبنای ساخت‌یافته‌تری برای فرایند و راستی‌آزمایی فراهم می‌کنند.

آیا SAST و اسکن وابستگی جای بازبینی امنیتی را می‌گیرند؟

خیر. ابزار خودکار بخشی از خطاها را پیدا می‌کند، اما منطق دسترسی، سناریوی سوءاستفاده، طراحی و تنظیمات محیط به تحلیل و آزمون متناسب با پروژه نیاز دارند.

از چه زمانی امنیت را وارد پروژه کنیم؟

از نیازسنجی و طراحی. اصلاح دیرهنگام مدل هویت، مرز اعتماد یا ساختار داده معمولاً پرهزینه‌تر از افزودن کنترل در زمان پیاده‌سازی است.

برای ادامه مسیر، صفحه خدمت مرتبط، نمونه‌کار و راهنماهای مکمل را ببینید.

منابع و مبنای تدوین

این راهنما با استفاده از مستندات فنی و منابع تخصصی زیر تدوین شده است. تصمیم نهایی هر پروژه باید با داده‌ها، قرارداد و شرایط واقعی همان سازمان تطبیق داده شود.

کنترل‌های امنیتی پروژه را به خروجی قابل آزمون تبدیل کنید

معماری، داده، نقش‌ها و وضعیت فعلی فرایند توسعه را توضیح دهید تا دامنه مناسب طراحی امن، بازبینی یا اصلاح مشخص شود.

درخواست بررسی توسعه امن