Устранит ли проблемы с безопасностью добавление префикса пространства имен к Type.GetType()?

Меня интересует безопасность использования Type.GetType() для ненадежного ввода.

У меня есть несколько классов в пространстве имен A.B.C.Events, и я хотел бы иметь возможность десериализовать их с помощью System.Text.Json.

это то, чем я сейчас занимаюсь

var type = Type.GetType($"A.B.C.Events.{TypeName}");

Сталкиваюсь ли я с известными проблемами использования Type.GetType(), если я делаю префикс, как указано выше?


person Nordfjord    schedule 28.12.2020    source источник
comment
Существует ли какой-либо белый список? Вы ограничиваете символы допустимыми именами типов С# (только буквенно-цифровые символы, без точек)?   -  person gunr2171    schedule 28.12.2020
comment
Не могли бы вы описать риски безопасности, которые вас беспокоят?   -  person gunr2171    schedule 28.12.2020
comment
...учти это. Возможно, нецелесообразно раскрывать вашу реализацию (имена типов) в запросе ajax. Возможно, было бы разумнее передать значение перечисления и дать вашему коду оценить его, чтобы найти тип статически, а не динамически. Тогда ваш вопрос перестанет быть проблемой. – Xavier J 27 мая ' 14 в 17:59   -  person gunr2171    schedule 28.12.2020
comment
Если все события, которые можно использовать, находятся внутри сборки, вы можете легко перечислить их программно и проверить, находится ли TypeName внутри этой закрытой коллекции, например var events = typeof(A.B.C.Events.SomeEvent).Assembly.GetTypes().Where(x => x.Namespace == "A.B.C.Events").ToArray()   -  person xanatos    schedule 28.12.2020
comment
Использование Type.GetType() делает вас открытым для людей, которые добавляют библиотеки DLL и возятся с вашим приложением, даже использование пространства имен не помогает, поскольку они могут помещать свои типы в одно и то же пространство имен. Однако есть и другие перегрузки, которые позволяют вам контролировать, какие сборки используются.   -  person DavidG    schedule 28.12.2020
comment
Вы не можете запретить другим библиотекам DLL использовать одно и то же пространство имен. Вместо этого вы можете ограничить сборку, например. путем передачи полного AsemblyQualifiedName или использования Assembly.GetType() вместо Type.GetType().   -  person John Wu    schedule 28.12.2020
comment
@gunr2171 gunr2171 Еще немного предыстории: я храню такие вещи в таблице базы данных, как: TypeString, JsonString, поэтому это не в контексте запроса AJAX. Уязвимость, которая меня беспокоит, — это удаленное выполнение кода, как описано здесь stackoverflow.com/questions/23895563/ Я думаю, что предложение xanatos хорошее, я, вероятно, пойду на это.   -  person Nordfjord    schedule 29.12.2020