정보실

웹학교

정보실

javascript target = "_ blank"를 추가하여 웹 사이트를 취약하게 합니까?

본문

아니면 웹 사이트의 성능을 떨어 뜨리고 있습니까? 자, 먼저 하나의 예를 보여 드리겠습니다! 

링크를 클릭 한 후 이 블로그로 돌아가려면 뒤로를 누르십시오.


https://gosink.in/are-you-making-website-vulnerable-target-blank-or-performance/ 


이전에 이 사실을 알지 못했다면 target = "_ blank"만 사용하는 것이 웹 사이트에 위험하다는 것을 확신합니다. 실제로 가장 과소 평가 된 취약점 중 하나입니다.


이런 일이 처음으로 일어날 때 나는 그것을 믿을 수 없었습니다. 믿을 수 없었습니다. 이것에 대해 어떻게 알지 못했습니까? 팝업이 양식을 채우고 부모 페이지를 리디렉션 하는 등의 작업을 보았습니다. 그러나 이러한 데이터는 실제로 원본 웹 사이트에서 액세스 할 수 있다는 것을 알지 못했습니다.


사람들이 일반적으로 target = "_ blank"를 언제 사용하는지 봅시다! 


  • 사용자가 자신의 페이지를 떠나고 싶지 않은 경우
  • 그들은 내부 링크와 외부 링크를 구별하려고 합니다.
  • 그들은 무한 스크롤이 있는 페이지를 가지고 있으며 사용자가 스크롤 위치를 잃기를 원하지 않습니다.
  • 어떤 형식이 있고 데이터 손실을 방지하려는 경우.


이것이 주된 이유이며 전적으로 상황에 따라 다르므로 사용사례에 찬성하거나 반대하지 않습니다. 그들 모두는 다른 상황에서 좋고 나쁩니다.


공격자는 어떻게 웹 사이트를 악용 할 수 있습니까? 


이것을 본 후 내 마음에 오는 사용 사례중 하나는 피싱입니다!


일반적으로 일부 공격자가 웹 사이트의 데이터를 손상 시키려면 페이지를 웹 사이트의 복제본으로 리디렉션합니다. 따라서 사용자가 자격 증명이나 기타 중요한 데이터 또는 정보를 손상 시킬 수 있습니다.


누군가 귀하의 웹 사이트를 악용하고 싶지 않더라도 귀하의 웹 사이트 성능을 크게 저하 시킬 수 있습니다. 이 블로그에서 나중에 이야기하겠습니다.


이 target = "_ blank"에는 몇 가지 멋진 기능이 있습니다. 다른 페이지에서 전체 문서에 액세스 할 수 있습니다. 모든 데이터를 가져오고 HTML, CSS 또는 JavaScript를 추가하고 양식을 채우고 제출할 수 있으며 도메인이 동일한 경우 무한한 작업을 수행 할 수 있습니다.


다행히도 웹 사이트의 도메인이 동일하지 않은 경우 거의 모든 브라우저에서 DOM 액세스를 지원하지 않습니다. 그러나 여전히 부모 웹 사이트의 창 개체에 액세스 할 수 있습니다. 그러나 나는 이 취약점을 이용하여 쿠키와 세션 하이 재킹을 본 블로그와 일부 토론을 읽었습니다. 그리고 솔직히 말해서 나는 그것을 시도했고 최신 브라우저에서 그 교차 출처를 할 수 없었습니다.


GitHub 리포지토리의 기능 및 취약성을 확인할 수 있으며 세부 정보 또는 취약성을 추가하려는 경우 주저하지 말고 풀 요청을 수행하십시오.


이것이 어떻게 작동하는지 봅시다! 


inspect를 사용하여 위의 앵커 태그 코드를 살펴보면 해당 링크에 대해 의심스러운 것이 없습니다. src와 target이라는 두 가지 속성 만 있습니다. 그러나 마법은 링크를 클릭 한 후에 발생합니다.


이 링크를 클릭하면 새 창은 window.opener 내에서 상위 웹 사이트의 창 개체에 대한 전체 참조를 가져옵니다. 자식에서 데이터를 가져오고 수정할 수 있으며, window.open()을 사용하여 링크를 열 경우에만 부모에서 동일한 작업을 수행 할 수 있습니다.


자식 창의 콘솔 내에서 window.opener를 실행하여 이를 확인할 수도 있습니다. 부모 창의 위치를 ​​변경하려면 다음 명령을 실행할 수 있습니다.


window.opener;
window.opener.location = 'https://gosink.in';

성능에 어떤 영향을 줄 수 있습니까? 


target = "_ blank"만으로 링크를 열면 동일한 프로세스 ID에서 실행됩니다. 시스템 모니터, 작업 관리자 또는 htop에서 이를 확인할 수도 있습니다. 모든 자바 스크립트 파일을 프로세스에 추가하여 웹 사이트의 성능이 저하됩니다.


네이티브 프로그래밍에 대한 지식이 있다면 동일한 PID를 얻을 수 있다면 부모 프로세스가 갖는 모든 액세스 권한을 얻을 수 있으며 포인터를 사용하여 메모리를 통과 할 수도 있다는 데 동의합니다.


해결책은 무엇인가? 


해결책은 매우 간단합니다. 앵커 태그에 rel = "noopener"를 추가하면 이를 방지 할 수 있습니다. 

이것은 window.opener를 null로 만듭니다. 그러나 여전히 다른 페이지는 사용자가 어느 페이지에서 왔는지 알려줍니다. 이를 방지하기 위해 rel = "noreferrer"를 사용할 수 있습니다. noreferrer를 사용하는 경우 대부분의 브라우저에 noopener를 설정할 필요는 없지만 개인적으로 두 브라우저를 모두 안전하게 추가하는 것이 좋습니다. rel = "noopener noreferrer"


JavaScript를 사용하여 사용자를 리디렉션 만해도 안전합니까? 


당연히 아닙니다! window.open()도 같은 작업을 수행합니다. 그러나 다음과 같이 window.opener를 null로 설정할 수 있습니다.


const newWindow = window.open('https://gosink.in');
newWindow.opener = null;

결론 


이 앵커 태그를 올바르게 사용하고 있을 수 있지만 일부 외부 모듈 / 라이브러리가 이 모듈을 올바르게 사용하지 않으면 이러한 것들이 손상 될 수 있습니다. 웹 사이트를 프로덕션에 게시하기 전에 Google Lighthouse를 사용하여 웹 사이트를 확인하는 것이 좋습니다.


부모와 자식 창 사이의 통신을 활성화하기 위해 target = "_ blank"를 사용하는 사용 사례는 일반적으로 없습니다. 

그리고 기술적으로는 웹 사이트의 성능이 저하되고 사용자 데이터가 손상 될 수 있습니다. 

따라서 최소한 rel = "noopener"를 사용하는 것이 가장 좋습니다.




















  • 트위터로 보내기
  • 페이스북으로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

페이지 정보

조회 25회 ]  작성일19-09-25 17:59

웹학교