Question

Y a-t-il des problèmes avec ce que je fais ici? Ceci est ma première fois pour faire face à quelque chose comme ça, et je veux juste assurer que je comprends tous les risques, etc. à des méthodes différentes.

J'utilise des ADM pour obtenir l'entrée d'utilisateur, et je l'afficher avec un contrôle littéral. Comme il est entré une fois non modifiable j'entreposez le code HTML et non le Markdown,

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 garder protégé de XSS ?
  2. Y at-il d'autres considérations qui devrait être fait?
  3. Y at-il une bonne liste de la normale balises à une liste blanche?
Était-ce utile?

La solution

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

Mais cela suffit rarement. Par exemple <a href="..."> actuellement ou <img src="..." /> ne sont pas autorisés. Si vous vouliez permettre à ceux-ci ou d'autres balises avec des valeurs d'attribut, vous auriez plus de travail à faire ensemble beaucoup. Vous pourriez alors approcher avec regex, mais qui vous donne des problèmes sans fin avec l'imbrication accidentelle et le remplacement du contenu déjà remplacé, car comment regex ne peut pas analyser HTML, et que.

Pour résoudre les problèmes, l'approche habituelle est d'utiliser un [X] [HT] analyseur ML sur l'entrée, puis marcher le DOM enlever tous, mais en bon état des éléments et attributs, puis finalement re-serialise à [X] HTML. Le résultat est alors garanti bien formé et ne contient que du contenu en toute sécurité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top