Unsafe reflection (ARCH343)
Anahtar dotnet.security.unsafe-reflection · Önem warning · Kategori security · CWE CWE-470
Activator.CreateInstance ve Type.GetType kodun çalışma anında bir tip seçmesine izin verir. O tipi girdi belirleyebiliyorsa, hangi sınıfın yükleneceğini ya da örnekleneceğini çağıran seçer - kodun hiç açmak istemediği sınıflar dahil.
Kural Activator.CreateInstance’ı yalnızca tipi kodun kendisi sabitlemiyorsa raporlar. Generic çağrı, typeof(...), typeof(X<>).MakeGenericType(...) ya da bunlardan biriyle başlatılıp hiç yeniden atanmamış bir yerel değişken raporlanmaz: hiçbiri girdiyle yönlendirilemez.
Hatalı
Bölüm başlığı “Hatalı”public object Create(string typeName){ var type = Type.GetType(typeName); return Activator.CreateInstance(type);}private static readonly Dictionary<string, Type> Allowed = new(){ ["invoice"] = typeof(InvoiceExporter), ["receipt"] = typeof(ReceiptExporter),};
public object Create(string kind) => Allowed.TryGetValue(kind, out var type) ? Activator.CreateInstance(type)! : throw new ArgumentOutOfRangeException(nameof(kind));Düzeltme
Bölüm başlığı “Düzeltme”Girdiyi adıyla çözmek yerine bir izin listesi üzerinden tipe eşleyin ya da tipi derleme zamanında generic veya typeof(...) ile sabitleyin.