2010-04-17 8 views
6

J'avais l'impression que les scripts content_scripts étaient exécutés directement sur la page, mais il semble maintenant qu'il y ait du sandbox.Les scripts "content" de l'extension google chrome sont-ils en sandbox?

Je travaille sur une extension pour enregistrer tout le trafic XHR d'un site (pour le débogage et d'autres fins de développement), et dans la console, le code sniff suivant fonctionne:

var o = window.XMLHttpRequest.prototype.open; 
window.XMLHttpRequest.prototype.open = function(){ 
    console.log(arguments, 'open'); 
    return o.apply(this, arguments); 
}; 
console.log('myopen'); 
console.log(window, window.XMLHttpRequest, window.XMLHttpRequest.prototype, o, window.XMLHttpRequest.prototype.open); 

Enregistre un message chaque fois qu'un XHR est envoyé. Quand je mets cela dans une extension, cependant, le vrai prototype ne sera pas modifié. Apparemment le window.XMLHttpRequest.prototype que mon script voit diffère de celui de la page actuelle.

Y a-t-il un moyen de contourner ce problème? Aussi, ce comportement de sandboxing est-il documenté n'importe où? J'ai regardé autour de moi, mais je n'ai rien trouvé.

Répondre

6

Vous ne pouvez pas faire cela. Selon le documentation:

Toutefois, les scripts de contenu ont certaines limitations . Ils ne peuvent pas:

  • Utilisez chrome * API (sauf pour les parties de chrome.extension)
  • Utiliser des variables ou des fonctions définies par les pages de leur extension
  • Utiliser des variables ou des fonctions définies par les pages Web ou par d'autres. scripts contenu
  • Faire XMLHttpRequests cross-site
+3

Ah quelle honte. Merci d'avoir trouvé cela. Si seulement le chrome avait un peu plus de * puissance * dans son cadre d'extensions. –

+0

putain. Il semble donc qu'il n'y ait aucun moyen d'intercepter et de modifier les corps de requêtes http. Puisque webrequest ne supporte que les en-têtes modifiants et non requestBody ... – K2xL

7

Bien que le contenu S Chrome cript vit dans un "monde isolé", vous pouvez accomplir quelque chose de similaire à ce que vous avez demandé en insérant un élément de script dans le dom.

En tant que preuve de concept, je l'TamperMonkey Chrome Extension et a créé ce script:

// ==UserScript== 
// @name   Modify Secret 
// @namespace http://your.homepage/ 
// @version  0.1 
// @description enter something useful 
// @author  You 
// @match  https://*/* 
// @match  http://*/* 
// @grant  none 
// ==/UserScript== 

console.log(secret); 

var el = document.createElement('script'); 
el.innerHTML = 'secret = "the blue dog"'; 
document.body.appendChild(el); 

Je naviguées http://s.codepen.io/boomerang/745009c49e60974cf9dba1b070f27d111458064000840/index.html qui a ce javascript fonctionnement:

var secret = 'the brown fox'; 

var secretPrinter = setInterval(function() { 
    console.log(secret); 
}, 1000); 

Si vous inspectez la console, on s'attendrait à voir 'le renard roux' constamment imprimé, mais à la place nous avons 'le chien bleu'.


En général, je pense que le concept de sécurité que le navigateur tente d'atteindre est d'empêcher l'environnement de la page d'accéder à l'environnement du script de contenu. Réalisant cela, il n'est pas surprenant que vous pourriez accomplir quelque chose comme ceci avec une extension de navigateur.

+1

Belle trouvaille !! Cela devrait être la réponse acceptée. –

+0

Merci! J'ai mis à jour l'URL car il semble que j'ai supprimé la page précédente de mon site. –