[시큐어코딩 가이드] 2-1-12. 서버사이드 요청 위조

서버사이드 요청 위조

정의

적절한 검증 절차를 거치지 않은 사용자 입력값을 내부 서버간의 요청에 사용해 악의적인 행위가 발생할 수 있는 보안약점

 

안전한 코딩기법

  • 식별 가능한 범위 내에서 사용자의 입력값을 다른 시스템의 서비스 호출에 사용하는 경우, 사용자의 입력값을 화이트리스트 방식으로 필터링한다.
  • 부득이하게 사용자가 지정하는 무작위의 URL을 받아들여야 하는 경우라면 내부 URL을 블랙리스트로 지정하여 필터링한다.

 

코드예제

아래 코드는 안전하지 않은 코드로, 사용자로부터 입력된 URL 주소를 검증 없이 사용하면 의도하지 않은 다른 서버의 자원에 접근할 수 있습니다.

#서버사이드 요청 위조(안전X)
def call_third_party_api_bad(request):
    addr = request.GET.get('address',)
    result = requests.get(addr).text
    return render(request, 'success.html', {'data': result})

 

address=https://www.tistory.com

 

다음 코드는 안전한 코드예제로 사전에 정의된 화이트리스트에 있는 URL만 사용할 수 있습니다.

#서버사이드 요청 위조(안전O)
ALLOW_SERVER_LIST = ['https://www.naver.com']
def call_third_party_api_good(request):
    addr = request.GET.get('address',)
    if addr not in ALLOW_SERVER_LIST:
        return render(request, 'error.html', {'msg': '허용되지 않은 서버입니다.'})
    result = requests.get(addr).text
    return render(request, 'success.html', {'data': result})

 

address=https://www.tistory.com

 

address=https://www.naver.com

 

 

 

입력데이터 검증 및 표현/서버사이드 요청 위조

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