Convertire l'indirizzo IP di una richiesta in un valore numerico

di Riccardo Golia, in ASP.NET 3.5, ASP.NET 4.0, ASP.NET MVC,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi