Cross Site Request Forgery Protection in Django

#Code4Sec Week #Day6 #NEIS0736 #NECS0736

Django Web Framework

Django เป็นการพัฒนาเว็บแอพพลิเคชั่นโดยใช้ภาษา Python ซึ่งกำลังได้รับความนิยมกันเป็นอย่างมากในปัจจุบัน สามารถเข้าใจและพัฒนาเว็บแอพพลิเคชั่นได้อย่างรวดเร็ว เนื่องจากภาษา Python เป็นภาษาที่ไม่ซับซ้อน มีโครงการการพัฒนา Web Framework ในรูปแบบ Model Template View (MTV)

CSRF คืออะไร ?

CSRF ย่อมาจาก Cross Site Request Forgery (CSRF) เป็นเทคนิคการโจมตีที่ผู้ไม่หวังดีนิยมใช้มากขึ้นเรื่อยๆ ซึ่งเป็นการโจมตีที่ใช้ประโยชน์จากความเชื่อของเว็บไซต์ที่มีต่อข้อมูล Input และ Web browser จากผู้ใช้งาน คือ เหยื่อจะถูกหลอกให้กระทำการบางอย่างบนเว็บไซต์ปกติทั่วไป ที่ก่อให้เกิดประโยชน์ต่อ Hacker หรือผู้ไม่หวังดีในนามของตัวเหยื่อเอง โดยที่ตัวเหยื่อไม่ต้องการกระทำหรือกระทำไปโดยไม่รู้ตัว

การโจมตีแบบ CSRF จะใช้ “ตัวตน (Identity)” และ “สิทธิ์ (Privilege)” ของเหยื่อที่มีบนเว็บไซต์ ในการปลอมตัวเป็นเหยื่อและกระทำการหรือธุรกรรมไม่พึงประสงค์ Hacker จะพยายามใช้ประโยชน์จากเหยื่อที่มี Login Cookies เก็บไว้ใน Web browser ส่งผลให้เว็บไซต์ที่ส่ง Cookie ไปเก็บข้อมูลการพิสูจน์ตัวตนของผู้ใช้มักตกเป็นเป้าหมายของการโจมตีนี้

ลักษณะโจมตีแบบนี้ตรวจจับได้ค่อนข้างยากเนื่องจากเป็นการกระทำธุรกรรมปกติในนามของเหยื่อเอง ทั้งข้อมูลการพิสูจน์ตัวตนและ IP Address ต่างถูกนำมาใช้เพื่อยืนยันว่าเป็นการทำธุรกรรมของเหยื่อจริง

สำหรับ Django application จะเกิดความไม่ปลอดภัยเมื่อ

# setting.py
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'code4sec.urls'
# view.py
@csrf_exempt
class HomePageView(TemplateView):
    def get(self, request, **kwargs):
        return render(request, 'index.html', context=None)

How to use it

สำหรับ Django application

# setting.py
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',    # << Code4Sec
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'code4sec.urls'

# view.py
class HomePageView(TemplateView):
    def get(self, request, **kwargs):
        return render(request, 'index.html', context=None)
# view.py
class HomePageView(TemplateView):
    def get(self, request, **kwargs):
        return render(request, 'index.html', context=None)

How it work ?

Reference:

Author:

Ekawut Chairat