İçeriğe geç

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.

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));

Girdiyi adıyla çözmek yerine bir izin listesi üzerinden tipe eşleyin ya da tipi derleme zamanında generic veya typeof(...) ile sabitleyin.