2011-09-21 3 views
9

페이지로 실행해야하는 코드로 작업 중이며 Chrome Extension으로 실행중인 경우 추가 작업을 수행 할 수 있기를 원합니다. 내가 사용하고 있습니다 것은이 좋은 capabilitydetection 것 같다코드가 Chrome 확장 프로그램으로 실행 중인지 확인

<script> 
if (chrome && chrome.extension) { 
    // extension stuff 
} 
</script> 

. 사용자 에이전트 문자열을 사용하면 문맥 (웹 페이지 대 확장자)이 동일하기 때문에 문제가 발생합니다.

질문 : 코드가 Chrome 확장 프로그램 내에서 실행되는지 여부를 감지하는 다른 신뢰할 수있는 기술이 있습니까?

업데이트 :manifest.json 파일에 넣을 수있는 것이 있는지 궁금합니다. 다시 읽을 수 있습니다. 참고로, 제가 작업중인 확장 기능은 항상 실행되는 영구적 인 것이 아니라 단일 창이나 브라우저 탭에서 실행되며 다른 창이나 탭 또는 다른 것과 상호 작용할 필요가없는 콘텐츠 응용 프로그램입니다. .

+1

You co 확장 상태를 확인하는 것이 의도 된 목적은 아니지만 uld를 사용해 국제화 된 문자열을 가져 오십시오. http://code.google.com/chrome/extensions/i18n.html –

답변

18

당신이 chrome.runtime.id의 존재와 비 공허함을 검사하여 크롬 확장 프로그램에서 실행하고 있는지 전자, 당신은 쉽게 감지 할 수있는 반면 :

if (window.chrome && chrome.runtime && chrome.runtime.id) { 
    // Code running in a Chrome extension (content script, background page, etc.) 
} 
+1

