2010-12-08 25 views
1

J'ai toujours eu ce problème à l'esprit et toujours allé avec la solution la plus facile de le faire sur le serveur. Cependant, j'ai décidé que je peux demander plus de gens à ce sujet, peut-être l'un des éclairés peut m'aider avec une solution fiable.Communication fiable entre votre serveur et le navigateur?

Problème: vous développez une application Web qui héberge de nombreux utilisateurs. Une partie des fonctionnalités que vous proposez consiste à appeler une API externe. Cet appel est fait pour chaque utilisateur. L'appel peut être fait soit par votre serveur ou le JavaScript du navigateur. Dans les deux cas, vous persistez le résultat du traitement des données de l'appel d'API dans la base de données du serveur. Je voudrais décharger appelant l'API et traitant les résultats au JavaScript du navigateur et après qu'il se termine il appellera le serveur avec les données pour persister. Le problème que je vois avec cette approche est que n'importe qui peut modifier le comportement de ce JavaScript (à quel point il est facile à firebug et ses goûts) de persister des données malveillantes/incorrectes sur le serveur. Comment puis-je - le serveur - croire que les données provenant de JavaScript - suivant le scénario précédent - sont correctes et non altérées?

Répondre

1

Si vous souhaitez créer des données sur le serveur A, donnez-le à un client et demandez à ce client de le transmettre au serveur B verbatim, il vous suffit alors d'inclure un hachage anti-sabotage. Les serveurs A et B partagent un secret qu'ils utilisent comme sel. Comme le client ne connaît pas ce sel, il est incapable de fabriquer des données authentiques pour lui-même.

Notez qu'à elle seule, cette technique donne seulement un fort degré de confiance que le serveur A est à l'origine des données. Il y a d'autres vulnérabilités que vous devrez peut-être prendre en compte, telles que les attaques de relecture de vieilles données, etc.

+0

Si je comprends bien, le serveur A et le serveur B devront toujours inclure le hachage anti-sabotage avec javascript étant seulement un intermédiaire qui transmet les messages? ... le truc, c'est tout ce que vous avez créé le hachage anti-sabotage ... parce que je supposais que javascript obtiendrait quelques résultats d'un appel API ... le traiter, puis transmettre les résultats ... Votre solution est parfaite si aucun traitement JavaScript n'est impliqué au milieu. .. javascript agit juste comme un transitaire ... J'aime cette solution – humanzz

+0

C'est correct. Si vous avez le côté client qui transforme les données, vous devez opérer sous l'hypothèse que les données sont corrompues et éventuellement malveillantes. À peu près ce que Nick Craver affirme dans l'autre réponse. –

5

La réponse simple est vous ne pouvez pas, JavaScript est le mécanisme le moins sécurisé dans le pipeline - le plus facile à manipuler. Si vous voulez que ce soit sécurisé, vous devez jamais compter sur JavaScript pour cela. Pensez-y dans un sens plus général: vous pouvez seulement sécuriser un environnement que vous contrôlez au moins un peu ... vous avez aucun contrôle sur le navigateur, le moteur JavaScript ou l'utilisateur qui le manipule.

Toujours valider côté serveur, toujours, toujours, toujours.

+0

Je suis sûr que vous ne "comptez jamais sur JavaScript" !? – aefxx

+0

@aefxx - Je voulais dire "faire quelque chose de sécurisé" ... clarifié :) –

+0

aefxx soulignait votre faute de frappe: "Si vous voulez que ce soit sécurisé, vous devriez * toujours * compter sur JavaScript pour cela." – Gareth