In alcuni siti è richiesto di salvare all'interno del database l'indirizzo IP del richiedente per alcune azioni svolte dall'utente (login, registrazione, pagamenti, ecc.), allo scopo di mantenere traccia della provenienza delle richieste e per motivi di sicurezza.
L'operazione descritta è attuabile in modo molto semplice utilizzando un intero a 64 bit all'interno del database (in SQL Server il tipo di dato da utilizzare è BIGINT). L'uso di un numero invece di una stringa consente di poter eseguire facilmente confronti, senza possibilità di errore, oltre che essere un approccio che permette di limitare a 8 byte la quantità di spazio utilizzata per gestire questo tipo di informazione.
In ASP.NET l'indirizzo IP associato a una richiesta è reperibile sotto forma di stringa attraverso la proprietà UserHostAddress della classe HttpRequest, che legge e ritorna il valore contenuto nella server variable REMOTE_HOST. Per trasformare il valore della proprietà in un numero intero a 64 bit, possiamo utilizzare una funzione che, una volta risolto l'indirizzo IP, ritorni un valore di tipo long.
In questo caso forniamo un'implementazione sotto forma di extension method della classe HttpContext.
public static class Extensions { public static long GetClientIPAddress(this HttpContext context) { return context.Request.UserHostAddress.GetIPAddressValue(); } public static long GetIPAddressValue(this string clientIPAddress) { long value = 0L; if (clientIPAddress == null) { throw new ArgumentNullException("clientIPAddress"); } // Risolvi l'indirizzo IP del client IPAddress address = Dns.GetHostAddresses(clientIPAddress) .FirstOrDefault( x => x.AddressFamily.Equals(AddressFamily.InterNetwork)); // Genera il valore numerico (intero a 64 bit) if (address != null) { try { string[] octets = address.ToString().Split(new char[] { '.' }); value = Math.Abs( (Int64.Parse(octets[3])) + (Int64.Parse(octets[2]) * 256L) + (Int64.Parse(octets[1]) * 256L * 256L) + (Int64.Parse(octets[0]) * 256L * 256L * 256L)); } catch (Exception) { // Ritorna il valore di default value = 0L; } } return value; } }
All'interno di una pagina possiamo utilizzare il metodo appena definito nei due modi riportati di seguito.
// Versione 1 - Proprietà Context della classe Page long address1 = this.Context.GetClientIPAddress(); // Versione 2 - Istanza corrente del contesto HTTP long address2 = HttpContext.Current.GetClientIPAddress();
Una volta che disponiamo del valore numerico, siamo in grado di salvare questa informazione nel database, sicuri di disporre di una rappresentazione degli indirizzi IP uniforme e attendibile.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Verificare la provenienza di un commit tramite le GitHub Actions
Autenticarsi in modo sicuro su Azure tramite GitHub Actions
Eseguire una query su SQL Azure tramite un workflow di GitHub
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Potenziare Azure AI Search con la ricerca vettoriale
Hosting di componenti WebAssembly in un'applicazione Blazor static
Utilizzare il trigger SQL con le Azure Function
Utilizzare HiLo per ottimizzare le insert in un database con Entity Framework
Migrare una service connection a workload identity federation in Azure DevOps
Determinare lo stato di un pod in Kubernetes
Usare una container image come runner di GitHub Actions
Miglioramenti agli screen reader e al contrasto in Angular