[시큐어코딩 가이드] 적절한 인증 없는 중요 기능 허용
- 정보보안/시큐어코딩 가이드
- 2022. 8. 10.
■ 보안기능
보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현 시 발생할 수 있는 보안약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.
적절한 인증 없는 중요 기능 허용(시큐어코딩)
■ 개요
보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현 시 발생할 수 있는 보안약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.
파이썬의 Django 프레임워크에서 django.contrib.auth 앱을 통하여 기본적인 인증 로그인 및 로그아웃 기능을 제공하고 있으며 DRF(Django REST Framework)에서는 토큰 및 세션 인증을 제공하고 있다.
■ 안전한 코딩 기법
클라이언트의 보안검사를 우회하여 서버에 접근하지 못하도록 설계하고 중요한 정보가 있는 페이지는 재 인증을 적용한다.
또한 안전하다고 검증된 라이브러리나 프레임워크 (Django authentication system, Flask-Login 등)를 사용하는 것이 안전하다.
코드예제
패스워드 수정 시 수정을 요청한 패스워드와 DB에 저장된 사용자 패스워드 일치 여부를 확인하지 않고 처리하고 있으며 패스워드의 재확인 절차도 생략되어 있다.
안전하지 않은 코드의 예 |
from django.shortcuts import render from re import escape import hashlib def change_password(request): new_pwd = request.POST.get('new_password','') #로그인한 사용자정보 user = '%s' % escape(request.session['userid']) #현재 password와 일치여부를 확인하지 않고 수정함 sha = hashlib.sha256(new_pwd.encode()) update_password_from_db(user, sha.hexdigest()) return render(request, '/success.html') |
DB에 저장된 사용자 패스워드와 변경 요청한 패스워드의 일치 여부를 확인하거나 변경 요청한 패스워드와 재확인 패스워드가 일치하는지 확인 후 DB의 패스워드를 수정하도록 하여 안전하게 적용할 수 있다.
안전한 코드의 예 |
from django.shortcuts import render from re import escape import hashlib # login_required decorator를 사용하여 login된 사용자만 접근하도록 처리 @login_required def change_password(request): new_pwd = request.POST.get('new_password','') crnt_pwd = request.POST.get('current_password','') # 세션에서 로그인한 사용자정보를 가져온다. user = '%s' % escape(request.session['userid']) crnt_h = hashlib.sha256(crnt_pwd.encode()) h_pwd = crnt_h.hexdigest() # DB에서 기존 사용자의 Hash된 패스워드 가져오기 old_pwd = get_password_from_db(user) # 패스워드를 변경하기 전 사용자에 대해 재인증한다. if old_pwd == h_pwd: new_h = hashlib.sha256(new_pwd.encode()) update_password_from_db(user, new_h.hexdigest()) returnrender(request, '/success.html') |