فهرست مطالب
یک لحظه تصور کنید سورسکد پروژهای که ماهها رویش کار کردهاید به دلایلی عمومیشود یا نیاز باشد همتیمی تازهای به مخزن گیت پروژه ملحق شود. اگر اطلاعات اتصال به پایگاه داده، کلیدهای دسترسی به سرویس پیامک و توکنهای پرداخت را مستقیم داخل فایلهای برنامه نوشته باشید، هر کس به کد دسترسی پیدا کند کنترل کامل زیرساخت شما را به دست میگیرد. تغییر آدرس سرور آزمایشی به سرور نهایی هم در چنین کدی به معنای جستوجو در لابهلای صدها خط و دستکاری دستی سورسکد است.
راهکار حل این گره، استفاده از متغیر محیطی (Environment Variable) است؛ مفهومی بنیادین در توسعه نرمافزار که مرز میان کد اجرایی و تنظیمات استقرار را مشخص میکند.
قانون تفکیک تنظیمات بر اساس متدولوژی دوازده عاملی
در اصل سوم متدولوژی معروف دوازده عاملی (Twelve-Factor App) قاعدهای شفاف مطرح میشود: تنظیمات را در محیط ذخیره کنید. تعریف تنظیمات در این استاندارد شامل هر دادهای است که بین استقرارهای گوناگون تغییر میکند؛ مانند:
- آدرس و نام کاربری اتصال به پایگاه داده یا سرویسهای کش
- کلیدها و توکنهای ارتباط با وبسرویسهای بیرونی
- نام دامنه یا پورت اختصاصی هر محیط استقرار
سورسکد نرمافزار در محیط توسعه محلی، سرور تست و سرور اصلی یکسان باقی میماند، اما مقادیر بالا در هر محیط دگرگون میشوند. آزمون طلایی این اصل ساده است: آیا میتوانید همین لحظه کل کد پروژه خود را بدون حذف حتی یک خط، در یک مخزن متنباز منتشر کنید بدون اینکه هیچ رمزی فاش شود؟ اگر پاسختان منفی است، تنظیمات را درست از کد جدا نکردهاید.
متغیرهای محیطی خارج از فایلهای برنامه و در سطح سیستمعامل یا کانتینر تعریف میشوند. به همین دلیل مستقل از زبان برنامهنویسی و سیستمعامل عمل میکنند و هیچ ارتباطی به منطق داخلی اپلیکیشن ندارند.
نمونه خواندن متغیر محیطی در برنامه
برای درک نحوه استفاده، قطعهکد زیر به زبان پایتون را بررسی کنید. در روش اول اطلاعات اتصال مستقیماً ثبت شدهاند که کاری نادرست است. در روش دوم مقدار از متغیرهای محیطی خوانده میشود.
pythonimport os
# روش اشتباه: نوشتن مستقیم کلید و رمز در متن برنامه
# api_key = "sk-live-9876543210abcdef"
# روش درست: خواندن از متغیر محیطی با مقدار پیشفرض امن
api_key = os.environ.get("PAYMENT_API_KEY")
db_host = os.environ.get("DATABASE_HOST", "localhost")
if not api_key:
raise SystemExit("خطا: متغیر PAYMENT_API_KEY در محیط تنظیم نشده است")
print(f"اتصال به سرور داده: {db_host}")
print(f"طول کلید دریافت شده: {len(api_key)} کاراکتر")
اگر پیش از اجرای این اسکریپت در خط فرمان مقدار متغیر را ثبت کنید، خروجی بهدرستی اجرا میشود:
bashexport PAYMENT_API_KEY="test-token-12345"
python app.py
خروجی در ترمینال:
textاتصال به سرور داده: localhost
طول کلید دریافت شده: ۱۶ کاراکتر
در این حالت اگر کدهای خود را با گیت ذخیره کنید و به اشتراک بگذارید، هیچ داده حساسی در تاریخچه مخزن ثبت نمیشود.
اشتباههای رایج در استفاده از فایلهای کانفیگ
بسیاری از برنامهنویسان برای دور زدن هاردکد کردن، متغیرها را درون فایلی به نام .env قرار میدهند. تا این بخش کار ایرادی ندارد، اما اشتباه بزرگ زمانی رخ میدهد که این فایل به مخزن گیت اضافه میشود (Commit). فایل .env باید همیشه داخل .gitignore قرار گیرد و تنها یک فایل نمونه با نام .env.example حاوی نام متغیرها و بدون مقادیر واقعی درون مخزن فرستاده شود.
اشتباه رایج دیگر، گروهبندی پیچیده تنظیمات بر اساس نام محیطها است؛ مثل ساختن تنظیمات تودرتو برای تست، استیجینگ و پروداکشن درون کد. بر اساس اصول دوازده عاملی، هر متغیر محیطی باید مستقل از بقیه رفتار کند تا در صورت اضافه شدن سرورهای جدید، نیازی به بازنویسی ساختار پیکربندی برنامه نباشد.
قدم بعدی برای امنسازی پروژهها
برای قدم بعدی، پوشه پروژههای فعلی خود را بازبینی کنید. فایلهای اتصال به پایگاه داده و توکنهای وبسرویسها را پیدا کرده و با متغیرهای محیطی جایگزین کنید. همچنین اگر تا امروز فایلهای حاوی رمز را ناخواسته به گیت فرستادهاید، صرفاً پاک کردن آن در کامیت جدید کافی نیست؛ چون سابقه آن در تاریخچه گیت باقی میماند. برای تسلط بر مدیریت فایلهای نادیدهگرفتهشده و کار اصولی با برنچها، دوره گیت و گیتهاب تعاملی مسیر عملی و استانداردی برای محافظت از سورسکد در اختیارتان میگذارد.




نظرها
اولین نفری باشید که نظر میدهدسؤالتان را بپرسید یا تجربهتان را بنویسید تا نویسندهی مطلب پاسخ بدهد.