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
Utilizzare Tailwind CSS all'interno di React: primi componenti
Ottimizzazione dei block template in Angular 17
Utilizzare Tailwind CSS all'interno di React: installazione
Creazione di plugin per Tailwind CSS: espandere le Funzionalità del Framework
Criptare la comunicazione con mTLS in Azure Container Apps
Modificare i metadati nell'head dell'HTML di una Blazor Web App
Registrare servizi multipli tramite chiavi in ASP.NET Core 8
Implementare il throttling in ASP.NET Core
Creare un webhook in Azure DevOps
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Controllare gli accessi IP alle app con Azure Container Apps
Eseguire attività basate su eventi con Azure Container Jobs
I più letti di oggi
- Aggiungere il metodo SelectMany alla classe Array in TypeScript
- Usare gateway dedicati con Azure Cosmos DB per migliorare le prestazioni
- Recuperare i Popup aperti in una Windows Store app
- AI&ML Conf 2020 - Online
- Preview 4 per ASP.NET MVC
- Speciale Windows Store app: costruire app con WinRT per Windows 8
- Microsoft Security Bulletin MS02-050
- Microsoft Security Bulletin MS04-033
- Attivare l'output caching su ASP.NET Web API
- Ottimizzare l'utilizzo di banda tramite ETag in ASP.NET Core Web API