2010-02-16 8 views
4

Je dois autoriser le contenu de notre site à être intégré dans d'autres sites Web d'utilisateurs. Le conent sera payant, donc je dois le garder sécurisé, mais l'une des conditions est que le site Web abonné a seulement besoin de déposer du javascript dans leur page.Comment puis-je donner aux utilisateurs un widget javascript pour extraire du contenu de mon site en toute sécurité?

Il semble que la seule façon de sécuriser notre contenu est de vérifier l'URL de la page d'hébergement de notre javascript correspond au site abonné. Existe-t-il un autre moyen de le faire étant donné que nous ne connaissons pas les navigateurs clients qui vont atteindre les sites d'abonnement?

La meilleure façon de procéder consiste à fournir un fichier d'inclusion javascript qui remplit un élément de page connu lors du chargement de la page? Je pense à utiliser jquery pour que le fichier d'inclusion appelle d'abord jquery (en vérifiant s'il est déjà chargé et en utilisant une sorte de protection de l'espace de noms), puis en chargeant la page, il remplit l'élément donné. Je voudrais inclure une feuille de style si possible pour styliser l'élément mais je ne suis pas sûr si je peux charger ceci avec le javascript.

Est-ce que cela ressemble à une approche raisonnable? Y a-t-il autre chose que je devrais considérer?

Merci à l'avance,

Mike

+0

+1 Bienvenue sur Stack Overflow, Mike! – Sampson

+0

Merci Jonathan, j'ai trouvé quelques bons conseils sur le site – Mike

Répondre

5

Il semble que la seule façon d'assurer notre contenu est de vérifier l'URL de la page d'accueil de notre javascript correspond à la site abonné.

Ah, mais dans le code côté client ou côté serveur?

Ils ont tous deux leurs inconvénients. Le faire avec du code côté serveur n'est pas fiable car certains navigateurs ne passeront pas du tout l'en-tête Referer, et si vous voulez arrêter les caches en conservant une copie du script, empêchant ainsi le contrôle Referer, vous devez servir avec nocache ou Vary: Referer en-têtes, ce qui nuirait à la performance. En revanche, avec les contrôles côté client dans le script que vous renvoyez, vous ne pouvez pas être sûr que l'environnement dans lequel vous exécutez n'a pas été saboté.Par exemple, si votre balise de script d'inclusion était comme:

<script src="http://include.example.com/includescript?myid=123"></script> 

et votre script côté serveur regardé 123 comme l'ID pour un client en utilisant le domaine customersite.foo, il pourrait répondre avec le script:

if (location.host.slice(-16)==='customersite.foo') { 
    // main body of script 
} else { 
    alert('Sorry, this site is not licensed to include content from example.com'); 
} 

Ce qui semble assez simple, sauf que le site inclus pourrait avoir remplacé String.prototype.slice avec une fonction qui retournait toujours customersite.foo. Ou diverses autres fonctions utilisées dans le corps du script peuvent être suspectes. L'inclusion d'un <script> d'un autre contexte de sécurité va dans les deux sens: le site-include doit faire confiance au site-source pour ne rien faire de mal dans leur contexte de sécurité comme voler des mots de passe ou remplacer la page par un gros chèvre; mais, de la même manière, le code du site source n'est qu'un invité dans le contexte de sécurité potentiellement malveillant. Une certaine confiance doit donc exister entre les deux parties lorsqu'un site comprend un script d'un autre; le contrôle de domaine ne sera jamais un mécanisme de sécurité 100% infaillible. Je voudrais inclure une feuille de style si possible pour styliser l'élément mais je ne suis pas sûr si je peux le charger avec le javascript. Vous pouvez certainement ajouter des éléments de style à l'élément head du document, mais vous aurez besoin d'un espace de nom fort pour vous assurer qu'il n'interfère pas avec les autres styles de page. Vous préférerez peut-être utiliser des styles en ligne pour plus de simplicité et éviter les interférences de la feuille de style principale de la page. Cela dépend vraiment si vous voulez que votre contenu généré fasse partie de la page hôte (dans ce cas, vous préférerez peut-être laisser le site inclus traiter des styles qu'ils voulaient pour lui-même), ou si vous voulez qu'il se trouve seul, non affecté par le contexte (dans ce cas, vous feriez mieux de mettre votre contenu dans un avec ses propres styles).

Je pense à l'aide jquery de sorte que le fichier include devrait d'abord faire appel à jquery

Je voudrais essayer d'éviter de tirer jQuery dans la page d'accueil. Même avec noconflict, il peut y avoir des conflits avec d'autres scripts qui ne s'y attendent pas, en particulier des scripts complexes comme les autres frameworks. Exécuter deux cadres sur la même page est une recette pour des erreurs étranges.

(Si vous avez pris la route , d'autre part, vous obtenez votre propre contexte de script pour jouer avec, il ne serait pas un problème.)

+0

Merci pour l'information, cela m'a donné beaucoup à réfléchir et clarifié quelques choses. – Mike

+0

@bobince Est-il possible que le site-include remplace l'emplacement.Hôte "la fonction" et "String.slice"? –

+1

@Murat: oui, bien qu'il y ait des problèmes de navigateur autour de ce que vous pouvez exactement faire avec 'location' Dans IE vous pouvez remplacer l'objet' location' entier. 'Object.defineProperty' une propriété de remplacement sur l'objet' location' existant – bobince

2

Vous pouvez enregistrer le domaine des utilisateurs, et une clé de votre base de données locale. Cela, ou la clé peut être une version cryptée du domaine pour vous éviter d'avoir à faire une recherche dans la base de données. L'un ou l'autre peut déterminer si vous devez répondre à la demande ou non.

Si la demande est valide, vous pouvez renvoyer vos données à l'utilisateur. Ces données peuvent en effet charger dans jQuery et dans la référence CSS supplémentaire.

connexes:

  1. How to load up CSS files using Javascript?
  2. check if jquery has been loaded, then load it if false
+1

+1. En passant, je serais toujours prudent sur le chargement d'un script sur ma page à partir d'un site tiers, surtout si ce n'est pas sur https. N'étant pas désireux d'autoriser un tiers à accéder au DOM de ma page, il ouvre la porte à d'éventuelles attaques MITM. La plupart des fournisseurs de widgets devraient utiliser les iframes pour offrir une sécurité à toutes les parties impliquées. Les iframes peuvent être transparents et vous pouvez même proposer un paramètre 'get' qui fournit l'emplacement du fichier css. –

+0

+1 @Andy. Bonne information. – Sampson

+0

Merci pour l'information, je vais enquêter plus loin. – Mike