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);