우수 포인트. 'chrome.runtime'은 2012 년 9 월 25 일에 출시 된 Chrome 22 (https://developer.chrome.com/extensions/runtime#property-id)의 일부로 출시되었습니다 (http://googlechromereleases.blogspot.com/2012/09 /stable-channel-update_25.html) ... 1 년 후 질문과 답변이 게시되었습니다. 허용 된 답변을 업데이트 중입니다. 폭발에 감사드립니다! 두 경우 모두 – artlung

+0

인 경우 조건은 true입니다. 확장 팝업 메뉴 또는 브라우저 페이지보기에서 확인합니다. –

4

실용적인 접근 방법입니다. 이론적으로 (이것이 관련이 있는지 없는지, 예를 들어 취약성을 제공하는지는 확실하지 않음) 매우 쉽게 스푸핑 될 수 있습니다. 나는 당신의 맥락에 얼마나 관련이 있는지에 달려 있다고 생각합니다.

여기에 약간 강한 생각 : AFAIK 객체가 함수가 될 필요와 가진 이후가 약간 더 강한 있지만,

if (chrome && 
    chrome.windows && 
    chrome.windows.get && 
    typeof chrome.windows.get === 'function' && 
    chrome.windows.get.toString() === 'function get() { [native code] }') 

아이디어는 당신과 동일 그것의 toString() 값은 이후 그 값이 불가능있다 유효한 구문이 아니므로 네이티브 코드 (완전히 다른 수준의 해커가 필요함)를 변경하지 않으면 해당 값을 스푸핑하려고해도 작동하지 않습니다.

위와 같은 사항을 확인하는 데 사용 권한이 필요한지 여부를 기억하지 마십시오. 그러나 아이디어는 분명합니다.

UPDATE는

난 그냥 "네이티브 코드"구문 아이디어는 기존의 기능을 앨리어싱에 의해, 속지 될 수 있다는 것을 깨달았다. 예 :

var FakeFn = Object.create; 
FakeFn.toString(); // "function create() { [native code] }" 

하지만 문자열에 이름이 표시되므로 사용하는 기능을 신중하게 선택하여 처리 할 수 ​​있습니다. get이 너무 일반적이지만, 크롬 확장으로 만 구현되는 애매한 함수 이름 (예 : captureVisibleTab :)을 취하면 다른 로컬 사용자가 코드를 속일 수있는 기본 체크와 달리 매우 휴대하기 쉬운 솔루션입니다 코드는 브라우저가이 이름으로 기본 함수를 구현하지 않는다는 것을 미리 알기 때문에 모든 브라우저와 모든 사용자 코드에서 여전히 안전합니다.

@Mathew는 지적 UPDATE

,이 아이디어는 (비록 겉으로 만 악의적으로) foolable입니다. Function.prototype.toString과 비교하여 문제를 패치 할 수 있다고 생각했지만 원래 toString 메서드의 별칭을 지정하여 속일 수 있고 특정 함수에 대해 false 문자열을 반환하고 다른 문자열은 원래 문자열을 반환하는 새 함수를 만드는 것으로 생각했습니다.

결론적으로, 내 생각은 의도하지 않은 충돌의 가능성을 거의 배제 할 것이라고 생각했지만 (OP의 아이디어보다 약간), 처음에는 생각한대로 악의적 인 공격에 대한 방어력은 분명하지 않습니다. 그것은 수 있습니다.

+0

흥미롭고 예상대로 작동하지만 확신하지 못합니다. 그것은 내 것보다 더 휴대하기 쉽다. 어떻게 든 다시 읽을 수있는'manifest.json' 파일에 넣을 수있는 것이 있는지 궁금합니다. – artlung

+1

@artlung에 감사드립니다. 그런 접근법이 내 것보다 덜 휴대하기 때문에, 설명해 드리겠습니다. 전체 확장 API (AFAIK, 저는 API에 대해별로 잘 알고 있지 않습니다)는 자바 스크립트 기반입니다. 따라서 모든 호출은 JS 표준과 일치하며 정의에 의해 속일 수있는 일반적인'obj.ref.fn()'형식을 취할 것입니다. 내 접근 방식이 더 이식성이있는 이유는 그것이 속일 수 없기 때문입니다. 모든 브라우저에서 'window.chrome = {extension : true}'를 쉽게 만들 수 있지만 브라우저 자체를 조작하지 않으면 해당 조건을 통과하는 객체를 만들 수 없으며 코드에서 해당 객체를 크롬 확장이라고 생각합니다. – davin

+0

당신은 훌륭한 지적을합니다. 내 의도는 엄격히 비 스푸핑을 강요하는 것이 아니라 단순히 Chrome (및 다양한 변형)과 확장 코드의 일부로 코드화 된 코드를 차별하는 것입니다. 이것에 신중하게 생각해 주셔서 대단히 감사합니다! – artlung

2

나는 이것이 오래되었다는 것을 알고 있지만, 나는 대안을 제시 할 것이라고 생각했다. Chrome 확장 프로그램에 다른 자바 스크립트 파일을 추가하여 두 개의 .js 파일을 포함 할 수 있습니다. 의 manifest.json는 것 :

"js": ["additionalscript.js", "yourscript.js"] 

additionalscript.js는 단순히 변수 var isextension = true를 선언 할 수있다. yourscript.js는 typeof isextension != 'undefined'을 확인할 수 있습니다.

그러나 아마도 더 재미있는 예를

, 그것은

var adminpassword='letmein' 

지금 만 yourscript.js 확장에서 실행할 때 ADMINPASSWORD에 액세스 할 수 있습니다 선언 할 수 있습니다.

내가 크롬, 크롬 객체에 그 글로벌 윈도우의 속성입니다 것으로 나타났습니다

+0

나는 '스승'이 아니라 '스승'이라고 생각한다. 테스트를'typeof isextension! = 'undefined''로하고 싶을 경우, 또는 addsalscript.js가 실행되지 않았을 때 JavaScript 예외가 발생합니다. 또한 이것이 매니페스트의 '배경'섹션에 있음을 유의해야합니다. –

+0

감사합니다. @DanMcGrath - "js"항목이있는 manifest.json의 "content_scripts"섹션이 있습니다. "content_scripts": [ { "matches": [ "* : //*.google.com/* "], "js ": ["One.js ","Two.js "] } ]. 정의되지 않은 부분에 대한 좋은 점 확인 –

1

(플러그인이 손상 될 수있는 시스템에 있다면 당신은 스크립트 파일에 암호를 포함하지 않을 물론) 개체를 삭제할 수 없습니다. 사용자 정의 특성 인 경우 삭제 조작이 성공합니다. 그래서 당신은이 방법으로 테스트 할 수 있습니다 :

var isRunningInExtension = (!(delete window.chrome) && chrome.extension) ? 
          true : false; 

UPDATE : 라인 위의 정말 코드가 크롬 확장 프로그램에서 실행되는 보증하지 않습니다. 누구나 '확장'속성이있는 '크롬'이라는 객체를 만든 다음 해당 객체를 고정/봉인 할 수 있습니다. 이렇게하면 수표를 통과하고 코드가 크롬 확장 내에서 실행되는 잘못된 결과가 발생할 수 있습니다.

확장 프로그램에서 코드를 실행하려면 자바 스크립트를 실행하기 전에 전역 크롬 개체를 테스트해야합니다. 테스트하기 전에 가짜 크롬 개체가 생성되지 않도록 보장해야합니다.

한 가지 가능한 해결책은 iframe을 사용하는 것입니다. 아래 예제에서 iframe의 sandbox 속성을 사용하여 iframe에 스크립트 (스크립트 태그에 포함 된 스크립트까지 포함)를 실행하지 않도록 지시합니다. 그러면 스크립트가없는 것을 확인할 수 있습니다. 전역 window.chrome 객체를 수정할 수 있습니다.

(function() { 
    var isChromeExtension = (function() { 
    var contentWindow, 
     iframe = document.createElement("iframe"), 
     isChromeExtension; 
    // test for sandbox support. It is supported in most recent version of Chrome 
    if ("sandbox" in iframe) { 
     try { 
     iframe.sandbox = "allow-same-origin"; 
     iframe.src=location.href; 
     iframe.style="display: none"; 
     document.body.appendChild(iframe); 
     contentWindow = iframe.contentWindow; 
     isChromeExtension = !!(contentWindow.chrome && contentWindow.chrome.extension); 
     document.body.removeChild(iframe); 
     } catch(e) {} 
    } 
    return isChromeExtension; 
    }()); 
}()); 

결과가 될 수있다 :

  • 진정한 - 코드가 크롬의 확장 내에서 실행되는 경우
  • 거짓 - 코드가 크롬의 확장 내에서 실행되지 않는 경우
  • 정의 - 브라우저의 경우 iframe에 샌드 박스를 지원하지 않거나 테스트 중에 오류가 발생했습니다.
+0

'delete '가 어떻게 작동하는지에 대한 이해가 여러분이 말한 것처럼 분명하지 않습니다. 나는 또한 객체를 만들고,'window.g = {x : 1}'라고 말하고 그것에서 delete를 실행하고 그것을 삭제하려고 할 때 비슷한 결과를 얻을 수 있습니다. 아마도이 작업에 대한 완전한 예가 필요할 것입니다. – artlung

+0

새로운 방법은 성능이 좋지 않으며 어리석은 것도 아닙니다. 환경이 정말로 악의적 인 경우,'문서 '를 포함한 모든 객체가 스푸핑 될 수 있습니다. 이를 막을 수있는 방법이 없으므로 가장 가독하고 직접적인 방법을 찾아야합니다. –

+0

실제로는별로 성능이 좋지 않습니다. 전체 페이지/스타일/스크립트를 iframe에로드하지만 스크립트 (인라인 또는 스크립트 태그 포함)가 실행되지 않습니다. 이것이 샌드 박스의 역할입니다. 클라이언트 측에서는 전역 객체를 변경하고 문서 객체를 모방하기까지합니다. 크롬 개체는 삭제할 수 없지만 모든 사용자가이를 무시할 수 있으므로 다음을 수행 할 수 있습니다. 'window.chrome = {runtime : {id : {}}};'및 제안 된 답변 내 코드가 확장 프로그램 내에서 실행 중이라고 말하는 반면 사실은 그렇지 않습니다. – ttsvetkov

1

크롬은 응용 프로그램의 실행 상태를 확인하기 위해 직접적인 API를 제공하지 않습니다 확장 팝업 또는 크롬 페이지보기에서 실행 중입니까?그러나 하나의 간접적 인 트릭은 CSS에서 지정한 것과 같거나 작은 확장 본문 해상도 (이 경우 확장 팝업이 열림)보다 크거나 일치 할 수 있습니다 (이 경우 웹 페이지보기는 열다).

1

나는 비슷한 것을 필요로했습니다.

하지만 코드를 속이려는 사이트는 신경 쓰지 않아도됩니다.

const SCRIPT_TYPE = (() => { 
    if (chrome && chrome.extension && chrome.extension.getBackgroundPage && chrome.extension.getBackgroundPage() === window) { 
     return 'BACKGROUND'; 
    } else if (chrome && chrome.extension && chrome.extension.getBackgroundPage && chrome.extension.getBackgroundPage() !== window) { 
     return 'POPUP'; 
    } else if (!chrome || !chrome.runtime || !chrome.runtime.onMessage) { 
     return 'WEB'; 
    } else { 
     return 'CONTENT'; 
    } 
})(); 

  • 자바 스크립트가 배경 페이지에서 실행되는 4 가지 시나리오
  • 자바 스크립트
  • 자바 스크립트 컨텍스트 스크립트에서 실행되는 팝업 페이지에서 실행을 감지합니다
  • 자바 스크립트는 웹 사이트에서 직접 실행됩니다.
관련 문제