2010-08-20 6 views
1

Je travaille sur l'implémentation d'un bug web JavaScript qui sera inséré dans les pages web de nos clients. L'une des fonctionnalités que nos clients aimeraient, est un moyen de transmettre des éléments du code HTML sur leurs pages Web à notre serveur via le bug Web. Nous utilisons JSONP et le serveur hébergeant le bogue web JavaScript est différent du serveur hébergeant la page we. L'idée de base est la suivante:Puzzle de sécurité JavaScript avec XSS

var element = document.getElementById(id); 
var html = element.innerHTML; 
//Encodes HTML into GET request www.example.com/script?html=encodedhtml 
var url = getSrcUrl(html); 
document.write(unescape("%3Cscript src='" + url + "' type='text/javascript'%3E%3C/script%3E")); 

Le problème de sécurité est que tout le monde peut faire une demande de se rendre à notre serveur avec HTML arbitraire qui ne provient pas de la page Web qui héberge le bug Web. Y a-t-il un moyen de sécuriser cela? Je sais que nous pouvons vérifier les en-têtes HTTP pour le référent, mais cela peut facilement être falsifié. J'ai vu quelques idées où le serveur a passé un jeton unique qui devait être retourné dans la requête GET, mais il semble que cela pourrait aussi être falsifié. Mon intuition est que ce que nous essayons de faire ne peut pas être fait en toute sécurité, mais je voulais le lancer à la communauté pour voir s'il y a quelque chose d'intelligent qui peut être fait. Sinon, je vais devoir construire un scraper d'écran qui télécharge les pages directement à partir de nos clients et extrait le code HTML correspondant à leur page.

Merci pour toute aide!

EDIT

Pour être clair, les pages web de nos clients sont orientés public sans sécurité. En d'autres termes, n'importe quel internaute peut visiter la page et exécuter le bogue JavaScript qui soumet le fragment HTML.

EDIT 2

Une réponse acceptable est "ce qui est impossible"! Si tel est le cas, et vous donnez une bonne explication de pourquoi, je vais le choisir comme la réponse acceptée.

EDIT 3

Ce que nous construisons est une sorte de système Google Analytics pour nos clients. Nous essayons de suivre les visites d'objets uniques par chaque visiteur, puis de collecter automatiquement des informations sur cet élément via le fragment HTML. Nous allons ensuite insérer des informations sur l'élément sur d'autres pages en injectant le fragment HTML que nous avons collecté à partir de l'élément d'origine. Nous essayons de faire tout cela sans exiger de nos clients d'installer quoi que ce soit sur leurs serveurs et en incluant simplement un bug web JavaScript dans leur code HTML.

+0

Que faites-vous avec le HTML? – Quentin

+0

Les fragments HTML seront éventuellement injectés dans d'autres pages Web. Une vraie recette pour un désastre XSS si nous ne le faisons pas en toute sécurité! – user27478

+0

Dans quelles conditions? Cela nous aiderait probablement à comprendre le problème si vous preniez du recul et expliquiez ce que vous essayiez d'accomplir plutôt que la façon dont vous essayiez de l'atteindre. – Quentin

Répondre

1

Si vous voulez vous assurer que quelque chose n'a pas été falsifié, il ne peut pas passer par le client non crypté.

Les seules façons de le faire sont en toute sécurité à:

  • Comme vous le suggérez, récupérer le côté serveur page appropriée

ou

  • Crypter/signer le code HTML avant va au client en utilisant une clé inconnue, de sorte que le client ne peut pas le modifier
+0

Votre deuxième idée est intelligente. Je vais devoir réfléchir à la façon dont cela pourrait fonctionner dans notre système ... – user27478

1

En supposant que vous puissiez obtenir le serveur Web de votre client pour md5 quelque chose pour vous, cela semble être un bon endroit pour utiliser une signature md5-hashed. Essentiellement, le serveur client détermine les informations qu'il souhaite vous envoyer, les concatène toutes en une chaîne, les concatène avec une clé secrète, puis md5 le tout, et transmet le résultat avec tout le reste de son entrée.

Sur votre serveur, vous prenez toutes les données à l'exception de la signature, la concaténez ensemble, concaténez la clé secrète sur celle-ci et md5 it. Si elle correspond à la signature, vous savez que c'est une entrée valide. Malheureusement, il semble que vous êtes en train de déterminer le code HTML à envoyer du côté client (navigateur). En raison du fait que JavaScript est clairement visible à tous, vous ne pouvez pas vraiment utiliser une chaîne secrète. Donc, à moins qu'il soit possible de déplacer ce type de traitement vers le serveur, je pense que vous n'avez pas de chance.

+0

Pourquoi les gens suggèrent toujours MD5 pour les hachages sécurisés? – Borealid

+0

Parce que c'est ce à quoi nous nous sommes tous habitués. Si ce n'est pas assez sécurisé pour vous, utilisez autre chose. –

+0

Ceci est vraiment largement mal compris. MD5 dans ce cas est bien. Parce qu'il a été démontré que vous pouvez créer deux documents avec le même hachage MD5, vous ne devriez pas faire confiance aux hachages MD5 pour vérifier les documents que vous n'avez pas créés vous-même (les auteurs ont pu produire deux versions du fichier, un bon et le autre mal). Mais si vous avez vous-même créé à la fois la chaîne et le hachage, ce risque est fondamentalement nul. Si vous utilisez un sel assez long, vous pouvez vous défendre contre les attaques arc-en-ciel. Et si vous incluez un horodatage et changez votre sel régulièrement, vous pouvez résister aux attaques par force brute. – Andrew