[시큐어코딩 가이드] 적절한 인증 없는 중요 기능 허용

 

 

 

■ 보안기능

 

보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현 시 발생할 수 있는 보안약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.

 

 

적절한 인증 없는 중요 기능 허용(시큐어코딩)

 

■ 개요

 

보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현 시 발생할 수 있는 보안약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.


파이썬의 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')

 

 

댓글

Designed by JB FACTORY