foo.com의 페이지에서 실행되는 클라이언트 쪽 스크립트가 bar.com에서 데이터를 요청하려면 요청에서 헤더를 지정 Origin: http://foo.com
해야하고 bar는로 응답해야합니다 Access-Control-Allow-Origin: http://foo.com
.
사이트 roh.com의 악성 코드가 단순히 헤더 Origin: http://foo.com
를 스푸핑하여 막대에서 페이지를 요청하지 못하게하려면 어떻게해야합니까?
foo.com의 페이지에서 실행되는 클라이언트 쪽 스크립트가 bar.com에서 데이터를 요청하려면 요청에서 헤더를 지정 Origin: http://foo.com
해야하고 bar는로 응답해야합니다 Access-Control-Allow-Origin: http://foo.com
.
사이트 roh.com의 악성 코드가 단순히 헤더 Origin: http://foo.com
를 스푸핑하여 막대에서 페이지를 요청하지 못하게하려면 어떻게해야합니까?
답변:
브라우저는 Origin
헤더 설정을 제어 하며 사용자는이 값을 무시할 수 없습니다. 따라서 Origin
브라우저에서 헤더가 스푸핑 되지 않습니다 . 악의적 인 사용자가 수동으로 Origin
헤더를 설정하는 curl 요청을 만들 수 있지만이 요청은 브라우저 외부에서 발생하며 브라우저 관련 정보 (예 : 쿠키)가 없을 수 있습니다.
CORS는 보안이 아닙니다. 사이트를 보호하기 위해 CORS에 의존하지 마십시오. 보호 된 데이터를 제공하는 경우 쿠키 또는 OAuth 토큰 또는 Origin
헤더 이외의 다른 것을 사용하여 해당 데이터를 보호하십시오. Access-Control-Allow-Origin
CORS 의 헤더는 교차 출처 요청을 허용 할 오리진 만 지정합니다. 더 이상 그것에 의존하지 마십시오.
TLDR : 악성 코드가 원본을 스푸핑하는 것을 막을 수있는 것은 없습니다. 이 경우 서버는 서버에 대해 알지 못하고 요청에 따라 작동합니다. 때로는 그러한 요청이 비쌉니다. 따라서 보안 유형 대신 CORS를 사용하지 마십시오.
나는 최근 CORS와 함께 놀고 있었고, 나에게 같은 질문을했다. 내가 찾은 것은 브라우저가 스푸핑 된 CORS 요청을 볼 때 충분히 똑똑 할 수 있지만 서버가 똑똑하지 않다는 것입니다.
내가 찾은 첫 번째 것은 Origin
헤더가 프로그래밍 방식으로 수정할 수없는 HTTP 금지 헤더 이름이라는 것 입니다. Chrome 용 헤더 수정을 사용하여 약 8 초 안에 수정할 수 있습니다 .
이를 테스트하기 위해 두 개의 클라이언트 도메인과 하나의 서버 도메인을 설정했습니다. 클라이언트 1의 CORS 요청은 허용했지만 클라이언트 2의 CORS 요청은 허용하지 않는 CORS 화이트리스트를 서버에 포함 시켰습니다. 두 클라이언트를 모두 테스트했으며 실제로 클라이언트 2의 CORS 요청은 성공했지만 클라이언트 2는 실패했습니다.
그런 다음 Origin
클라이언트 1과 일치하도록 클라이언트 2의 헤더를 스푸핑했습니다 . 서버가 스푸핑 된 Origin
헤더를 수신하고 화이트리스트 확인을 통과했습니다 (또는 절반 정도의 빈 사람인 경우 실패). 그 후 서버는 소비하도록 설계된 모든 리소스 (데이터베이스 호출, 고가의 전자 메일 보내기, 훨씬 비싼 SMS 메시지 보내기 등)를 소비하여 충실하게 수행했습니다. 이 작업이 완료되면 서버는 행복하게 스푸핑 된 Access-Control-Allow-Origin
헤더를 브라우저로 다시 보냈습니다 .
내가 읽은 문서에는 Access-Control-Allow-Origin
수신 된 Origin
값이 요청에서 보낸 값 과 정확히 일치해야 한다고 명시되어 있습니다. 그들은 일치했기 때문에 Chrome에서 다음 메시지를 보았을 때 놀랐습니다.
XMLHttpRequest를로드 할 수 없습니다
http://server.dev/test
. 'Access-Control-Allow-Origin'헤더의 값http://client1.dev
은 제공된 원점과 같지 않습니다.http://client2.dev
따라서 원점 에 액세스 할 수 없습니다.
내가 읽은 문서가 정확하지 않은 것 같습니다. Chrome의 네트워크 탭에는 요청 및 응답 헤더가 모두로 명확하게 표시 http://client1.dev
되지만 Chrome은 실제 출처를 알고 http://client2.dev
응답을 올바르게 거부 한다는 오류를 볼 수 있습니다 . 서버가 이미 스푸핑 된 요청을 수락하고 내 돈을 보냈기 때문에이 시점에서 중요하지 않습니다 .
There's nothing stopping malicious code from spoofing the origin
-> 예, 자바 스크립트를 설정할 수 없습니다 Origin
. 예, 사용자는 브라우저를 사용하여 피들러를 사용하여 출처를 변경할 수 있지만 CORS가 방어하는 것은 아닙니다. 공격자 제어 웹 사이트 는 Origin을 변경할 수 없습니다.
겸손한 마무리 :
Q : 브라우저에서만 SOP (Same Origin Policy)를 시행합니까?
A : 그렇습니다. 브라우저 내에서하는 모든 호출에 대해 브라우저에서 SOP를 확실히 적용합니다. 서버가 요청의 출처를 확인하거나 확인하지 않을 수 있습니다.
Q : 요청이 SOP를 준수하지 않으면 브라우저가 요청을 차단합니까?
A : 아니요. 브라우저 권한을 벗어났습니다. 브라우저는 단지 크로스 오리진 요청을 보내고 응답이 서버에서 Access-Control
-* 헤더를 통해 합법적으로 신호를 받는지 확인하기를 기다립니다 . 서버가 Access-Control-Allow-Origin
헤더를 다시 보내지 않거나 발신자의 발신지를 에코하지 않거나 헤더에서 다시 보내지 않으면 *
브라우저가 할 일은 발신자에게 응답을 제공하지 않는 것입니다.
Q : 스푸핑을 할 수 없다는 의미 Origin
입니까?
A : 브라우저 및 스크립팅을 사용 Origin
하는 경우 브라우저를 제어하므로 무시할 수 없습니다 . 그러나 자신을 해킹하려는 경우 브라우저 확장 프로그램이나 컴퓨터에 설치 한 다른 도구를 사용하여 브라우저에서 나오는 통화를 변조 할 수 있습니다. 또한 발행 할 수 있습니다 HTTP
사용하여 전화를 curl
, Python
, C#
, 등 및 변경 Origin
트릭 서버에 헤더.
Q : 를 변경하여 서버를 속일 수 있다면 안전하지 않다는 Origin
의미 CORS
입니까?
A : CORS
그 자체로는 보안, 즉 요청의 인증 및 권한 부여에 대해서는 침묵합니다. 쿠키 및 헤더와 같이 작동하는 모든 메커니즘으로 요청을 검사하고 인증 / 권한을 부여하는 것은 서버에 달려 있습니다. XSS와 같은 공격의 경우 우리를 조금 더 보호 할 수 있습니다.
예 :
웹 사이트에 로그인했으며 악의적 인 스크립트가 은행 웹 사이트에 잔액을 요청하는 요청을 보내려고한다고 가정합니다 ( 반사 된 XSS 공격). 귀하의 은행 웹 사이트는 귀하의 웹 사이트에서 오는 자격 증명을 신뢰하므로 요청이 인증되고 HTTP
악성 코드를 목표로 하는 응답이 발행됩니다. 은행 웹 사이트가 다른 출발점과 엔드 포인트를 공유하는 것을 신경 쓰지 않으면 포함하지 않습니다.Access-Control-Allow-Origin
응답의 헤더. 이제 요청이 도착하면 브라우저는 요청이 Cross Origins 요청이라는 것을 인식하지만 서버가 리소스 (여기서는 균형 쿼리 끝점)를 웹 사이트와 공유하고 있다는 것을 응답하지 않습니다. 따라서 흐름을 차단하므로 반환 된 결과는 악성 코드에 도달하지 않습니다.
foo.com
)이Access-Control-Allow-Origin
헤더 를 제공해야 하거나 브라우저가 요청을 허용하지 않는다는 것bar.com
입니다.