Строка не сериализуема по умолчанию в. Net Core? - PullRequest
0 голосов
/ 08 мая 2020

Я просматриваю отчет о сканировании c анализа безопасности Fortify stati (SAST) в другом для выявления и подавления ложных срабатываний. Фреймворк приложения - C#. NET Core. Отчет SAST частично гласит:

"Method1 () сохраняет несериализуемый объект как атрибут HttpSessionState в строке 111, что может нанести ущерб надежности приложения. Сохранение несериализуемого объекта как атрибута HttpSessionState может повредить надежность приложения "

Код в строке 111 выглядит так:

Session[key] = Request.QueryString["abcd"];

Я собирался подавить проблему как ложное срабатывание, потому что мы храним строковые объекты, а строки по умолчанию сериализуемы. Но затем я исследовал и обнаружил, что «строка по умолчанию сериализуема» верна только в. NET framework, потому что определение строки украшено атрибутом Serializable в .NET; тогда как в. NET определение основной строки не украшено атрибутом Serializable.

Итак, поскольку это приложение. NET Core, правильно ли утверждение Fortify SAST? Строка не сериализуема по умолчанию в ядре. NET? Ваше понимание будет оценено по достоинству. Спасибо.

1 Ответ

0 голосов
/ 08 мая 2020

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

Оригинал. NET Framework документация по сериализации указывает, что объект в целом помечен атрибутом [Serializable], а не свойство внутри него (ваша строка) в этом случае, но сам он не обращается напрямую к струны.

Тем не менее, похоже, что исходная версия. NET Core фактически не поддерживала атрибут [Serializable] для двоичной сериализации до. NET Core 2.0. Однако в этом выпуске вы можете прочитать документацию , в которой System.String упоминается как поддерживаемый сериализуемый тип, хотя он по-прежнему рекомендует использовать другие платформы сериализации (см. Абзац под предупреждением в верхней части этой страницы) .

Основная документация. NET по сериализации разделена на несколько разных статей, но, опять же, вы можете увидеть, что в документе Basi c Serialization это снова указывает на то, что сам класс отмечен (а не свойство строки, хотя в примере оно имеет одно), но также указывает, что он будет успешно сериализован.

Согласно последней цитате:

[Serializable]  
public class MyObject {  
  public int n1 = 0;  
  public int n2 = 0;  
  public String str = null;  
}  

И logi c из тех документов, которые будут записывать строку в соответствующее свойство и соответственно сериализовать.

MyObject obj = new MyObject();  
obj.n1 = 1;  
obj.n2 = 24;  
obj.str = "Some String";  
IFormatter formatter = new BinaryFormatter();  
Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);  
formatter.Serialize(stream, obj);  
stream.Close();

Таким образом, я бы сделал вывод, что это действительно ложное срабатывание, пока вы используете. NET Core 2.0, NET Standard 2.0 или новее с двоичной сериализацией и маркировкой этого класса используется внутри с атрибутом [Serializable]. В противном случае проверьте требования инфраструктуры сериализации, которую вы используете, чтобы узнать, нужно ли ей какое-либо такое оформление атрибутов (например, Newtonsoft. Json не требует атрибутов [JsonProperty] в свойствах, если вы не хотите указывать пользовательские имена для сериализованные свойства, и ему не нужны никакие атрибуты в самом классе).

...