توی دنیای توسعه وب، ساختن یک اپلیکیشن جذاب مثل راه انداختن یک رستوران شلوغ و پرطرفداره. شما بهترین آشپز ها (View) رو استخدام کردید، مواد اولیه عالی (Model) دارید و دیزاین رستوران (Template) هم حرف نداره. مشتری ‌ها صف کشیدن و همه چیز عالی به نظر میاد.

اما صبر کنید! 

اگر در پشتی رستوران قفل نداشته باشه چی؟ اگر صندوق دار حواسش پرت بشه و یکی دخل رو بزنه چی؟ اگر یکی از مشتری‌ ها یواشکی توی غذای بقیه سم بریزه چی؟ اینجاست که بحث ترسناک «امنیت» وسط میاد.

خیلی از فریمورک‌ ها شما رو وسط این میدون جنگ تنها میذارن و میگن "خودت مراقب باش!". اما وقتی وارد دنیای جنگو (Django) میشی، قضیه فرق میکنه. جنگو مثل یک تیم حفاظتی حرفه ‌ای عمل میکنه که قبل از اینکه شما حتی به خطر فکر کنید، جلوی در مستقر شدن.

اینجا یک سوال مهم پیش میاد: آیا میتونیم چشم بسته به جنگو اعتماد کنیم؟ جنگو چطور از ما محافظت میکنه و وظیفه ما چیه؟

امنیت داخلی جنگو

امنیت داخلی جنگو: تیم حفاظتی مخفی شما

جنگو با شعار معروف "Batteries Included" (همه‌چیز تکمیل) میاد، و خوشبختانه یکی از قوی ‌ترین این باتری ‌ها، امنیته. یعنی وقتی پروژه رو استارت میزنی، خیلی از حفره‌ های امنیتی کلاسیک وب، به صورت پیش‌ فرض بسته شدن.

بیایید با  همون مثال رستوران ببینیم جنگو چطور جلوی ۳ تا از خطرناک ‌ترین حملات دنیای وب رو می‌گیره:

۱. مقابله با تزریق SQL (حمله به انبار مواد غذایی)

تهدید: تصور کنید یک مشتری ، به جای سفارش غذا، روی کاغذ بنویسه: «کل کلید های انبار رو بده به من». اگر گارسون بی ‌تجربه باشه، این کاغذ رو مستقیم میبره توی انبار و... بوم! تمام مواد اولیه دزدیده میشه. این یعنی حمله SQL Injection؛ جایی که هکر سعی میکنه با فرم‌ های سایت، دستورات دیتابیس اجرا کنه.

دفاع جنگو (ORM): جنگو یک گارسون بسیار باهوش و قانون ‌مند داره به اسم ORM. این گارسون هرگز سفارش مشتری (داده ‌های ورودی) رو مستقیم به انبار (دیتابیس) نمیبره.

روش کار: ORM تمام سفارش ‌ها رو اول "تمیز" و "بسته ‌بندی" میکنه (Parameterization). اون کاغذ مشتری بدجنس برای ORM فقط یک تکه متنه، نه یک دستور اجرایی. پس هیچ خطری انبار شما رو تهدید نمیکنه، مگر اینکه خودتون عمداً قوانین رو دور بزنید!

۲. مقابله با XSS (غذای مسموم)

تهدید: این بار یک مشتری خرابکار، یک دستور پخت سمی (کد جاوااسکریپت مخرب) رو لای نظرات سایت مینویسه. اگر آشپزخونه این نظر رو مستقیم چاپ کنه و به بقیه مشتری ‌ها نشون بده، مرورگر اون ‌ها این کد رو اجرا می‌کنه و اطلاعاتشون دزدیده میشه. این یعنی حمله XSS.

دفاع جنگو (Template Escaping): آشپز خونه جنگو (موتور Template) یک قانون سفت و سخت داره: "هر چیزی که از بیرون میاد، آلوده‌ ست مگر اینکه خلافش ثابت بشه".

