امن کردن پروژه‌ی در حال کار

یک ایراد امنیّتی چشم‌گیر در نحوه‌ی استقرار فعلی پروژه‌ی ما این است: تنظیم DEBUG=True در settings.py که هنگام بروز خطا پیام‌های اشکال‌زدایی را نمایش می‌دهد. صفحه‌های خطای جانگو هنگام توسعه پروژه اطّلاعاتی حیاتی برای اشکال‌زدایی در اختیار شما قرار می‌دهند؛ با این حال اگر آن‌ها را در سرور در حال کار فعّال بگذاریم به مهاجمان اطّلاعاتی بیش از اندازه می‌دهند.

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

اجازه دهید settings.py را تغییر دهیم تا هنگام اجرای پروژه روی هروکو به دنبال یک متغیّر محیطی بگردد:

1
2
3
4
5
6
7
8
9
--snip--
# Heroku settings.
import django_heroku
django_heroku.settings(locals())

if os.environ.get('DEBUG') == 'TRUE':
    DEBUG = True
elif os.environ.get('DEBUG') == 'FALSE':
    DEBUG = False

متد os.environ.get() مقدار مرتبط با یک متغیّر محیطی خاص را در هر محیطی که پروژه در آن اجرا می‌شود می‌خواند. اگر متغیّری که به دنبال آن هستیم مقدار داشته باشد، متد آن را برمی‌گرداند و اگر نه متد None برمی‌گرداند. استفاده از متغیّرهای محیطی برای ذخیره کردن مقدارهای بولی ممکن است گیج‌کننده باشد. در بسیاری از موارد متغیّرهای محیطی به صورت رشته ذخیره می‌شوند و شما باید مراقب این باشید. این قطعه‌کد را از یک نشست ترمینال پایتون در نظر بگیرید:

1
2
>>> bool('False')
True

مقدار بولی رشته‌ی 'False' برابر با True است زیرا هر رشته‌ی غیر تهی True ارزیابی می‌شود. بنابراین از رشته‌های 'TRUE' و 'FALSE' با حروف بزرگ استفاده می‌کنیم تا شفّاف بگوییم مقدارهای بولی True و False پایتون را ذخیره نمی‌کنیم. زمانی که جانگو متغیّری محیطی را با کلید 'DEBUG' در هروکو می‌خواند، اگر مقدار آن 'TRUE' باشد، مقدار DEBUG را True می‌گذارد و اگر 'FALSE' باشد مقدار متغیّر DEBUG را False می‌گذارد.

سپارش و انتقال تغییرات

حال باید تغییراتی را که در settings.py اعمال کرده‌ایم در مخزن گیت اعمال کنیم و آن‌ها را به هروکو بفرستیم. این نشست ترمینالی است که این فرآیند را نشان می‌دهد:

1
2
3
4
5
6
7
8
9
(ll_env)learning_log$ git commit -am "Set DEBUG based on environment variables."
[master 3427244] Set DEBUG based on environment variables.
1 file changed, 4 insertions(+)

(ll_env)learning_log$ git status
On branch master
nothing to commit, working tree clean

(ll_env)learning_log$

فرمان git commit را به همراه یک پیام سپارش ساده امّا گویا اجرا می‌کنیم (۱). به یاد بیاورید که پرچم -am باعث می‌شود گیت تمام فایل‌های تغییریافته را اعمال کند و پیامی برای پیگیری ضبط کند. گیت تشخیص می‌دهد که یک فایل تغییر کرده است و این تغییر را در مخزن اعمال می‌کند.

در ۲ وضعیّت نشان می‌دهد که ما در حال کار روی شاخه‌ی اصلی مخزن هستیم و اکنون تغییر جدیدی برای اعمال وجود ندارد. مهم است که پیش از ارسال تغییرات به هروکو وضعیّت را بررسی کنید. اگر این پیام را نبینید برخی از تغییرات هنوز اعمال نشده‌اند و آن تغییرات به سرور ارسال نخواهند شد. در این صورت می‌توانید دستور commit را دوباره صادر کنید و اگر مطمئن نیستید که چگونه این مشکل را حل کنید پیوست ت را ببینید تا کار کردن با گیت را بهتر درک کنید.

حال مخزن به‌روزشده را به هروکو ارسال می‌کنیم:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
(ll_env)learning_log$ git push heroku master
remote: Building source:
remote:
remote: -----> Python app detected
remote: -----> Installing requirements with pip
--snip--
remote: -----> Launching...
remote: Released v6
remote: https://learning-log.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/learning-log.git
144f020..d5075a1 master -> master

(ll_env)learning_log$

هروکو تشخیص می‌دهد که مخزن به‌روزشده است و این باعث می‌شود که پروژه بازسازی شود تا مطمئن شود تمام تغییرات در نظر گرفته شده‌اند. این کار باعث بازسازی پایگاه داده نمی‌شود بنابراین نیازی نیست migrate را برای این به‌روزرسانی اجرا کنیم.

تنظیم متغیّرهای محیطی در هروکو

حال می‌توانیم مقدار مورد نظر خود برای DEBUG در settings.py را از طریق هروکو تنظیم کنیم. دستور heroku config:set یک متغیّر محیطی را برای ما تنظیم می‌کند:

1
2
3
4
5
(ll_env)learning_log$ heroku config:set DEBUG='FALSE'
Setting DEBUG and restarting learning-log... done, v7
DEBUG: FALSE

(ll_env)learning_log$

زمانی که در هروکو یک متغیّر محیطی را تنظیم می‌کنید، پروژه را به طور خودکار دوباره اجرا می‌کند تا متغیّر محیطی عمل کند.

برای این که ببینید استقرار پروژه اکنون امن‌تر شده است آدرس پروژه را با مسیری که تعریف نکرده‌ایم وارد کنید. برای مثال سعی کنید http://learning-log.herokuapp.com/letmein را باز کنید. باید یک صفحه‌ی خطای نوعی را ببینید که به شما هیچ اطّلاعات خاصّی درباره‌ی پروژه نمی‌دهد. اگر همین درخواست را روی نسخه‌ی محلّی پروژه به آدرس http://localhost:8000/letmein/ بدهید صفحه‌ی خطای کامل جانگو را خواهید دید. نتیجه عالی است: شما هنگام توسعه‌ی پروژه روی سیستم خود پیام‌های خطای پرمعنا می‌بینید امّا کاربران روی سایت در حال کار هیچ اطّلاعات حیاتی‌ای درباره‌ی برنامه‌ی پروژه نخواهند دید.

اگر قصد شما تنها استقرار برنامه و اشکال‌زدایی اوّلیّه‌ی آن است می‌توانید heroku config:set DEBUG='TRUE' را اجرا کنید و به طور موقّت یک گزارش خطای کامل ببینید. مطمئن شوید که پس از پایان اشکال‌زدایی این مقدار را به 'FALSE' برمی‌گردانید. همچنین مراقب باشید هنگامی که کاربران به طور معمول به سایت شما دسترسی دارند این کار را انجام ندهید.