web-dev-qa-db-fra.com

Solution pour permettre l'entrée JavaScript mais empêcher XSS

Nous avons un système de blog simple qui permet aux utilisateurs d'entrer HTML et de JavaScript pour créer une page de blog. Je suis conscient que, permettant à JavaScript ouvrir la porte aux attaques XSS. Nous devons toutefois permettre aux utilisateurs d'insérer JavaScript, car un exmple permettrait à l'utilisateur d'insérer un code d'annonces Google qui contient JavaScript. La question est de savoir comment allumera JavaScript tout en prévenant des XSS. J'avais supposé que HTTPS sécuriserait les cookies et empêcherait le vol des cookies, mais les utilisateurs de Stackoverflow ont déclaré autrement.

15
Hussein

https est tout environ cryptage et assurer l'identité du serveur pour empêcher les autres personnes de écouter le trafic. Cela n'aide donc pas du tout contre le code javascript malveillant dans les limites de la même politique d'origine.

Il y a un drapeau sur les cookies appelé httponly qui empêche le code JavaScript simple sur le navigateur moderne d'accéder au cookie. Mais ceci ne corrige pas le problème , il fait simplement exploiter un peu moins simple: le code JavaScript peut directement déclencher des soumissions de formulaire avec les autorisations de l'utilisateur actuel. . Étant donné que le JavaScript est sur le même domaine, il a accès à CSRF jetons. Le navigateur comprendra le cookie sur la soumission de formulaire sans le code JavaScript nécessitant d'y accéder. (Et il y a un certain nombre de bogues autour de httponly, par exemple, certains navigateurs permettent de lire le cookie à partir d'un objet XMLHTTTPRequest.)

En outre, l'auteur JavaScript peut remplacer le contenu actuel de la page avec "Votre session a expiré, veuillez vous connecter à nouveau" et son formulaire de connexion . Mais la forme qu'il ajoute ne pointe pas l'URL de connexion de votre serveur mais à un serveur qu'il contrôle. Ou encore plus subtils, il peut y avoir un appel AJAX croisé dans le gestionnaire d'événements du bouton Soumettre.

Il y a une solution assez simple en deux étapes:

  1. Filtrez tous les balises non approuvées , y compris tout JavaScript. Si vous utilisez PHP, vous pouvez utiliser purificateur HTML . Il existe des bibliothèques similaires pour toutes les langues ordinaires.
  2. Fournir des espaces réservés inoffensés ("widgets"). Donc, au lieu de laisser vos utilisateurs incorporer directement le code JavaScript, ils doivent écrire quelque chose comme <div id="googleadd">identifier</div>. Un code JavaScript global de confiance peut remplacer ces fragments de code avec le code d'addition réel. Assurez-vous d'échapper correctement aux paramètres d'entrée. Cela limitera les utilisateurs un peu dans ce qu'ils peuvent faire, mais il est assez facile de couvrir tous les cas d'utilisation courants.

Il a un sens à Google un peu comme il existe déjà un certain nombre de bibliothèques de widget; Bien que la plupart d'entre eux nécessitent toujours des appels JavaScript.

12

HTTPS n'empêche pas de voler les cookies, drapeau httponly fait. Je recommanderais (s'il est possible) d'avoir une bibliothèque de "widgets", les utilisateurs peuvent inclure dans la page et configurer. Ensuite, vous pouvez simplement insérer le code JavaScript avec des paramètres configurés sans permettre à l'utilisateur d'écrire du code JavaScript.

Si vous activez vos utilisateurs à insérer leur propre code JavaScript, ils peuvent faire des choses comme la mise à jour du formulaire de connexion de votre système de blog pour envoyer des informations d'identification à un autre serveur, de sorte que si certains utilisateurs visitent la page de blog malveillante et décide de vous connecter à votre système. Sur cette page, ses informations d'identification pourraient être compromises.

9
bretik

Non, https n'arrête pas cette menace.

