Je viens d'essayer ma solution XElement.Parse. J'ai créé une méthode d'extension de la classe de chaîne pour que je puisse réutiliser le code facilement:
public static bool ContainsXHTML(this string input)
{
try
{
XElement x = XElement.Parse("<wrapper>" + input + "</wrapper>");
return !(x.DescendantNodes().Count() == 1 && x.DescendantNodes().First().NodeType == XmlNodeType.Text);
}
catch (XmlException ex)
{
return true;
}
}
Un problème que j'ai trouvé que esperluette texte brut et moins de caractères provoquent une XmlException et indiquent que le champ contient HTML (qui est faux). Pour corriger cela, la chaîne d'entrée transmise en premier doit avoir les esperluettes et moins que les caractères convertis en leurs entités XHTML équivalentes.J'ai écrit une autre méthode d'extension pour le faire:
public static string ConvertXHTMLEntities(this string input)
{
// Convert all ampersands to the ampersand entity.
string output = input;
output = output.Replace("&", "amp_token");
output = output.Replace("&", "&");
output = output.Replace("amp_token", "&");
// Convert less than to the less than entity (without messing up tags).
output = output.Replace("< ", "< ");
return output;
}
Maintenant, je peux prendre une chaîne fournie par l'utilisateur et vérifier qu'il ne contient pas de HTML en utilisant le code suivant:
bool ContainsHTML = UserEnteredString.ConvertXHTMLEntities().ContainsXHTML();
Je ne suis pas sûr si c'est une preuve de balle, mais je pense que c'est assez bon pour ma situation.
Pour ce faire, vous allez probablement devoir définir ce que vous entendez par « HTML » et « texte brut », par exemple: Allez-vous permettre à quelqu'un de mettre « » dans le texte, qui regarde * comme * un élément HTML mais n'est pas, et aussi, quels caractères autoriserez-vous .. –
Rob
Dans mon cas, je vais bien dire pas de balises du tout, donc ne serait pas autorisé. Mes utilisateurs sont un nombre limité d'employés qui entrent des produits sur le site Web de notre entreprise. Ils ont commencé à abuser un peu des champs et à inclure du HTML dans des champs qui n'étaient pas conçus pour contenir du HTML. –