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
Migliorare l'organizzazione delle risorse con Azure Policy
Estrarre dati randomici da una lista di oggetti in C#
Ottenere un token di accesso per una GitHub App
Come migrare da una form non tipizzata a una form tipizzata in Angular
Assegnare un valore di default a un parametro di una lambda in C#
Creare alias per tipi generici e tuple in C#
Utilizzare un numero per gestire la concorrenza ottimistica con SQL Server ed Entity Framework
Criptare la comunicazione con mTLS in Azure Container Apps
Eseguire query manipolando liste di tipi semplici con Entity Framework Core
Creare una custom property in GitHub
Eseguire una ricerca avanzata per recuperare le issue di GitHub
Disabilitare automaticamente un workflow di GitHub
I più letti di oggi
- Creare una libreria CSS universale: Nav menu
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Web capabilities AKA project Fugu
- Ottimizzare le Where con l'operatore Like in Entity Framework
- Le funzionalità di drag and drop di Silverlight 4.0
- Creare un extension method per effettuare in modo sicuro il substring di una stringa
- Real Code Birthday: 10annidi.ASPItalia.com