JavaScript Iframe Busting
-
22-07-2019 - |
문제
특정 조건에서는 iframe에서 열리는 웹 페이지가 있습니다. 해당 IFRAME에로드되면 파일을 다운로드하기 위해 윈도우 위치를 리소스로 설정해야합니다 (모두 GreasemonKey 스크립트를 업데이트하기 위해이 모든 것이 합법적 인 BTW). 불행히도, 내가 할 때 :
top.location.href = "http://userscripts.org/...";
상단이 널이라는 오류가 발생합니다. "상단"대신 "창"을 사용하면 Firefox는 스크립트 텍스트를 iframe에로드하지만 GreasemonKey는 어떤 이유로 업데이트로 감지 할 수 없습니다. 어떻게 든 놓친 창 위치를 설정하는 또 다른 방법이 있습니까?
편집 : 내 스크립트 사용자가 특정 비즈니스 페이지를 방문합니다 (첫 번째). 내 스크립트는 Greasemonkey라는 Firefox 플러그인을 사용하여 해당 페이지에로드되었습니다. 내 스크립트는 방문한 페이지에 iframe을 생성하고 내 페이지 (두 번째)를 해당 iframe에로드합니다. 그런 다음 GreasemonKey는 내 페이지에 내 스크립트를로드하여 내 페이지의 값을 확인하여 스크립트가 업데이트되었는지 확인합니다. 스크립트가 업데이트 된 경우 원래 방문한 사이트 ( "첫 번째"로 표시) 및 다른 (3 번째) 사이트 (Userscripts.org)로 사용자를 탐색해야합니다. 바라건대 이것은 약간의 혼란을 해결합니다.
해결책
마침내 Greasemonkey가 지정된 URL과 함께 Firefox에서 새 탭을 열어주는 "gm_openintab (url)"함수를 제공한다는 것을 알았습니다. 이를 통해 Iframe은 GreasemonKey가 업데이트 할 업데이트 된 스크립트의 위치가있는 새 탭을 열 수 있습니다. 이것이 내가 찾고 있던 솔루션은 아니지만 오류없이 완벽하게 작동합니다.
GM_openInTab("http://userscripts.org/...") ;
입력 해 주신 모든 분들께 감사드립니다. Greasemonkey는 어떻게 든 샌드 박스가 스크립트를 통해 악의적 인 목적으로 사용할 수있는 이러한 종류의 행동을 방지 할 수 있습니다.
~ md5sum ~
다른 팁
두 위치는 동일한 호스트 이름 (도메인)을 가져야합니다. 사용하고 싶을 수도 있습니다 parent
대신에 top
.
다음을 시도 할 수 있습니다 (내가 사용하는 것에 적합 함) :
function checkWebPage() {
try {
if (top != self) {
top.location.href = "http://userscripts.org/...";
} else {
self.location.href = "http://userscripts.org/...";
}
} catch (e) {}
}
나는 iframe과 여러 번 일했고 문서의 상태와 함께 일하는 것이 더 안전하다는 것을 알았습니다. 예를 들어 코드를 전달하겠습니다.
이 예에서는 jQuery를 사용하고 있지만 기능에는 필요하지 않습니다.
<head>
<script>
(function($) {
$.documentCtrolState = function(d,f,t)
{
try{
t=(typeof(t)=="undefined")?100:t;
if (d.readyState=="complete") //the document has been completely loaded, successfully or unsuccessfully
f(true);
else
setTimeout(function(){$.documentCtrolState.call(this,d,f,t);}, t);
}catch(ex){
f(false, ex);
}
};
})(jQuery);
$(function(){
$myIframeRef = $(document.myIFrame);
$myIframeRef.attr("src", "mypage.php");
$.documentCtrolState($myIframeRef.window.document, ThenLoadIFrame, 100);
});
ThenLoadIFrame = function(state, ex)
{
alert("State " + state);
}
</script>
</head>
<body>
<iframe src="" id="myIFrame"></iframe>
</body>
UnsafeWindow.parent.location.href = URL; 내 Greasemonkey에서 일했습니다.