[시큐어코딩 가이드] 2-2-2. 부적절한 인가

부적절한 인가

정의

프로그램이 모든 가능한 실행 경로에 대해서 접근 제어를 검사하지 않거나 불완전하게 검사하는 경우, 공격자는 접근 가능한 실행경로를 통해 정보를 유출

 

안전한 코딩기법

응용 프로그램이 제공하는 정보와 기능이 가지는 역할에 맞게 분리 개발함으로써 공격자에게 노출되는 공격 노출면을 최소화하고 사용자의 권한에 따른 ACL(Access Control List)을 관리

*공격노출면(Attack Surface) : 공격자가 진입 또는 영향을 줄 수 있는 시스템 경계선 지점, 시스템 요소 또는 환경을 의미

 

코드예제

다음은 안전하지 않은 코드예제로, 사용자 입력값에 따라 삭제작업을 수행하고 사용자 권한 확인을 위한 별도의 통제가 적용되지 않은 코드입니다.

#부적절한 인가(안전X)
def delete_content_bad(request):
    action = request.POST.get('action', )
    id = request.POST.get('id', )
    
    if action is not None and action == 'delete':
        Content.objects.filter(id=id).delete()
        return render(request, 'success.html')
    else:
        return render(request, 'error.html')

 

다음은 세션에 저장된 사용자 정보를 통해 해당 사용자가 작업에 대한 권한이 있는지 확인 후, 작업을 수행하도록 하는 안전한 코드 예제입니다.

#부적절한 인가(안전O)
@login_required
@permission_required('content.delete', raise_exception=True)
def delete_content_good(request):
    action = request.POST.get('action', )
    id = request.POST.get('id', )

    if action is not None and action == 'delete':
        Content.objects.filter(id=id).delete()
        return render(request, 'success.html')
    else:
        return render(request, 'error.html')

 

 

 

보안기능/부적절한 인가

[참고문헌] Python 시큐어코딩 가이드(2022) / KISA(한국인터넷진흥원)