2017-05-24 1 views
5

J'ai deux sous-domaines content et www sous le domaine example.com. Le contenu de content.example.com est présenté en www.example.com via un iframe.Implications sur la sécurité pour la définition de document.domain dans le contenu iframed

Parce que le contenu des content.example.com doit communiquer à www.example.com J'ai mis document.domain="example.com" et également mis en allow-scripts et allow-same-origin sur le iframe. Je crains que si les utilisateurs peuvent télécharger le contenu à afficher dans l'iframe, cela pourrait être exploitable, c'est-à-dire envoyer le contenu des cookies à un domaine distant pour détourner la session ou d'autres exploits de sécurité.

J'ai configuré un autre domaine, www.example2.com et de mettre une requête AJAX dans le contenu iframed à content.example.com pour tester ma théorie et j'envoie document.cookie au domaine distant. Cela entraîne l'envoi des cookies _ga au domaine distant. J'ai autorisé header('Access-Control-Allow-Origin: *') sur le domaine distant afin qu'il ne provoque aucun problème.

Pourquoi seuls les cookies _ga sont-ils envoyés? J'ai un certain nombre d'autres cookies sur le même domaine et le même chemin que les cookies _ga mais ils ne sont pas envoyés. Y a-t-il d'autres risques pour la sécurité? Idéalement, je voudrais seulement que la communication entre content.example.com et www.example.com et il semble que c'est la plupart du temps le faire, à l'exception des cookies de Google Analytics, ce qui signifie que d'autres pourraient être en mesure de le faire aussi.

+0

_Je ont deux domaines, 'content.example .com' et 'www.example.com'_' content.example.com' est un sous-domaine de 'example.com' –

+0

ouais désolé, j'ai deux sous-domaines. – Rudiger

+0

pour accéder à un cookie de domaine à partir d'un sous-domaine, vous n'avez pas à aller trop lourd. C'est facile tâche –

Répondre

0

Vous pouvez utiliser JSONP pour communiquer différents domaines, quels que soient les paramètres et les stratégies interdomaines.

Toutefois, JSONP nécessite que le côté serveur crée la fonction de rappel avec les données renvoyées en tant que paramètre.

Je suggérerais de charger du contenu Javascript simple à partir du serveur, qui a la même indépendance et la même sécurité interdomaines qu'une requête JSON.

Supposons que vous avez un fichier Javascript, data.js, dans content.example.com, ou un service de retour le même contenu que le fichier dans la réponse, avec un objet JSON, préfixé avec une affectation de variable:

result = { 
    "string1": "text1", 
    "object1": { 
    "string2": "text2", 
    "number1": 5.6 
    }, 
    "number2": 7, 
    "array1": ["text3", "text4"] 
} 

Ensuite, , dans votre page Web, en www.example.com, vous pouvez avoir un script avec la fonction loadJS, qui charge la réponse du serveur en tant que script:

var loadJS = function (url, callback) { 
    var script = document.createElement('script'); 
    script.type = "text/javascript"; 
    script.src = url; 
    script.onload = function (ev) { 
    callback(window.result); 
    delete window.result; 
    this.parentNode.removeChild(this); 
    }; 
    document.body.appendChild(script); 
}; 

window.onload = function() { 
    loadJS('http://content.example.com/data.js', function (data) { 
    console.log(data); 
    }); 
}; 

La même fonction peut être utilisée dans content.example.com pour les demandes dans la direction opposée.

Pour définir des cookies ou d'effectuer toute autre fonctionnalité disponible dans JS, le script de réponse, data.js, peut contenir une fonction plutôt qu'un objet JSON:

result = (function() { 
    document.cookie = "cookie1=Value1; cookie2=Value2;"; 
    return true; 
})(); 
+0

Je suis un peu perdu avec votre réponse. L'attaquant ne pourra pas contrôler le contenu dans le parent de l'iframe, donc il ne pourra pas y ajouter de javascript (loadJS). De mon utilisation précédente de JSONP, il est toujours lié aux mêmes règles qu'une requête AJAX standard en ce qui concerne l'accès aux cookies mais il peut aider avec la communication du serveur où vous pourriez ne pas avoir le contrôle total du serveur et votre obtenir cross Préventions de script de site parce que la réponse d'en-tête ne le permettra pas. Est-ce correct? – Rudiger

+0

Non JSONP ni JS sont liés aux mêmes règles que AJAX. Vous pouvez charger un objet JSON avec AJAX, mais vous aurez le problème interdomaine, et, plus important encore, en termes de sécurité, le contenu reçu est visible dans le document de destination, alors que JSONP et JS, chargés en scripts, sont en sandbox , c'est-à-dire exécuté mais non lisible, raison pour laquelle ils ne sont pas soumis à la restriction inter-domaine. –

+0

Quoi qu'il en soit, ce n'est qu'une suggestion pour réaliser une communication sécurisée entre domaines de la manière la plus simple. Des solutions plus élaborées nécessiteront de solides techniques de chiffrement client-serveur. –