IP und Geodaten

Im Beitrag “IP, was weiß ein Server” wurde gezeigt, welche Verbindungsdaten während einer Anfrage ein Server protokolliert. Protokolliert wird nur die öffentliche IP des anfordernden Endgeräts (Benutzers).

Wenn man aber einschlägige Seiten besucht, erfährt man etwas mehr über die Verbindung als nur die IP. Zum Beispiel auf der Seite https://wieistmeineip.at

Diese Seite kennt meine IP, das wäre nichts Besonderes, das geht ja auch aus dem Verbindungsprotokoll am Server hervor. Darüber hinaus meldet das Programm aber auch Windows 10 (das ist falsch, denn hier ist Windows 11 am Werk), Chrome 119 und Österreich.

Geo-Daten

Eine IP ist nicht nur eine Telefonnummer fürs Internet, sondern sie kann auch etwas über den Standort des Users aussagen. Die iana (Internet Assigned Numbers Authority) verwaltet die Netze, also die IPs. Es gibt zahlreiche Seiten, die Datenbanken der iana auswerten und diese Daten zur kostenpflichtigen Weiterverwendung im Internet anbieten. Wie im Internet üblich, kann bei den meisten auch eine Art Kostprobe kostenlos abrufen.

Die in dem Abschnitt “Beispiele” gezeigten Daten beruhen auf der IP des abrufenden Benutzers. Bei meinem Stand-PC wird als IP 77.117.141.252, die IP des Routers, angegeben. Beim Handy ebenfalls, aber nur, wenn ich WLAN aktiviere und PC und Handy sich im selben Netz befinden. Deaktiviere ich am Handy WLAN, ändert sich die IP auf 178.115.55.21, eine öffentliche IP, die vom Provider zugewiesen wird.

Die Daten über den Standort sind nur bedingt richtig, etwa wird mein Provider einmal in 1010, dann in 1080 und sogar in Weiz 8150 und in Linz verortet. Möglicherweise sind die beteiligten Datenbanken in einem schlechten Wartungszustand.

Beispiele

Bedeutung der Spalten

  • Details: Hier kann man sich über die Syntax und über die Preisgestaltung informieren
  • Aufruf: Wie man die Daten abruft
  • IP variabel: nein: es wird die IP des aufrufenden Client gewählt; ja: man kann über einen Parameter jede beliebige IP abrufen
  • Relay: false: man kann die Daten mit https abrufen und daher kann man die in dieser Seite einbetten: true: man kann die Daten nur mit http abrufen und daher werden die Daten mit dem Hilfsprogramm relay.aspx abgerufen.
  • Key: false: es wird kein besonderer Schlüssel benötigt (zumindet nicht in der kostenlosen Version); true: man muss sich auf der Seite anmelden und einen key anfordern.
  • Value: Daten, die durch “Aufruf” im JSON-Format vom Anbieter abgeholt werden.

Programmcode

<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1.0, maximum-scale=2.0, user-scalable=yes">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
<script
  src="https://code.jquery.com/jquery-3.7.0.min.js"
  integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g="
  crossorigin="anonymous"></script>
</script>
<div class="container container-sm">
	<div class="row">
		<div class="col align-self-center">
			<table class="table table-sm">
				<thead id="IP_Head"></thead>
				<tbody id="IP_Body"></tbody>
			</table>
		</div>
	</div>
