2010-01-08 3 views
6

Dans le but d'empêcher les attaques XSS, je suis en train de mettre à jour une page dans laquelle nous avons une zone de texte acceptant le HTML, la stocke dans une base de données et la restitue plus tard.Utilisation de la bibliothèque MS Anti XSS pour la désinfection HTML

Ma compréhension est que je peux assainir le HTML en utilisant la méthode AntiXSS.GetSafeHtmlFragment(). Tant que je le fais avant de stocker le code HTML dans la base de données, suis-je couvert? Ai-je besoin de faire quoi que ce soit lorsque le HTML est sorti sur une page Web?

En outre, il semble que la liste blanche est une sorte de boîte noire. Existe-t-il un moyen de mettre à jour ceci en fonction de nos exigences?

Répondre

4

Vous devez définir. Bien que, évidemment, cela ne vous protégera pas de quelque chose déjà dans la base de données.

Vous pouvez utiliser AntiXSS.GetSafeHtmlFragment() lors de la sortie de la page au lieu de l'enregistrer. Mais quand on économise, c'est probablement plus sûr. Vous ne voudriez pas le faire à la fois pendant le rendu et la sauvegarde.

La liste blanche n'est pas modifiable.

+0

Malheureusement, AntiXSS.GetSafeHtmlFragment() tourné pour être vulnérables en version plus ancienne et inutile en version plus récente (elle bandes presque toutes les balises HTML possibles). – BornToCode

1

Vous y êtes presque. Vous devez vous assurer que you choose the proper encoding. Par exemple, si l'entrée de l'utilisateur est entrée dans une URL, vous devrez utiliser AntiXSS.UrlEncode(), et si elle est entrée dans JavaScript, vous voudrez utiliser AntiXSS.JavaScriptEncode(). Si vous ne pouvez pas garantir que le format de sortie sera sauvegardé, il est préférable de procéder à la désinfection au moment de la sortie.

+0

... se souvenir de désinfecter pour SQL Injection –

+0

Donc, si l'utilisateur entre HTML que je désinfecte en utilisant GetSafeHtmlFragment, je devrais alors creuser throgh toutes les URLs (un href) et le code JS et passer par AntiXSS.UrlEncode et AntiXSS. JavaScriptEncode? – Nick

+0

Vous devez échapper la sortie pour le contexte dans lequel il va être utilisé. En général, les gens accomplissent cela en utilisant un système de gabarit qui autoreproduit les choses à la sortie, au lieu de vérifier individuellement chaque champ. Lisez tout l'article que j'ai lié, il devrait aider: http://msdn.microsoft.com/en-us/library/aa973813.aspx – Annie

3

En ce qui concerne votre question à propos de "boîte noire": oui, c'est une boîte noire, et je crois que vous ne pouvez pas l'éditer. Si vous cherchez plus de granularité, consultez le AntiSamy.NET project.

Questions connexes