הגן על האתר שלך מפני חור אבטחה נפוץ מאוד עם טיפול ה-CSRF המובנה של Django.
Django היא מסגרת אינטרנט של Python שבה אתה יכול להשתמש כדי לבנות יישומי אינטרנט מאובטחים. הוא מציע תכונות רבות כדי לעזור למפתחים באבטחה. אחת התכונות הללו היא אסימוני CSRF, חיוניים בהגנה על טפסים מפני התקפות של זיוף בקשות חוצות אתרים.
מהו אסימון CSRF?
אסימון CSRF הוא תכונת אבטחה שמגינה מפני יישומי אינטרנט התקפות של זיוף בקשות חוצות אתרים (CSRF).. זה מאפשר לשרת היישומים לבדוק אם הגשת טופס הגיע מדפדפן אותנטי או שהאקר זייף אותו.
אסימוני CSRF הם קלט טפסים שעוקבים אחר הפעלת משתמש. של אתר אינטרנט מסגרת יישום אינטרנט בצד השרת בדרך כלל יוצר אסימוני CSRF עבור כל הפעלה ייחודית של משתמש. השרת בודק אם האסימון נכון בכל פעם שמשתמש שולח טופס. אסימוני CSRF מורכבים בדרך כלל ממחרוזות ומספרים אקראיים, מה שהופך את הערכים שלהם לבלתי צפויים.
יצירת אסימוני CSRF בג'נגו
של ג'נגו get_token() הפונקציה מייצרת באופן אקראי אסימוני CSRF. כדי למצוא פונקציה זו, נווט אל csrf.py קובץ בתוך שלך סביבה וירטואלית של Python. מבנה התיקיות אמור להיראות כך:
env/
└── ליב/
└── חבילות אתר/
└── ג'נגו/
└── תוכנת ביניים/
└── csrf.py
בתוך קובץ זה, תמצא את ה get_token() פונקציה, אשר מחזירה את האסימון. ג'נגו משתמש מיסוך נתונים כדי להגן על ערכו של האסימון מפני האקרים.
כברירת מחדל, Django מאפשר הגנת CSRF עבור האתר שלך על ידי הוספה django.middleware.csrf. CsrfViewMiddleware בתוך ה כלי בינוני רשימה שלך settings.py קוֹבֶץ. כל מה שאתה צריך לעשות זה להוסיף {% csrf_token %} לשלך הודעה טפסים. בלי להוסיף {% csrf_token %}, תקבל א איסור 403) שגיאה בעת שליחת טופס.
כשאתה מוסיף {% csrf_token %} לטופס שלך, הוא יוצר אוטומטית שדה קלט נסתר עם השם csrfmiddlewaretoken, המכיל את הערך של אסימון ה-CSRF המסוכה. השרת משתמש בערך זה כדי לקבוע אם שליחת הטופס היא אותנטית. אתה יכול לבדוק את הערך של שדה מוסתר זה על ידי צפייה במקור הדף או שימוש בתכונת כלי המפתחים של הדפדפן שלך.
איך אסימוני CSRF עובדים ב-Django
כאשר אתה מפעיל את האתר שלך עם הטופס, Django יוצר אוטומטית א קובץ Cookie של הדפדפן שקוראים לו csrftoken. קובץ Cookie זה עוקב אחר פעילות המשתמש באתר ומזהה כל משתמש באופן ייחודי.
כאשר המשתמש שולח את הטופס, השרת משווה את ערך ה-cookie לערך ה- csrfmiddlewaretoken בשדה הקלט הנסתר. אם ערכים אלו תואמים, השרת יעבד את הטופס בהצלחה, אחרת הוא ייצור שגיאה.
במבט ראשון, הערכים של העוגייה וה- csrfmiddlewaretoken נראה שונה. זה מכוון ומוסיף שכבת הגנה נוספת לאסימון CSRF. אסימון ה-CSRF מושווה לעוגייה כך:
- ה get_token() הפונקציה מסווה את אסימון CSRF לפני העברתו לשדה הקלט.
- כאשר הטופס נשלח, אסימון ה-CSRF נחשף בעזרת המפתח הסודי בקובץ ההגדרות.
- האסימון החפוי נשווה לעוגיית ההפעלה.
- אם הערכים זהים, הטופס יעובד. אם לא, השרת מחזיר שגיאה.
כדי למנוע מהאקרים לגנוב את אסימון ה-CSRF שלך, Django מחדשת אותו בכל פעם שהוא מתחיל סשן משתמש.
יצירת אסימוני CSRF מותאמים אישית
למרות ש-Django מקל על ההגנה על הטפסים שלך פשוט על ידי הוספת {% csrf_token %}, אפשר גם ליצור אסימוני CSRF ולהוסיף אותם ידנית לטפסים שלך. כדי לעשות זאת, ייבא את ה get_token() פוּנקצִיָה:
מ django.middleware.csrf יְבוּא get_token
לדעתך, אתה יכול ליצור את אסימון ה-CSRF כך:
defview_name(בַּקָשָׁה):
csrf_token = get_token (בקשה)# בצע היגיון תצוגה
הקשר = {
"csrf_token": csrf_token
}
לַחֲזוֹר render (בקשה, 'app_name/template.html', הקשר=הקשר)
בתבנית ה-HTML שלך, אתה יכול לכלול ידנית את תג הקלט שלך ולהוסיף את csrf_token לזה ככה:
<טופסשיטה="הודעה" >
<קֶלֶטסוּג="מוּסתָר"שֵׁם="csrfmiddlewaretoken"ערך="{{ csrf_token }}">
{{form.as_p}}
<לַחְצָןסוּג="שלח"מעמד="btn btn-outline-secondary">הוסף ספרלַחְצָן>
טופס>
לחלופין, אתה יכול ליצור את שדה הקלט הנסתר מהתצוגות שלך כך:
defyour_view(בַּקָשָׁה):
csrf_token = get_token (בקשה)
csrf_token_html = ''.format (csrf_token)# בצע היגיון תצוגה
הקשר = {
"csrf_token": csrf_token_html
}
לַחֲזוֹר render (בקשה, 'app_name/template.html', הקשר=הקשר)
לאחר מכן תוכל להוסיף אותו לתבנית ה-HTML שלך כך:
<טופסשיטה="הודעה" >
{{ csrf_token_html|בטוח }}
{{form.as_p}}
<לַחְצָןסוּג="שלח"מעמד="btn btn-outline-secondary">הוסף ספרלַחְצָן>
טופס>
אם אתה רוצה לשלוט לחלוטין על הגנת ה-CSRF של הטופס שלך, אתה יכול לעשות זאת על ידי השוואת אסימון ה-CSRF שלך לעוגייה המאוחסנת בדפדפן. בהתבסס על תוצאות ההשוואה, תוכל לטפל בהגשת הטופס איך שתרצה. הנה דוגמה:
מ django.shortcuts יְבוּא לְדַקלֵם
מ django.middleware.csrf יְבוּא get_token, _unmask_cipher_token
מ django.utils.crypto יְבוּא קבוע_זמן_השוואהdefyour_view(בַּקָשָׁה):
# צור אסימון CSRF מותאם אישית
csrf_token = get_token (בקשה)
csrf_cookie = בקשה. COOKIES.get('csrftoken')# ביטול המסכה של אסימון csrf
unmasked_csrf_token = _unmask_cipher_token (csrf_token)
# השוו את האסימונים
אםלֹא constant_time_compare (unmasked_csrf_token, csrf_cookie):
# טפל במקרה שבו האסימונים אינם תואמים
לַעֲבוֹר
אַחֵר:
# טפל במקרה שבו האסימונים תואמים
לַעֲבוֹר
# עבד את התבנית
הקשר = {
'csrf_token': csrf_token,
}
לַחֲזוֹר render (בקשה, 'app_name/template.html', הקשר=הקשר)
קטע קוד זה מאחזר את csrf_cookie מאובייקט בקשת ה-HTTP. לאחר מכן הוא משתמש ב- _unmask_cipher_token() פונקציה לחשוף את ה- csrf_token.
הצהרה מותנית משווה את הערכים של המאוחזר csrf_cookie וחסרי המסכה csrf_token. השוואה זו משתמשת ב- קבוע_זמן_השוואה פונקציה להגנה מפני ניצול תזמון. אתה יכול לכתוב את ההיגיון שלך על סמך תוצאת ההשוואה.
השבתת הגנת CSRF ב-Django
למרות ש-Django מספק ברירת מחדל להגנת CSRF, אתה יכול להשבית אותה בפרויקט שלך אם תרצה. ישנן שתי דרכים לעשות זאת:
- השבתת הגנת CSRF בכל האתר שלך.
- השבתת הגנת CSRF בתצוגה מסוימת.
השבתת הגנת CSRF בכל האתר שלך
כדי להשבית את הגנת ה-CSRF של Django באתר האינטרנט שלך, אתה פשוט צריך להסיר את תוכנת האמצע של CSRF מקובץ ההגדרות שלך. בקובץ ההגדרות שלך, אתר רשימה בשם כלי בינוני. בתוך הרשימה, חפש את זה:
'django.middleware.csrf. CsrfViewMiddleware',
ברגע שתמצא אותו, עליך להסיר אותו מהקוד שלך כדי שהגנת CSRF ברירת המחדל של Django תשבית אותו.
השבתת הגנת CSRF בתצוגה ספציפית
אם אתה רוצה להשבית את הגנת CSRF רק בתצוגת Django ספציפית, השתמש ב- @csrf_exempt מְעַצֵב. להלן קטע קוד להדגמה:
מ django.views.decorators.csrf יְבוּא csrf_exempt
@csrf_exempt
defview_name(בַּקָשָׁה):
# בצע היגיון תצוגה
לַעֲבוֹר
ה @csrf_exempt decorator הוא רק אחד מתוך כמה הקשורים להגנת CSRF ב-Django. אתה יכול לקרוא על השאר ב הפניה ל-CSRF של ג'נגו.
אל תבטל את הגנת CSRF באתר האינטרנט שלך
למרות ש-Django מאפשר זאת, לא מומלץ להשבית את מנגנון הגנת ה-CSRF המובנה של Django. פעולה זו תהפוך את האתר שלך לפגיע להתקפות CSRF ובסופו של דבר ישפיע לרעה על המשתמשים באפליקציה שלך.
אלא אם כן אתה מפתח מנוסה שיודע ליישם מנגנון הגנה מותאם אישית של CSRF, עליך לעבוד עם האלטרנטיבה שמספקת Django.