متغیر محیطی چیست و چرا نباید کلیدها را در کد بنویسیم
آموزش

متغیر محیطی چیست و چرا نباید کلیدها را در کد بنویسیم

متغیرهای محیطی راهکاری استاندارد برای جداسازی رمزها و پیکربندی پروژه از سورس‌کد هستند تا مخزن برنامه بدون افشای داده‌های حساس مدیریت شود.

تحریریه‌ی دینا کد
نویسنده
۵ دقیقه مطالعه۰ بازدید
اشتراک گذاری۰
فهرست مطالب
  1. ۱قانون تفکیک تنظیمات بر اساس متدولوژی دوازده عاملی
  2. ۲نمونه خواندن متغیر محیطی در برنامه
  3. ۳اشتباه‌های رایج در استفاده از فایل‌های کانفیگ
  4. ۴قدم بعدی برای امن‌سازی پروژه‌ها

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

راهکار حل این گره، استفاده از متغیر محیطی (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 حاوی نام متغیرها و بدون مقادیر واقعی درون مخزن فرستاده شود.

اشتباه رایج دیگر، گروه‌بندی پیچیده تنظیمات بر اساس نام محیط‌ها است؛ مثل ساختن تنظیمات تودرتو برای تست، استیجینگ و پروداکشن درون کد. بر اساس اصول دوازده عاملی، هر متغیر محیطی باید مستقل از بقیه رفتار کند تا در صورت اضافه شدن سرورهای جدید، نیازی به بازنویسی ساختار پیکربندی برنامه نباشد.

قدم بعدی برای امن‌سازی پروژه‌ها

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

تحریریه‌ی دینا کد
نویسنده

نظرها

اولین نفری باشید که نظر می‌دهد
برای ثبت نظر وارد شوید

سؤالتان را بپرسید یا تجربه‌تان را بنویسید تا نویسنده‌ی مطلب پاسخ بدهد.

مطالب مرتبط

از همین دسته
مدیریت خطا با try و except در پایتون
آموزش

مدیریت خطا با try و except در پایتون

راهنمای گام‌به‌گام مهار خطاهای زمان اجرا در پایتون با بلوک‌های try و except همراه با بررسی خطاهای رایج و ساختار اصولی.

تحریریه‌ی دینا کد۵ دقیقه
مدیریت خطا در Rust با Result و Option
آموزش

مدیریت خطا در Rust با Result و Option

زبان Rust به جای ساختارهای سنتی استثنا از نوع‌های Result و Option برای مدیریت شفاف و پیش‌بینی‌پذیر خطاها در زمان کامپایل استفاده می‌کند.

تحریریه‌ی دینا کد۶ دقیقه
تفاوت واحدهای px و em و rem در CSS و کاربرد هرکدام
آموزش

تفاوت واحدهای px و em و rem در CSS و کاربرد هرکدام

واحدهای px، em و rem هرکدام برای بخش مشخصی از صفحه‌آرایی وب طراحی شده‌اند و انتخاب نادرست آن‌ها مقیاس‌پذیری و دسترسی‌پذیری سایت را مختل می‌کند.

تحریریه‌ی دینا کد۶ دقیقه
متغیر محیطی چیست و چرا کلید را در کد نمی‌گذاریم — دینا کد