2010-10-29 14 views
2

L'extrait suivant a fonctionné pour la validation des extraits html entrés par l'utilisateur depuis des années, maintenant, au cours des dernières heures, il a commencé à tout rejeter.Pourquoi cette méthode de validation rejette-t-elle maintenant tous nos html

public override bool IsValid(object value) 
{ 
    var isValid = true; 
    try 
    { 
     var doc = new XmlDocument(); 
     doc.LoadXml(string.Format(@" 
      <!DOCTYPE html [<!ENTITY % xhtml-lat1 SYSTEM ""http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent""> 
      <!ENTITY % xhtml-special SYSTEM ""http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent""> 
      <!ENTITY % xhtml-symbol SYSTEM ""http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent""> 
      %xhtml-lat1; 
      %xhtml-special; 
      %xhtml-symbol;]> 
      <html>{0}</html>", value)); 
    } 
    catch (XmlException) 
    { 
     isValid = false; 
    } 
    return isValid; 
} 
+0

Pouvez-vous fournir l'exception complète qu'il lance? En outre, certains exemples HTML qui maintenant vous donne une erreur. –

Répondre

4

Il est mauvais de télécharger la DTD de w3.org chaque fois que vous avez besoin de valider un document. Leurs serveurs sont lourdement chargés et il leur coûte très cher de payer toute la bande passante, les serveurs et les informaticiens pour tout gérer. Il a toujours été mauvais de télécharger la DTD de manière excessive (par opération), et jusqu'à récemment, W3 se basait sur la politesse des développeurs de logiciels et des éditeurs pour écrire leurs programmes de manière à ne pas télécharger la DTD par opération.

Cependant, cette dépendance aux bonnes manières ne fonctionne plus. Récemment W3 has been taking matters into its own hands en bloquant les téléchargements DTD basés sur les règles de correspondance des agents utilisateurs, ainsi que d'autres règles de blocage comme le blocage IP pour les délinquants particulièrement mauvais. Depuis cette annonce, ils se sont sentis libres d'introduire de nouvelles règles de blocage comme ils le jugent nécessaire, sur la base, par exemple, de observer les tendances du trafic. Il n'est pas déraisonnable de penser qu'une récente mise à jour de leurs règles de blocage a pu affecter votre logiciel. Très récemment, je crois qu'ils ont commencé à bloquer les téléchargements DTD avec une correspondance de chaîne d'agent utilisateur très large: agents d'utilisateur Internet Explorer, agents d'utilisateur Java et agents d'utilisateur .NET, pour n'en nommer que quelques-uns.

Vous ne devez télécharger la DTD qu'une seule fois et demander à votre validateur de référencer la DTD du disque local, ou au moins d'héberger la DTD en utilisant votre propre serveur et votre propre bande passante. Tous les analyseurs valent la peine features to help re-map "DTD namespace" to "physical DTD location."

De nombreux utilitaires XML ont la possibilité d'utiliser un XML catalog pour mapper des URI pour des ressources externes à une copie des fichiers localement mise en cache. Pour plus d'informations sur la configuration des applications XML pour utiliser un catalogue, voir l'article Norman Walsh's Caching in with Resolvers ou Catalog support in libxml, et n'oubliez pas d'utiliser Google pour plus d'informations!

Notez également others ont recently started encountering problèmes avec w3.org, DTD, .NET et IE.

+1

ce premier lien est une bonne lecture – mike

1

Il ne peut pas être la faille, mais un défaut que je vois tout de suite que vous dépendez lors de la connexion avec succès sur le site du W3C et le téléchargement des fichiers d'entités. Si cela échoue, alors vous obtiendrez un XmlException que vous supposez signifie un échec avec la validation elle-même, et même pas en regardant.

C'est également un gaspillage pour vos ressources et un peu impoli au W3C d'ajouter aux 130 millions de requêtes inutiles par jour complained about nearly three years ago. Si j'imagine quoi que ce soit, malgré cette plainte, le nombre de demandes aux DTD, aux entités, aux schémas XML et même au déréférencement des noms d'espace de noms a probablement augmenté depuis.

Utilisez une copie locale des entités; c'est clairement permis dans la licence du MIT, ils sont libérés sous.

Également, essayez d'être plus explicite en examinant l'exception soulevée ici.