네트워크 기술의 지속적인 개발로 네트워크 보안 위험도 증가했습니다. 크로스 사이트 요청 위조 (CSRF) 공격은 현재 인터넷 응용 프로그램이 직면 한 주요 위협 중 하나가되었습니다. 이 기사는 일반적으로 사용되는 방어 방법뿐만 아니라 CSRF 공격의 기본 원칙을 소개하고 구현 방법을 추가로 설명하고 관련 코드 예제를 첨부합니다.
CSRF 공격은 사용자의 인증 된 세션을 사용하여 악의적 인 작업을 수행합니다. 공격자는 사용자가 악의적 인 링크를 클릭하거나 악의적 인 웹 사이트를 방문하여 피해자의 지식없이 가짜 요청을 보내도록 유도합니다. 사용자가 신뢰할 수있는 웹 사이트에서 로그인하여 성공적으로 인증되면 브라우저는 요청을 보낼 때 해당 신분증 자격 증명을 자동으로 전달하여 공격자가 사용자를 가장하여 요청을 보내고 악성 작업을 수행 할 수 있습니다.
상 동성 탐지는 CSRF 공격을 방어하는 일반적인 방법 중 하나입니다. 요청의 소스 및 대상 주소가 동일한 도메인 이름에 속하는지 여부를 비교하여 요청의 정당성을 판단합니다. 검증은 서버 측에서 수행되며 소스 도메인 이름과 대상 도메인 이름이 일치하지 않으면 요청이 거부됩니다.
@requestmapping ( "/송환") public string transfermoney (httpservletrequest 요청) { String origin = request.getheader ( "Referer"); 문자열 target = request.getServerName (); if (! Origin.equals (target)) { "불법 요청"을 반환합니다. } // 비즈니스 로직 처리 ... "성공적인 전송"을 반환합니다. }
CSRF 토큰 추가는 일반적으로 사용되는 방어 방법 중 하나입니다. 서버가 HTML 페이지를 반환하면 고유 한 토큰을 생성하여 양식에 포함 시키거나 쿠키로 클라이언트에게 보냅니다. 양식을 제출할 때 토큰을 서버쪽으로 보냅니다. 서버는 토큰이 일치하는지 확인하고 일치하지 않으면 요청이 거부됩니다.
@requestmapping ( "/송환") public string transfermoney (httpservletrequest request, @requestparam ( "csrftoken") String csrftoken) { httpsession session = request.getSession (); String storedToken = (string) session.getAttribute ( "csrftoken"); if (! csrftoken.equals (StoredToken)) { "유효하지 않은 토큰"을 반환합니다. } // 비즈니스 로직 처리 ... "성공적인 전송"을 반환합니다. }
비동기 요청은 AJAX와 같은 기술을 사용하여 페이지를 새로 고치지 않고 서버에 요청을 보내므로 CSRF 공격을 중지하기가 어렵습니다. 따라서 민감한 작업과 관련된 요청의 경우 동기 요청을 사용하여 서버와 함께보다 안정적인 세션을 설정할 수 있도록하는 것이 가장 좋습니다.
백엔드 서비스에서, 요청 헤더의 참조 필드를 얻음으로써 요청이 백그라운드 로직을 기반으로 합법적인지 여부가 결정됩니다. 요청 소스가 대상과 일치하지 않으면 요청이 거부됩니다.
@requestmapping ( "/송환") public string transfermoney (httpservletrequest 요청) { String origin = request.getheader ( "Referer"); 문자열 target = request.getServerName (); if (! Origin.equals (target)) { "불법 요청"을 반환합니다. } // 비즈니스 로직 처리 ... "성공적인 전송"을 반환합니다. }
HTML 페이지를 프론트 엔드로 보낼 때 고유 한 토큰이 양식에 생성되어 포함되거나 쿠키로 클라이언트에게 전송됩니다. 프론트 엔드가 요청을 제출하면 토큰을 서버로 보냅니다. 서버는 토큰이 일치하는지 확인하고 요청의 정당성을 판단합니다.
@requestmapping ( "/송환") public string transfermoney (httpservletrequest request, @requestparam ( "csrftoken") String csrftoken) { httpsession session = request.getSession (); String storedToken = (string) session.getAttribute ( "csrftoken"); if (! csrftoken.equals (StoredToken)) { "유효하지 않은 토큰"을 반환합니다. } // 비즈니스 로직 처리 ... "성공적인 전송"을 반환합니다. }
CSRF 공격은 일반적이고 유해한 공격 방식이지만 일부 효과적인 방어 전략은 응용 프로그램의 보안을 향상시킬 수 있습니다. 이 기사는 일반적으로 사용되는 두 가지 방어 방법, 상 동성 탐지 및 CSRF 토큰의 추가를 소개하고 구현 방법에 대한 예제 코드도 제공합니다. 응용 프로그램을 개발할 때는 특정 상황에 따라 적절한 방어 정책을 선택하고 사용자 데이터의 보안을 보장하기 위해 올바르게 구현해야합니다.