Assembly.LoadFrom - utilizzo del sovraccarico Evidence per verificare la firma del nome sicuro

StackOverflow https://stackoverflow.com/questions/809934

  •  03-07-2019
  •  | 
  •  

Domanda

È possibile utilizzare il sovraccarico Assembly.LoadFrom con il parametro Evidence per assicurarsi che l'assembly sia fortemente denominato? Voglio essere in grado di specificare il nome dell'assieme, la cultura, la versione e il token di chiave pubblica. Se una qualsiasi di queste informazioni non corrisponde all'assembly non dovrebbe essere caricato.

È stato utile?

Soluzione 3

Ho trovato un altro modo per farlo.

var assemblyName = new AssemblyName(<fully qualified type name>);
assemblyName.CodeBase = <path to assembly>

Assembly.Load(assemblyName);

Altri suggerimenti

Puoi ottenere la chiave pubblica di un Assembly dopo averla caricata: se si carica correttamente e ha una chiave pubblica, allora ha un nome sicuro:

Assembly assembly = Assembly.LoadFrom (...);
byte[] pk = assembly.GetName().GetPublicKey();

Meglio ancora, controlla la chiave pubblica dell'assembly e le informazioni sulla versione prima di caricarla:

AssemblyName an = AssemblyName.GetAssemblyName ("myfile.exe");
byte[] publicKey = an.GetPublicKey();
CultureInfo culture = an.CultureInfo;
Version version = an.Version;

Se GetPublicKey () restituisce un valore non nullo e quindi l'assembly viene caricato correttamente, ha un nome sicuro valido.

Ho un modo per interrompere la verifica del nome sicuro per patchare System.Windows.Forms.dll. Se lo sto usando, non c'è molto che puoi fare al riguardo. Il mio trucco richiede piena fiducia.

Quello che ho fatto è stato patchare la dll, distribuire la dll patchata, ngen it, e patchare il caricatore per raccogliere l'immagine ngen patchata invece dell'originale. Quello che avrei potuto fare era bloccare il dll di borsa. (In realtà ho testato questo percorso e ho deciso che potenzialmente interrompere il software di qualcun altro era una scelta sbagliata.)

Non sto dicendo che sia una buona idea da fare. Sto dicendo che a seconda della verifica delle firme da Assembly.Load è una cattiva idea.

Prova la System.ReflectionAssemblyNameFlags :

bool f_public_key = ((asm.GetName().Flags & AssemblyNameFlags.PublicKey) != 0);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top