2008-09-09 7 views
20

Bien que les scripts inter-sites soient généralement considérés comme négatifs, j'ai rencontré plusieurs situations où cela était nécessaire.Meilleure pratique: Scripts intersites légitimes

Je travaillais récemment dans le cadre d'un système de gestion de contenu très limitatif. J'avais besoin d'inclure du code de base de données dans la page, mais le serveur d'hébergement n'avait rien d'utilisable. J'ai mis en place quelques scripts bare-bones sur mon propre serveur, pensant à l'origine que je pourrais utiliser AJAX pour importer le contenu de mes scripts directement dans le template du CMS (conservant ainsi des images dynamiques, des éléments de menu, CSS, etc.). J'avais tort. En raison des limitations des objets XMLHttpRequest, il n'est pas possible d'extraire du contenu d'un domaine différent. Donc je pensais iFrame - même si je ne suis pas un fan de cadres, j'ai pensé que je pouvais créer un cadre qui correspondait à la largeur et la hauteur du contenu, de sorte qu'il semble natif. Encore une fois, j'étais bloqué par des «protections» de script inter-site. Bien que je puisse effectivement charger un fichier distant dans le iFrame, je ne pouvais pas exécuter JavaScript pour modifier sa taille sur la page hôte ou dans la page chargée.

Dans ce scénario particulier, je n'étais pas en mesure de pointer un sous-domaine vers mon serveur. Je ne pouvais pas non plus créer un script sur le serveur CMS qui pourrait être un proxy du contenu de mon serveur, donc ma dernière pensée était d'utiliser un JavaScript distant.

Un JavaScript à distance fonctionne. Il se brise lorsque l'utilisateur a JavaScript désactivé, ce qui est un inconvénient; mais ça marche. Le "problème" que j'avais avec l'utilisation d'un JavaScript distant était que je devais utiliser la fonction JS document.write() pour sortir n'importe quel contenu. Toute sortie qui n'est pas JS provoque des erreurs de script. En plus d'utiliser document.write() pour chaque ligne, vous devez également vous assurer que le contenu est échappé - sinon vous vous retrouverez avec plus d'erreurs de script.

Ma solution est la suivante:

Mon script a reçu un paramètre GET ("page"), puis regardé le fichier ({$page}.php), et lire le contenu dans une variable. Cependant, j'ai dû utiliser des techniques de tampon maladroit pour exécuter les scripts inclus (pour des choses comme l'interaction de base de données) puis dépouiller le contenu final de tous les caractères de saut de ligne (\n), puis échapper tous les caractères requis. Le résultat final est que mon script original (qui génère JavaScript) accède à des scripts apparemment "standard" sur mon serveur et convertit leur sortie standard en JavaScript pour l'afficher dans le modèle CMS.

Bien que cette solution fonctionne, il semble qu'il pourrait y avoir une meilleure façon d'accomplir la même chose. Quelle est la meilleure façon de faire fonctionner les scripts inter-sites spécifiquement dans le but d'inclure du contenu provenant d'un domaine complètement différent?

Répondre

14

Vous avez trois choix:

  1. Créez un server side proxy script.
  2. Créez un script distant à lire dans du code HTML dynamique distant. Utilisez une bibliothèque comme jQuery pour rendre cela plus facile. Vous pouvez utiliser le load function pour injecter du code HTML si nécessaire. EDIT Ce que je voulais dire à l'origine par exemple # 2 utilisait JSONP, ce qui nécessite le script côté serveur pour reconnaître le "callback =?" param.

  3. Utilisez un fichier client side Flash proxy et configurez un fichier crossdomain.xml sur la racine Web de votre serveur.

+0

Voulez-vous s'il vous plaît préciser # 2? Pour le type de données 'html', comme dans load(), jQuery utilise XMLHttpRequest, qui ne fonctionne pas entre sites. En outre, load() supprime les balises de script. –

+0

Désolé, ce que je voulais dire pour # 2 utilise JSONP http://docs.jquery.com/Release:jQuery_1.2/Ajax#Cross-Domain_getJSON_.28using_JSONP.29 –

1

Personnellement, j'appellerais à cet autre domaine sur le serveur et obtenir et analyser les données là pour une utilisation dans votre page. De cette façon, vous évitez tout problème et vous obtenez la puissance d'un langage/plateforme côté serveur pour obtenir et analyser les données.

Je ne sais pas si cela fonctionne pour votre scénario spécifique ... difficile de savoir, même avec votre description verbeux ...

0

Je suis venu à travers ce YDN server side proxy script avant. Il dit qu'il est conçu pour fonctionner avec les API de recherche de Yahoo.

Cela fonctionnera-t-il avec n'importe quel domaine, si vous supprimez simplement le code API Yahoo? Ou avez-vous besoin de le remplacer par le domaine avec lequel vous voulez qu'il fonctionne?

1

Vous pouvez essayer easyXDM, en incluant très peu de code, vous pouvez passer des données ou des appels de méthode entre les documents de différents domaines.

0

Le contenu distant iframe est accessible par javascript local.

Le serveur distant doit simplement définir le document.domain de la page.

Par exemple:

site contient une iframe avec src='Site B/home.php'

home.php ressemble à ceci:

[php stuff]...[/php] 
[script type='text/javascript']document.domain='Site A'[/script] 
Questions connexes