Sto scrivendo una libreria e ho un metodo che contiene un dizionario. Il valore del dizionario è non attendibile/non sicuro, ma la chiave è affidabile e se all'utente finale è stata data la possibilità di immettere un nome di chiave arbitraria, potrebbero verificarsi "cose brutte".Controlla se una stringa è una stringa letterale nota al momento della compilazione?
Così quando altri sviluppatori usano questa funzione di libreria, voglio costringerli a conoscere il nome della chiave in fase di compilazione. Quindi, qualcosa di simile sarebbe consentito:
string userInput = Console.ReadLine();
Dictionary<string, string> something = new Dictionary<string, string>();
something.Add("MyKey", userInput);
Perché "MyKey" è una stringa letterale, noto al momento della compilazione. Ma qualcosa di simile sarebbe neanche sollevare un'eccezione di compilazione o di esecuzione:
string userInput = Console.ReadLine();
string userKey = Console.ReadLine();
Dictionary<string, string> something = new Dictionary<string, string>();
something.Add(userKey, userInput);
Perché l'input dell'utente è stata utilizzata per la chiave (UserKey) e quindi era sconosciuto al momento della compilazione.
Ho cercato in GetType() e non c'è nulla che distingua realmente tra una stringa letterale e una stringa creata in fase di esecuzione.
Non è possibile creare (o riutilizzare) un metodo che può visualizzare un valore di stringa e disinfettarlo o determinare se è sicuro? Quindi ti proteggi dai letterali di stringa problematici e consenti l'uso di valori di sicurezza non letterali. – Servy
Le espressioni negli attributi sono garantite come costanti, se ricordo correttamente. Quindi, potresti anche provare a creare un attributo personalizzato e avere codice client che ti passa un membro o un tipo decorato con quell'attributo. Quindi, puoi leggere i metadati da quell'attributo. (Anche se potrebbero esserci trucchi di riflessione che possono simulare ciò, usando assiemi dinamici.) –
Il problema è che la chiave è intrinsecamente insicura. Ecco perché non dovrebbe mai venire dall'input dell'utente in nessuna circostanza. In questo momento le mie opzioni sono per verificare se è noto in fase di compilazione O per hardcode nella mia libreria in modo che non possa essere modificato da sviluppatori esterni. –