روش کار: قبل از اینکه غذا توی بشقاب (HTML نهایی) سرو بشه، جنگو تمام مواد اولیه رو ضد عفونی میکنه. کاراکتر های خطرناک مثل < یا > به کد های بی خطر تبدیل میشن تا مرورگر ها اون‌ ها رو اجرا نکنن، بلکه فقط نمایش بدن.

۳. مقابله با CSRF (سفارش جعلی)

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

دفاع جنگو (CSRF Token): جنگو برای هر مشتری معتبر، یک مچ ‌بند مخصوص با کد مخفی (Token) صادر می‌کنه.

روش کار: هر زمان که کسی بخواد تغییر مهمی ایجاد کنه (مثلاً فرمی رو POST کنه)، گارد امنیتی جنگو (Middleware) میگه: «مچ‌ بندت کو؟». اگر کد مچ‌ بند با کد سیستم نخونه، درخواست بلافاصله رد میشه، حتی اگر اون شخص مدیر رستوران باشه!

چک لیست امنیتی در جنگو

وظیفه شما چیست؟ (چک‌لیست حیاتی)

تا اینجا فهمیدیم جنگو خیلی هوامون رو داره و تیم حفاظتی قوی‌ ای چیده. اما یه ضرب ‌المثل امنیتی هست که میگه: "امنیت یک محصول نیست، یک فرآینده".

جنگو ابزار رو میده، استفاده درستش با شماست. اگر شما در گاو صندوق رو باز بذارید، بهترین قفل دنیا هم کاری نمیتونه بکنه. وقتی میخواید رستوران رو افتتاح کنید (مرحله Deploy)، این تنظیمات در فایل settings.py حکم مرگ و زندگی رو دارن:

۱. DEBUG = False (آشپزخونه رو مخفی کن!)

وقتی DEBUG=True هست، اگر خطایی رخ بده، جنگو تمام جزئیات فنی، کد ها و متغیر ها رو توی یک صفحه زرد رنگ نشون میده. این برای زمان توسعه عالیه، اما توی رستوران واقعی مثل اینه که وقتی غذا سوخت، در آشپز خونه رو باز کنید و بذارید همه مشتری ‌ها  آشفتگی، دعوای آشپز ها و جای ادویه ‌ها رو ببینن!

قانون: روی سرور اصلی، همیشه DEBUG باید False باشه.

۲. SECRET_KEY (کلید اصلی گاو صندوق)

این یک رشته طولانی و محرمانه‌ ست که جنگو ازش برای امضای دیجیتال کوکی‌ ها و توکن‌ های امنیتی استفاده میکنه. اگر این کلید لو بره، هکر ها میتونن مچ‌ بند های جعلی بسازن و وارد سیستم بشن.

قانون: این کلید رو هیچ‌ وقت توی کد اصلی (توی ریپازیتوری گیت) نذارید. اون رو از متغیر های محیطی سرور بخونید.

۳. ALLOWED_HOSTS (فقط مشتری‌های دعوت شده)

اینجا لیست دامنه ‌هایی رو میدید که رستوران شما حق داره روی اون‌ها سرویس بده. اگر این رو خالی بذارید، ممکنه یک سایت دیگه خودش رو جای شما جا بزنه و درخواست ‌ها رو بدزده.

۴. HTTPS (کانال امن)

امروزه، باز کردن رستوران بدون HTTPS مثل سرو کردن غذا توی ظروف کثیفه! جنگو تنظیماتی داره که مطمئن میشه تمام مکالمات بین مشتری و رستوران رمزگذاری شده و امن باقی میمونه (مثل SECURE_SSL_REDIRECT).

جمع‌بندی: بازرس ویژه جنگو

شاید با خودتون بگید "چقدر چیز باید یادم بمونه". نگران نباشید. جنگو فکر اینجا رو هم کرده.

قبل از اینکه روبان افتتاحیه رو ببرید، جنگو یک بازرس اختصاصی داره که میاد و تمام تنظیمات امنیتی شما رو چک میکنه و اگر جایی سوتی داده باشید، بهتون اخطار میده. کافیه این دستور جادویی رو اجرا کنید:

python manage.py check --deploy

حرف آخر:

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