</div>
<script>
function getRow(key, value) {
	return "<tr><td>" + key + "</td><td>" + value + "</td></tr>"
}
function addRow(row) {
	$("#IP_Body").html($("#IP_Body").html()+row)
}
function getLink(text,link) {
	return "<a href='"+link+"' target='_blank'>"+text+"</a>"
}
const ipsources = [
{
		title:"ClubComputer",
		details:"https://buero.clubcomputer.at",
		getdata:"https://buero.clubcomputer.at/ip.aspx",
		relay:false,
		key:false
	},
	{
		title:"IpInfo (1)",
		details:"https://ipinfo.io",
		getdata:"https://ipinfo.io/#ip#?token=d4b01f1080d5ab",
		relay:false,
		key:true
	},
	{
		title:"IpInfo (2)",
		details:"https://ipinfo.io",
		getdata:"http://ip-api.com/json/#ip#?fields=status,message,continent,continentCode,country,countryCode,region,regionName,city,district,zip,lat,lon,timezone,offset,currency,isp,org,as,asname,reverse,mobile,proxy,hosting,query",
		relay:true,
		key:false
	},
	{
		title:"GeoPlugin",
		details:"https://www.geoplugin.com",
		getdata:"http://www.geoplugin.net/json.gp?ip=#ip#",
		relay:true,
		key:false
	},
	/* kein JSON
		{
		title:"https://www.cloudflare.com",
		getdata:"https://www.cloudflare.com/cdn-cgi/trace",
		relay:false,
		key:false
	},
	*/
	/* kein JSON
	{
		title:"https://hackertarget.com",
		getdata:"https://api.hackertarget.com/geoip/?q=#ip#",
		relay:false,
		key:false
	},
	*/
	{
		title:"IpRegistry",
		details:"https://ipregistry.co",
		getdata:"https://api.ipregistry.co/#ip#?key=bia2lo38yds0whfu",
		relay:false,
		key:true
	},
	{
		title:"ApiLayer",
		details:"https://apilayer.com",
		getdata:"http://api.ipstack.com/#ip#?access_key=4e2ec3c05d1f714994943035fdc6ac3f",
		relay:true,
		key:true
	},
	{
		title:"Db-Ip",
		details:"https://db-ip.com",
		getdata:"https://api.db-ip.com/v2/free/self/",
		relay:false,
		key:false
	}
]

var s = ""
const ip_placeholder = "#ip#"

$.get("https://buero.clubcomputer.at/ip.aspx",function(data){ 
	var ip = data.ip
	addRow("<tr><td colspan='2'><h3>" + ipsources[0].title + "</h3></td></tr>")
	addRow(getRow("Details",getLink(ipsources[0].details,ipsources[0].details)))
	addRow(getRow("Aufruf",ipsources[0].getdata))
	addRow(getRow("IP&nbsp;variabel",(ipsources[0].getdata.includes(ip_placeholder)?"ja":"nein")))
	addRow(getRow("Relay",(ipsources[0].relay)))
	addRow(getRow("Key",(ipsources[0].key)))
	addRow(getRow("Value","<pre>"+JSON.stringify(data, null, 2)+"</pre>"))
//	Object.keys(data).forEach(function (key, index, array){
//		addRow(getRow(key,eval("data."+key)))
//	})
	ipsources.forEach(function (key, index, array){
		if (index>0) {
			$.get((ipsources[index].relay?"https://buero.clubcomputer.at/relay.aspx?target=":"")+ipsources[index].getdata.replace(ip_placeholder,ip),function(data){ 
				addRow("<tr><td colspan='2'><h3>"+ipsources[index].title+"</h3></td></tr>")
				addRow(getRow("Details",getLink(ipsources[index].details,ipsources[index].details)))
				addRow(getRow("Aufruf",ipsources[index].getdata))
				addRow(getRow("IP variabel",(ipsources[index].getdata.includes(ip_placeholder)?"ja":"nein")))
				addRow(getRow("Relay",(ipsources[index].relay)))
				addRow(getRow("Key",(ipsources[index].key)))
				addRow(getRow("Value","<pre>"+JSON.stringify(data, null, 2)+"</pre>"))
	//			Object.keys(data).forEach(function (key, index, array){
	//				addRow(getRow(key,eval("data."+key)))
	//			})
			})
		}
	})
})

$(document).ready(function(){
})
</script>
Zur Werkzeugleiste springen