wszystkie wpisy

Adres komputera, korzystającego z naszej strony

Uzyskanie informacji nt. komputera, z którego wykonano jakąś czynność jest bardzo ważne, z punktu widzenia bezpieczeństwa. Informacja ta, jest ważna zarówno w przypadku systemów wewnętrznych (intranet), jak i systemów zewnętrznych (internet).

    W przypadku intranetu, jednym ze szczególnych przypadków jest “usuwanie rekordów z bazy danych” (np. usuwanie faktur w systemie księgowym), gdzie oprócz loginu osoby wykonującej akcję (dost. z systemu), chcemy mieć dla pewności informacje nt. komputera, z którego wykonano akcję.

    W przypadku internetu, chcemy mieć zazwyczaj informacje, nt. komputera, który próbuje się włamać do naszego systemu, lub wykonuje inną nieporządaną akcję (np. atak DDoS).

W jaki sposób uzyskać informację nt. komputera, korzystającego z naszego systemu? Wykorzystamy do tego celu klasy z przestrzeni nazw “System.Web” oraz “System.Net”.

using System.Web;

using System.Net;

IPHostEntry hostEntry = Dns.GetHostEntry(HttpContext.Current.Request.ServerVariables[“REMOTE_HOST”].ToString());

Praktyczny sposób wykorzystania zmiennej hostEntry prezentuje przykład, wykonany na zwykłej stronie asp.net (web forms):

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web;

using System.Net;

using System.Text;

public partial class _Default : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        string ComputerName = "";

        IPAddress[] IpAdressList = null;

        StringBuilder sb = new StringBuilder();

        try

        {

            IPHostEntry hostEntry = Dns.GetHostEntry(HttpContext.Current.Request.ServerVariables[“REMOTE_HOST”].ToString());

            ComputerName = hostEntry.HostName.ToString();

            IpAdressList = hostEntry.AddressList;

        }

        catch { }

        sb.AppendLine(string.Format(“Nazwa komputera {0}”, ComputerName));

        if (IpAdressList != null)

        {

            for(int i=0; i < IpAdressList.Length; i++)

            {

                sb.AppendLine(string.Format(“Typ adresu IP {0}, adres IP {1}”, IpAdressList[i].AddressFamily, IpAdressList[i].ToString()));

            }

        }

        string computerInfo = sb.ToString();

    }

}

   Posiadając informacje nt. komputera, możemy te informacje zapisać do bazy danych, lub do logów. W przypadku aplikacji asp.net preferuję wykorzystania gotowego rozwiązania, jakim jest log4net, natomiast w przypadku Sharepoint 2010 logowanie do natywnych logów sharepointa (jak sie to robi opisze w jednym z przyszłych wpisów).

Edit: Niestety te metody w praktyce nie okazały się na tyle dobre, jak być powinne. Nowe metody:

public static string GetUser_IP()         {             string VisitorsIPAddr = string.Empty;             if (HttpContext.Current.Request.ServerVariables[“HTTP_X_FORWARDED_FOR”] != null)             {                 VisitorsIPAddr = HttpContext.Current.Request.ServerVariables[“HTTP_X_FORWARDED_FOR”].ToString();             }             else if (HttpContext.Current.Request.UserHostAddress.Length != 0)             {                 VisitorsIPAddr = HttpContext.Current.Request.UserHostAddress;             }             return VisitorsIPAddr;         }         public static string GetUserIP()         {             string ipList = HttpContext.Current.Request.ServerVariables[“HTTP_X_FORWARDED_FOR”];             if (!string.IsNullOrEmpty(ipList))             {                 return ipList.Split(’,’)[0];             } \            return HttpContext.Current.Request.ServerVariables[“REMOTE_ADDR”];         }

Używanie

string visitorIp = GetUser_IP();         int intAddress = BitConverter.ToInt32(IPAddress.Parse(visitorIp).GetAddressBytes(), 0);