Почему этот метод проверки теперь отклоняет все наши HTML - PullRequest
2 голосов
/ 30 октября 2010

Следующий фрагмент работал для проверки введенных пользователем фрагментов 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;
}

Ответы [ 2 ]

4 голосов
/ 30 октября 2010

Неправильно загружать DTD с w3.org каждый раз, когда вам нужно проверить документ.Их серверы находятся под чрезвычайно тяжелой нагрузкой, и им очень дорого платить за всю пропускную способность, серверы и ИТ-специалистов, чтобы управлять всем этим.Всегда было плохой формой загружать DTD чрезмерно (для каждой операции), и до недавнего времени W3 полагался на вежливость разработчиков и поставщиков программного обеспечения при написании своих программ таким образом, чтобы не загружать DTD для каждой операции.

Однако эта уверенность в хороших манерах больше не работает.В последнее время W3 берет дело в свои руки , блокируя загрузку DTD на основе правил сопоставления User Agent, а также других правил блокировки, таких как блокировка на основе IP, для особо злостных нарушителей.После этого объявления они могут свободно вводить новые правила блокировки, которые они считают необходимыми, например, на основе наблюдения за тенденциями движения.Весьма разумно думать, что недавнее обновление их правил блокировки могло повлиять на ваше программное обеспечение.Совсем недавно я полагаю, что они начали блокировать загрузку DTD с очень широким соответствием строк User Agent: пользовательские агенты Internet Explorer, пользовательские агенты Java и пользовательские агенты .NET, если назвать несколько.

Вы должны загрузить DTD только один раз.и ваш валидатор должен ссылаться на DTD с локального диска или, по крайней мере, разместить DTD, используя свой собственный сервер и пропускную способность.Все парсеры, которые стоят чертовски, имеют функций, помогающих переназначить «пространство имен DTD» на «физическое местоположение DTD».

Многие утилиты XML имеют возможность использовать каталог XML для сопоставления URI внешних ресурсов с локальной кешированной копией файлов.Дополнительную информацию о настройке приложений XML для использования каталога см. В статье Кэширование Нормана Уолша с помощью резольверов , статья или Поддержка каталога в libxml , и не забывайте использовать Google для получения дополнительной информации.!

Также обратите внимание, другие имеют , недавно начали сталкиваться с проблемами с w3.org, DTD, .NET и IE.

1 голос
/ 30 октября 2010

Возможно, это не недостаток , но я сразу вижу один недостаток: вы зависите от успешного подключения к сайту W3C и загрузки файлов сущностей. Если это не удастся, то вы получите XmlException, что, как вы предполагаете, означает ошибку с самой проверкой, и даже не глядя на нее.

Это также расточительно для ваших ресурсов и немного грубо для W3C добавлять к 130 миллионам ненужных запросов в день, на которые они жаловались почти три года назад . Во всяком случае, я бы предположил, что, несмотря на эту жалобу, число запросов к DTD, объектам, XML-схемам и даже разыменование имен пространств имен, вероятно, увеличилось с тех пор.

Использовать локальную копию сущностей; это вполне ясно разрешено в лицензии MIT, под которой они выпущены.

Кроме того, постарайтесь быть более явным при рассмотрении возникшего здесь исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...