2010-01-20 16 views
1

Y a-t-il des problèmes avec ce que je fais ici? C'est la première fois que je fais face à quelque chose comme ça, et je veux juste m'assurer de comprendre tous les risques, etc., pour différentes méthodes. J'utilise WMD pour obtenir l'entrée de l'utilisateur, et je l'affiche avec un contrôle littéral. Comme il est entré une fois non modifiable j'entreposez le code HTML et non le Markdown,Liste blanche, prévention XSS avec contrôle WMD en C#

input = Server.HTMLEncode(stringThatComesFromWMDTextArea) 

Et puis exécutez quelque chose comme ce qui suit pour les balises que je veux que les utilisateurs puissent utiliser.

// Unescape whitelisted tags. 
string output = input.Replace("&lt;b&gt;", "<b>").Replace("&lt;/b&gt;", "</b>") 
        .Replace("&lt;i&gt;", "<i>").Replace("&lt;/i&gt;", "</i>"); 

Modifier Voici ce que je fais actuellement:

public static string EncodeAndWhitelist(string html) 
{ 
    string[] whiteList = { "b", "i", "strong", "img", "ul", "li" }; 
    string encodedHTML = HttpUtility.HtmlEncode(html); 
    foreach (string wl in whiteList) 
     encodedHTML = encodedHTML.Replace("&lt;" + wl + "&gt;", "<" + wl + ">").Replace("&lt;/" + wl + "&gt;", "</" + wl + ">"); 
    return encodedHTML; 
} 
  1. Est-ce que ce que je fais ici me tenir protégé de XSS?
  2. Y a-t-il d'autres considérations à faire?
  3. Y a-t-il une bonne liste de balises normales à la liste blanche?
+0

Ce code ne fonctionnera pas pour la balise "IMG" puisque le remplacement de "<img>" ne permet pas l'attribut "src" " – David

Répondre

2

Si vos besoins sont vraiment basiques que vous pouvez faire de simples remplacements de chaînes, alors oui, ceci est 'sûr' contre XSS. (Cependant, il est encore possible de soumettre du contenu non bien formé où <i> et <b> sont mal emboîtés ou non fermées, ce qui pourrait gâcher la page le contenu finit insérés dans.)

Mais cela suffit rarement. Par exemple actuellement <a href="..."> ou <img src="..." /> ne sont pas autorisés. Si vous vouliez autoriser ces balises ou d'autres avec des valeurs d'attribut, vous auriez encore beaucoup de travail à faire. Vous pouvez alors l'approcher avec regex, mais cela vous donne des problèmes sans fin avec l'imbrication accidentelle et le remplacement du contenu déjà remplacé, vu que regex ne peut pas analyser HTML, et cela. Pour résoudre ces deux problèmes, l'approche habituelle consiste à utiliser un parseur [X] [HT] ML sur l'entrée, puis à parcourir le DOM en supprimant tous les éléments et attributs, sauf ceux connus, puis enfin en re-sérialisant [X HTML. Le résultat est alors garanti bien formé et ne contient que du contenu sûr.

+0

Donc, en supposant que je voulais quelque chose de plus robuste, que suggéreriez-vous pour le – Jason

+0

Oui, HTML Agility Pack est un bon choix. fonction récursive qui supprime tous les éléments/attributs de l'arborescence DOM sauf si vous autorisez 'href' /' src'/etc., n'oubliez pas de vérifier les URL pour les schémas connus comme 'http' /' https' , pour éviter les injections via les URL "javascript:" et autres. – bobince