Предупреждение «Небезопасная перегрузка» - PullRequest
0 голосов
/ 05 декабря 2018

У меня следующий код:

using (FileStream fs = new FileStream(path_to_xml, FileMode.Open))
{
    using (XmlReader xr = XmlReader.Create(fs))
    {
        // Do something with xr
    }
}

, и я получаю предупреждение

CA3075: небезопасная перегрузка XmlReader.Create, которая не принимает аргумент XmlReaderSettings

Если я изменю оператор Create и добавлю XmlReaderSettings, например, так:

using (XmlReader xr = XmlReader.Create(fs, new XmlReaderSettings()))

Я получу предупреждение

CA3075: потенциально небезопасный экземпляр XmlReaderSettings предоставляетсяМетод XmlReader.Create.

Какова действительная причина этого предупреждения и как правильно его устранить?

Я использую VS 2019 Preview 1.0

Я никогда раньше не видел это предупреждение, и, возможно, оно новое с VS 2019?

ОБНОВЛЕНИЕ: я уже посмотрел эту страницу https://docs.microsoft.com/en-us/visualstudio/code-quality/ca3075-insecure-dtd-processing?view=vs-2017, и большинство решений говорят, чтобы установить'XmlReaderSettings () {DtdProcessing = DtdProcessing.Prohibit}', и я все еще получаю предупреждение.

1 Ответ

0 голосов
/ 05 декабря 2018

Глядя на документацию предупреждения , объясняется основная причина и множество возможных исправлений, но сводится к тому, что читаемый XML-файл может содержать ссылки DTD на потенциально небезопасные места, а тщательно созданный документ может представлятьуязвимость.Из документов:

Если вы используете небезопасные экземпляры DtdProcessing или ссылаетесь на внешние источники данных, анализатор может принимать ненадежные входные данные и раскрывать конфиденциальную информацию злоумышленникам.

Проблема заключается вв том, что настройки по умолчанию обоих классов XmlReader и XmlReaderSettings допускают такое поведение.Так как по умолчанию возникает эта проблема, вам нужно явно установить безопасный параметр, который в конечном итоге сводится к установке DtdProcessing на DtdProcessing.Prohibit или XmlResolver на XmlSecureResolver.

Вернуться к вашему коду, его можно изменить следующим образом:

using (XmlReader xr = XmlReader.Create(fs, new XmlReaderSettings() { DtdProcessing = DtdProcessing.Prohibit }))

или

using (XmlReader xr = XmlReader.Create(fs, new XmlReaderSettings() { XmlResolver = new XmlSecureResolver() }))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...