>백엔드 개발 >PHP 문제 >PHP에서 csrf 공격을 방지하는 방법

PHP에서 csrf 공격을 방지하는 방법

(*-*)浩
(*-*)浩원래의
2019-09-20 13:51:135878검색

CSRF 개념: CSRF 교차 사이트 요청 위조(Cross-Site Request Forgery), XSS 공격과 마찬가지로 엄청난 피해를 끼치므로 다음과 같이 이해하면 됩니다.

# 🎜 🎜#

PHP에서 csrf 공격을 방지하는 방법

공격자는 귀하의 신원을 도용하고 귀하의 이름으로 악의적인 요청을 서버에 보냅니다. 이 요청은 완전히 합법적이지만 공격자가 예상한 대로 수행됩니다. 귀하의 이름으로 이메일 및 메시지를 보내거나, 귀하의 계정을 도용하거나, 시스템 관리자를 추가하거나, 심지어 상품 구매, 가상 화폐 이체 등을 하는 행위 등이 있습니다. (추천 학습:

입력부터 마스터까지 PHP 프로그래밍)

예: Web A는 CSRF 취약점이 있는 웹사이트이고, Web B는 공격자가 구축한 악성 웹사이트이며, 사용자 C는 Web A 웹사이트의 합법적인 사용자입니다.

CSRF 공격에 대한 방어:

현재 CSRF 공격을 방어하기 위한 세 가지 주요 전략이 있습니다. HTTP Referer 필드를 확인하세요. ; 요청 주소에 토큰을 추가하고 HTTP 헤더에서 속성을 사용자 정의하고 확인합니다.

(1) HTTP Referer 필드 확인


HTTP 프로토콜에 따르면 HTTP 헤더에 Referer라는 필드가 있습니다. HTTP 요청의 소스 주소를 기록합니다. 일반적인 상황에서는 보안이 제한된 페이지에 대한 액세스 요청이 동일한 웹사이트에서 이루어집니다. 예를 들어 http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory에 액세스하려면 사용자가 먼저 로그인해야 합니다. bank.example로 이동한 후 페이지의 버튼을 클릭하면 이체 이벤트가 실행됩니다.

이때 전송 요청의 Referer 값은 전송 버튼이 위치한 페이지의 URL이 되며, 일반적으로bank.example 도메인 이름으로 시작하는 주소입니다. 해커가 은행 웹사이트에 CSRF 공격을 구현하려는 경우 자신의 웹사이트에서만 요청을 구성할 수 있습니다. 사용자가 해커의 웹사이트를 통해 은행에 요청을 보내면 요청의 리퍼러는 해커의 웹사이트를 가리킵니다. .

따라서 CSRF 공격을 방어하기 위해 은행 웹사이트는 각 전송 요청에 대한 추천자 값만 확인하면 됩니다. 도메인 이름이bank.example로 시작하는 경우 요청이 다음에서 온 것입니다. 은행 웹사이트 자체는 합법적입니다. 추천자가 다른 웹사이트인 경우 해커에 의한 CSRF 공격일 수 있으며 요청이 거부됩니다.

(2) 요청 주소에 토큰을 추가하고

CSRF 공격이 성공할 수 있는지 확인합니다. 요청에 포함된 모든 사용자 인증 정보는 쿠키에 존재하므로, 해커가 인증 정보를 알지 못한 채 사용자가 보유한 쿠키를 직접 이용하여 보안 검증을 통과할 수 있습니다.

CSRF에 저항하려면 해커가 위조할 수 없는 정보를 요청에 넣는 것이 핵심이며, 이 정보는 쿠키에 존재하지 않습니다.

HTTP 요청에 무작위로 생성된 토큰을 매개변수로 추가하고, 요청에 토큰이 없거나 토큰 내용이 잘못된 경우 서버 측에 인터셉터를 설정하여 토큰을 확인할 수 있습니다. , CSRF 공격으로 인해 요청이 거부될 수 있는 것으로 간주됩니다.

(3) HTTP 헤더의 속성을 사용자 정의하고 확인합니다.

이 방법도 토큰을 사용하여 확인합니다. 이전 방법에서는 토큰이 매개변수 형식으로 HTTP 요청에 배치되지 않고 HTTP 헤더의 사용자 정의 속성에 배치됩니다. XMLHttpRequest 클래스를 통해 이 유형의 모든 요청에 ​​csrftoken HTTP 헤더 속성을 한 번에 추가하고 여기에 토큰 값을 넣을 수 있습니다. 이는 기존 방식의 요청에 토큰을 추가해야 하는 불편함을 해결함과 동시에, XMLHttpRequest를 통해 요청한 주소는 브라우저의 주소 표시줄에 기록되지 않으며, 토큰이 다른 사람에게 유출될 염려가 없습니다. 추천자를 통한 웹사이트.

위 내용은 PHP에서 csrf 공격을 방지하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.