Si vos utilisateurs doivent être autorisés à inclure JavaScript, ils ont écrit dans la page, c'est un problème très difficile. Ce que vous voulez, c'est une sorte de Sandbox JavaScript. @ Mike Samuel's Recommandation de CAJA est un bon choix de la technologie de sandboxage JavaScript. Les autres possibilités dans cet espace incluent le webbox Web de Microsoft, Yahoo's Adsafe's Adsafe, FBJS de Facebook et probablement d'autres que j'ai manqués.

Veuillez comprendre que pendant que des solutions existent, ils ne seront pas entièrement triviaux à déployer. Vous avez trébuché sur un problème difficile dans la sécurité Web; Le Web n'a tout simplement pas été conçu pour soutenir ce genre de chose et, par conséquent, les solutions finissent nécessairement être une technologie assez complexe. Vous aurez donc probablement besoin d'une prise en charge d'un développeur capable de déployer et d'intégrer l'une de ces solutions sur votre site Web.

7
D.W.

Fiche vergogne, mais pertinente:

À partir de code.google.com/p/google-caja/

CAJA permet aux sites Web d'intégrer en toute sécurité les applications Web DHTML à partir de tiers et permet une interaction riche entre la page d'intégration et les applications incorporées. Il utilise un modèle de sécurité d'objet-capacité pour permettre une large gamme de stratégies de sécurité flexibles, de sorte que la page contenant peut contrôler efficacement les applications intégrées 'Utilisation des données utilisateur et permettre aux gadgets d'empêcher les interférences entre les éléments de l'UI de Gadgets.

6
Mike Samuel

Par définition stockant JavaScript et le rendant dans le navigateur est XSS

1) Ajouter une identité

2) Ajouter une stratégie d'utilisation: https://www.google.com/analytics/tag-manager/use-policy/

3) Je suis contre le filtrage du site du serveur Whitelisting/liste noire, car il est en cours de contournement dans le problème principal, il est difficile de faire la bonne et peut chuter l'entrée qui ne doit pas être abandonnée. Lorsque vous avez HTML5, CSS3 et JS évolueront jamais, vous devrez continuer à mettre à jour votre blancheur/liste noire jusqu'au point que le désinfectant en place devient simplement une paix en merde de code qui permet de tout autoriser et il arrivera donc à un point qui défait son objectif. , mais si vous insistez sur cette piste Owasp HTML Sanitizer, JSOUP est un autre exemple en dehors de celui mentionné ci-dessus.

4) au lieu de 3) Utilisez https://content-security-policy.com/ et prenez la prise en charge des navigateurs antiques, ce qui correspond à la bonne manière de la corriger comme sur le serveur que vous stockiez simplement du contenu mais exécuter dans le contexte du navigateur

5) Vous pouvez ajouter des tags/des espaces réservés pour réduire les risques (par exemple), cela aidera également vos outils pentesteurs à ne pas en échouer; alerte (1); Comme le serveur s'attendrait à une entrée différente afin de stocker et d'envoyer le JavaScript

6) Exécutez l'analyseur de code statique AV et fortify sur le serveur et déplacez-le sur

7) Validation intégrée pour les erreurs: JSLINT/JSHINT/CSSHINT, etc.

8) Enfin, si vous ne faites pas confiance à aucune de l'automatisation ci-dessus, ajoutez le facteur humain à examiner et à approuver la pas avant de publier

1
const

Si vous autorisez le suivi Google, vous autorisez déjà XSS, car Google-analitis est par définition un XSS.

Vous pouvez configurer un modèle dans lequel l'utilisateur ne collerait que son identifiant que vous pourriez assainir correctement.

Vous ne pouvez jamais autoriser l'entrée JavaScript et être en sécurité. Essayez de travailler avec le code ci-dessous. Pensez-vous que c'est sûr? A-t-il des mots-clés qui suggèrent un danger? :)

$=''|'',_=$+!"",__=_+_,___=__+_,($)[_$=($$=(_$=""+{})[__+__+_])+_$[_]+(""+_$[-__])[_]+(""+!_)[___]+($_=(_$=""+!$)[$])+_$[_]+_$[__]+$$+$_+(""+{})[_]+_$[_]][_$]((_$=""+!_)[_]+_$[__]+_$[__+__]+(_$=""+!$)[_]+_$[$]+"("+_+")")();

SPOILER: C'est alert(1)

1
naugtur