>  기사  >  웹 프론트엔드  >  CSRF란 무엇입니까? CSRF의 위험성과 이를 방어하는 방법

CSRF란 무엇입니까? CSRF의 위험성과 이를 방어하는 방법

不言
不言원래의
2018-09-19 15:25:5510608검색

이 글의 내용은 CSRF란 무엇일까요? CSRF의 위험과 방어 방법은 특정 참고 가치가 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

CSRF란 무엇인가

CSRF를 이해하기 전에 두 가지 전제 조건을 대중화해야 합니다. 우선, 현재 대부분의 웹사이트에서 로그인 권한을 확인하는 방법에는 여러 가지가 있습니다. 세션 세션 작업 모드. 간단히 말하면, 세션 메커니즘은 서버가 키-값 쌍을 사용하여 로그인 정보를 기록하는 동시에 세션이 쿠키에 저장된다는 것입니다. ID(방금 언급한 키)는 쿠키에 저장됩니다. 또한 브라우저의 HTTP(s) 요청이 자동으로 쿠키를 변경한다는 것도 알고 있습니다. 서버에 전달되었습니다. 이러한 방식으로 각 요청 시 쿠키를 통해 세션 ID를 얻은 다음 이를 통해 서버에서 로그인 정보를 얻어 사용자 권한 확인을 완료합니다.

원래 이 기능도 좋은 기능이었습니다. 하지만 이로 인해 쿠키는 실제로 열려있습니다. 사용자가 웹사이트 A에 로그인하고, 웹사이트 B를 방문할 때 A 쿠키를 보내면, 웹사이트 요청, 이 요청은 실제로 웹사이트 A에 대한 사용자의 로그인 정보를 전달합니다. 만약 A가 이때 B역에 있다면 웹사이트 요청이 사용자에게 알려지지 않은 경우 이는 매우 심각한 피해입니다. 위의 과정은 Cross-Site Request Forgery, 즉 Cross-Site Request Forgery 공격이다. CSRF.

CSRF의 위험

CSRF 취약점에 대한 간단한 요약은 웹사이트 권한 확인의 취약점을 사용하여 사용자가 알지 못하는 사이에 요청을 보내는 것입니다. 사용자를 "위장"하려는 목적을 달성합니다. 공격자가 CSRF를 사용하여 수행하는 주요 공격 유형은 다음과 같습니다.

공격자는 피해자 사용자를 속여 계정 세부 정보 업데이트, 쇼핑 완료, 피해자가 허용한 모든 상태 변경 작업을 완료하도록 할 수 있습니다. 로그아웃 또는 로그인 및 기타 작업

사용자의 개인 데이터 가져오기

다른 취약점 공격에 협조

CSRF 웜# 🎜🎜##🎜 🎜#그중에 CSRF 웜은 이름에서 알 수 있듯이 웜 효과를 생성하며 공격은 하나에서 열로, 열에서 백으로 퍼집니다. 예를 들어, 커뮤니티에서 친구에게 비공개로 메시지를 보내기 위한 인터페이스와 친구 목록을 얻기 위한 인터페이스에는 모두 CSRF 취약점이 있습니다. 공격자는 이를 CSRF 웜으로 결합할 수 있습니다. 사용자가 악성 페이지를 방문하면 다음을 통해 친구 목록 정보를 얻을 수 있습니다. 그런 다음 CSRF를 사용합니다. 개인 메시징 친구의 CSRF 취약점은 누군가가 이 메시지의 링크를 보는 한 각 친구에게 악성 페이지를 가리키는 메시지를 보냅니다. CSRF 웜은 계속해서 확산되며 이로 인해 피해와 영향이 발생할 수 있습니다. 원인은 엄청납니다!

방어 방법

위의 설명을 통해 CSRF에는 쿠키의 자동 전달 기능과 크로스 사이트 공격이라는 두 가지 특성이 있음을 알 수 있습니다. 그러면 이 두 가지 기능에 대해 다음 솔루션을 사용할 수 있습니다.

Referer 필드 확인

HTTP 헤더에 요청이 들어오는 주소를 나타내는 데 사용되는 Referer 필드가 있다는 것은 누구나 알고 있습니다. 웹사이트에서 요청의 이 필드를 확인함으로써 해당 요청이 이 사이트에서 발행되었는지 여부를 알 수 있습니다. 우리는 이 사이트에서 발행되지 않은 모든 요청을 거부할 수 있으므로 CSRF의 크로스 사이트 특성을 피할 수 있습니다.

const { parse } = require('url');module.exports = class extends think.Logic {
  indexAction() {
    const referrer = this.ctx.referrer();
    const {host: referrerHost} = parse(referrer);
    if(referrerHost !== 'xxx') {
        return this.fail('REFERRER_ERROR');
    }
  }}

ThinkJS를 예로 들어 간단하게 로직으로 판단해보세요. 이 방법은 클라이언트가 리퍼러를 구성할 수 없다는 점을 이용합니다. 간단하지만 웹 사이트에 여러 도메인 이름이 있거나 도메인 이름이 자주 변경되는 경우 매우 번거롭고 특정 제한 사항이 있습니다.

토큰 확인

CSRF는 브라우저의 쿠키 자동 전달 기능을 활용하므로 또 다른 방어 아이디어는 쿠키를 통해 확인 정보를 전달하지 않고 다른 매개변수에 임의성을 추가하는 것입니다. 암호화된 문자열이 확인됩니다. 여기에는 두 가지 방법이 더 있습니다.

Random 문자열: 각 제출에 임의의 문자열 매개변수를 추가합니다. 매개변수는 요청될 때마다 서버에서 페이지를 통해 전송됩니다. . 서비스 측에서는 매개변수가 일치하는지 확인하여 사용자 요청인지 여부를 판단합니다. CSRF 공격에서는 공격자가 임의의 문자열 값을 미리 알 수 없기 때문에 서버는 값을 확인하여 요청을 거부할 수 있습니다.

JWT: 사실 빼고는 세션 로그인 외에도 JWT 토큰 로그인 확인이 점점 더 대중화되고 있습니다. 이 방법은 프런트 엔드에 로그인 토큰을 기록하고 요청이 이루어질 때마다 헤더에 전달하는 것입니다. 로그인 확인 프로세스는 인증 헤더를 추가하여 구현됩니다. CSRF 공격에서는 공격자가 토큰 값을 알 수 없기 때문에 이 방법으로도 CSRF 공격을 방지할 수 있습니다. 틀림없이 JWT 외에도 토큰 로그인 방법에는 OAuth 및 기타 여러 방법이 포함됩니다.

위 내용은 CSRF란 무엇입니까? CSRF의 위험성과 이를 방어하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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