HP Fortify: ASP.NET. Недопустимые практики: несериализуемый объект хранится в сеансе
Метод set_UserActiveEnvironments() в HttpContextHelper.cs хранит несериализуемый объект как атрибут HttpSessionState в строке 47, что может повредить надежности приложения
По умолчанию серверы ASP.NET хранят объект HttpSessionState, его атрибуты и любые объекты, на которые они ссылаются, в памяти. Эта модель ограничивает состояние активного сеанса тем, что может быть размещено системной памятью одного компьютера. Чтобы расширить емкость за пределы этих ограничений, серверы часто настраиваются на постоянную информацию о состоянии сеанса, что одновременно увеличивает емкость и позволяет репликацию на несколько компьютеров для повышения общей производительности. Чтобы сохранить свое состояние сеанса, сервер должен сериализовать объект HttpSessionState, который требует, чтобы все хранящиеся в нем объекты были сериализуемыми.
Почему это проявляется как уязвимость, и как я могу это исправить?
2 ответа
Моханрадж, возможно, вы уже нашли решение, но ниже приведено правдоподобное объяснение:
Есть некоторые ложные срабатывания, которые указывает HP Fortify, и именно поэтому вам нужно анализировать от случая к случаю каждую уязвимость, которую он указывает вам, и именно поэтому у него есть классификационный список для анализа, если обнаруженная уязвимость представляет собой реальную угрозу или ложный позитив.
В этом конкретном случае, чтобы излечить уязвимость, вам просто нужно украсить класс, который вы пытаетесь перенести / отправить в Session, как [Serializable], что настоятельно рекомендуется при использовании сеанса для хранения данных внутри вашего приложения.
Ознакомьтесь с этой статьей Пита Обермейера и Джонатана Хокинса, в которой лучше объясняется использование сериализации.
Надеюсь это поможет.
Я думаю, что Fortify неверно истолковывает set_accessor_declaration
в C#. Находка выглядит так, как будто Fortify не может связать тип value
Ключевое слово для типа собственности.
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes
Попытка интерпретировать обнаружение так, как будто самому свойству Session нужен атрибут Serializable, кажется неверно направленной. В статье с практическими рекомендациями по различным режимам сериализации в ASP.NET рассказывается, что сериализация сеансов применяется к содержимому свойства Session, а не к свойству в целом.
https://www.codeproject.com/Articles/32545/Exploring-Session-in-ASP-Net