2014-02-14 6 views
4

나는 페이지에 자바 스크립트를 삽입하는 북마크릿을 가지고 있으며 사용자가 내 북마크릿에서 직접 페이지를 구독 할 수 있도록 만든 HTML 페이지로 iframe을 엽니 다.사이트에서 자바 스크립트를 내 북마크에 삽입 할 수 있는지 확인하는 방법은 무엇입니까?

문제는 일부 도메인 (Twitter와 Facebook이 2 인 경우)에서 자바를 삽입 할 수 없기 때문에 대신 창을 팝업해야한다는 것입니다. 페이스 북에

자바 스크립트 콘솔 :

는 다음과 같은 콘텐츠 보안 정책 지침 위반 스크립트 스크립트 이름를로드 거부 "스크립트 SRC에 https : // .facebook.com HTTP : // .facebook.com https : // .fbcdn.net http : // .fbcdn.net * .facebook.net * .google-analytics.com * .virtualearth.net .google.com 127.0.0.1 : * .spotilocal.com : * chrome-extension : // lifbcibllhkdhoafpjfnlhfpfgnpldfl '안전하지 않은 인라인' '안전하지 않은 평가'https : // .ak amaihd.net http : // .akamaihd.net * .atlassolutions.com ".

내 북마크 레트에서는 JS를 삽입하려고 시도하기 전에 URL이 해당 도메인과 일치하는지 확인하고 있습니다. 그렇다면 팝업 창이 새 창으로 열립니다. 명백한 이유 때문에 이것은 좋은 습관이 아닙니다.

자바 스크립트 기능이 현재 페이지에서 실행되도록 허용되었는지 확인하는 좋은 방법은 무엇이며, 그렇지 않은 경우 새 창을 여는 방법은 무엇입니까?

+0

AJAX를 사용하여 집에 전화 했습니까? –

+0

"자바 스크립트 삽입을 허용하지 마십시오"는 의미는 무엇입니까? 그들은 그것을 어떻게 거부합니까? – Pointy

+0

다음 내용 보안 정책 지정 문을 위반하기 때문에 * script * 스크립트로드를 거부했습니다. "script-src https : //*.facebook.com http : //*.facebook.com https : //*.fbcdn.net http : //*.fbcdn.net * .facebook.net * .google-analytics.com * .virtualearth.net * .google.com 127.0.0.1:* * .spotilocal.com : * chrome-extension : // lifbcibllhkdhoafpjfnlhfpfgnpldfl 'unsafe-inline' 'unsafe-eval'https : //*.akamaihd.net http : //*.akamaihd.net * .atlassolutions.com ". – tommybond

답변

4

절대적인 확실성으로 외부 스크립트를로드하지 못했음을 알 수있는 방법이 없습니다. 보안 정책이없는 경우에도 다른 문제로 인해 외부 스크립트를로드하지 못할 수 있습니다. 유일한 당신이 정말로 할 수있는 한가지는 타임 아웃을 설정하고, 타임 아웃이 만료되기 전에 스크립트가 어떤 행동을 완료하지 않았다면,로드에 실패했다고 가정합니다.

편집 : 나는 아래의 Sean에 의해 수정되었습니다. 그의 제안은 Windows의 Chrome 및 Firefox에서도 작동했습니다. 이 솔루션은이 같은 것입니다 :

newScript.addEventListener('error', function(){ console.log('script failed to load') }); 

페이지 헤더는 외부 스크립트를 차단 콘텐츠 보안 정책을 반환하는 경우 확인하는 방법의 특정 질문에 대해 내가 알고있는 유일한 솔루션의 HTTP 헤더를 확인하는 것입니다 AJAX를 사용합니다.

다음은 몇 가지 예제 코드입니다. 나는 페이스 북에서 이것을 테스트했다.

req = new XMLHttpRequest; 
req.onreadystatechange = function(){if (req.readyState==4) console.log(req.getResponseHeader('content-security-policy'))}; 
req.open("HEAD", document.location.href); 
req.send(); 
+0

+1 - 아주 좋은 해결책입니다. 대신 대체로'script.addEventListener ('error', callback, false)'작업하지 않을 것입니다 (대부분의 경우)? –

+1

기록을 위해 나는'(function (d, c, b, l, s) {c = c [b] (d), b = d.body; s = c ('script'); s.src s [l] ('error') = 'http : //google.com/not/js.js'; s [l] ('로드', console.log.bind (콘솔, '로드' (문서, document.createElement, 'bind', 'addEventListener');) 및로드 오류가 발생했습니다 (Opera ('console', 'error'), false) 19, Github에서 테스트). –

+0

니스. 웬일인지 나는 교차 도메인이 아니라고 내 머리 속에 확신했다. 하지만 괜찮아 보인다. 그것을 알게되어 기쁘다. –

0

보안 등급에 관계없이 책갈피를 실행해야합니다. 그렇지 않다면 적어도 브라우저 버그 일 것입니다. 그러나 북마크릿은 어떤 일을하는 것이 금지되어있을 수 있습니다. try-catch를 사용하면 조치가 허용되는지 여부를 알 수 있습니다.