IPv4 / IPv6 in Datenbank speichern?

02/10/2016 10:30 Don'yoku#1
Hey leute, ich hab n problem.

möchte von dem besucher der Seite die IP auslesen (gemacht mit $_SERVER["REMOTE_ADDR"] , und diese in meine DB (mysql) speichern.

Nun ist die frage wie mach ich es?
Ich hab versucht (aufm Localhost mit IPv6 adresse) es mit inet_pton in nen Int zu wandeln dies dann zu speichern. Hat auch etwas ausgegeben, dies wollte ich dann wieder auslesen und per inet_ntop und umwandeln, gibt mit aber anstatt meiner (wenn ich echo $_SERVER["REMOTE_ADDR"] mache)
::1 (ipv6 denk ich mal)
dies aus:
49.50.51.52

Nun zur frage. Wie fixxe ich das? Sodass es IPv4 und IPv6 richtig in meiner DB sichert?

PHP Code:
$_sql "UPDATE webform_login SET ip_addr="inet_pton($_SERVER["REMOTE_ADDR"]). "WHERE id=".$_SESSION["user"]["id"];
mysql_query($_sql);
$_sql "SELECT ip_addr FROM webform_login WHERE id=".$_SESSION["user"]["id"];
$ip mysql_query($_sql);
echo 
inet_ntop(mysql_result($ip,0)); 
02/10/2016 11:00 Der-Eddy#2
Quote:
Originally Posted by luci12 View Post
::1 (ipv6 denk ich mal)
::1 ist der localhost unter IPv6, kurze Schreibweise für 0000:0000:0000:0000:0000:0000:0000:0001
Da du das lokal testest ist das korrekt

Anzumerken sei auch das $_SERVER['REMOTE_ADDR'] die Adresse zurück gibt von der die Request kommt, sofern du z.B. einen Reverse Proxy dazwischen hast wird dieser angezeigt stattdessen
und lokal eben nur localhost


Ich würde übrigens [Only registered and activated users can see links. Click Here To Register...] empfehlen als Alternative, ähnlich wie Google Analytics speichert Piwik Besucher (IP Adresse, Browser, Auflösung, etc.) die auf deiner Webseite waren und gibt das schön grafisch aus
02/10/2016 11:32 Don'yoku#3
Quote:
Originally Posted by Dere-Eddy View Post
::1 ist der localhost unter IPv6, kurze Schreibweise für 0000:0000:0000:0000:0000:0000:0000:0001
Da du das lokal testest ist das korrekt

Anzumerken sei auch das $_SERVER['REMOTE_ADDR'] die Adresse zurück gibt von der die Request kommt, sofern du z.B. einen Reverse Proxy dazwischen hast wird dieser angezeigt stattdessen
und lokal eben nur localhost


Ich würde übrigens [Only registered and activated users can see links. Click Here To Register...] empfehlen als Alternative, ähnlich wie Google Analytics speichert Piwik Besucher (IP Adresse, Browser, Auflösung, etc.) die auf deiner Webseite waren und gibt das schön grafisch aus
Das weis ich, es hat aber auch seinen grund das ich nicht google analytics etc will.
Das wird ein Webadmin panel für eine Telefonanlage und ich möchte sehen wer sich wann und von welcher Ip als letztes dort eingeloggt hat um zu sehen wenn was kaputt is wer es war.

Desshalb kommt sowas nicht in frage, und das mitm proxy weis ich ^^
02/10/2016 11:44 Devsome#4
Quote:
Originally Posted by luci12 View Post
Das weis ich, es hat aber auch seinen grund das ich nicht google analytics etc will.
Das wird ein Webadmin panel für eine Telefonanlage und ich möchte sehen wer sich wann und von welcher Ip als letztes dort eingeloggt hat um zu sehen wenn was kaputt is wer es war.

Desshalb kommt sowas nicht in frage, und das mitm proxy weis ich ^^
Dann logge doch einfach die Uhrzeit (Serverseitig,Clientseitig) sowie der Benutzer der sich eingeloggt hat.
Dazu bei jeder Aktion den Benutzer mit loggen, damit jede Änderungen einem eindeutigen Benutzer zugewiesen werden kann.
IPs sind zwar schön, aber wenn man einen Proxy benutzt bringt das nicht viel.
Notfalls könnte man die dann halt aussperren, also speichern schadet nie.

// Update: Speicher die IP als varchar in deiner Datenbank, dort muss man dann nichts umwandeln.
02/10/2016 13:24 Don'yoku#5
Problem ist es gibt nur den nutzer root da man damit nur in der TK die verschiedenen Durchwahlen etc einstellen kann.
Und es wird eh nur Intern von Firmen benutzt sprich mit proxy macht es eh keiner. bzw man kommt auch nicht drauf.

Edit: Danke aber für das mit Varchar, ich teste das mal

Edit2: So jetzt macht es garnichts mehr, es läd nichtsmehr in die Datenbank hoch.... (habe das inet_pton weggelassen)
02/10/2016 21:39 Devsome#6
Kann dir morgen mal ein Beispiel machen wenn du magst wie du die IP Adressen bei jedem login in die Datenbank speicherst wenn du magst
02/11/2016 08:20 Don'yoku#7
Gerne.

Was mich wundert ist das es wenn ich in dem SQL sag speicher 123456 in $ip und push $ip dann in die DB gehts, versuch ich es mit dem ergebnis von $_SERVER["REMOTE_ADDR"] speichert er garnix....
02/11/2016 11:21 ComputerBaer#8
Hast du es für SQL auch als Zeichenkette erkennbar gemacht? Also '127.0.0.1' und nicht 127.0.0.1
Code:
$_sql = "UPDATE webform_login SET ip_addr='".$_SERVER["REMOTE_ADDR"]."' WHERE id=".$_SESSION["user"]["id"];
02/11/2016 11:40 Don'yoku#9
Quote:
Originally Posted by ComputerBaer View Post
Hast du es für SQL auch als Zeichenkette erkennbar gemacht? Also '127.0.0.1' und nicht 127.0.0.1
Code:
$_sql = "UPDATE webform_login SET ip_addr='".$_SERVER["REMOTE_ADDR"]."' WHERE id=".$_SESSION["user"]["id"];
Ja hab ich, hab nun aber schon einen Fix dafür entwickelt.
Sogar mit erkennung ob IPv4 oder IPv6, da es probleme gibt wenn man eine IPv4 als IPv6 speichert.

PHP Code:
function iperkennung($txt
            {
                return 
strpos($txt".") === false 4;
            } 
Hier Prüfe ich einfach ob in der IP Punkte vorkommen da dies nur in IPv4's der fall ist.

PHP Code:
$ip getenv('REMOTE_ADDR');
switch(
ipVersion($ip))
{
case 
4:
    
$_sql "UPDATE webform_login SET ip=INET_ATON('{$ip}') WHERE id=".$_SESSION["user"]["id"];
    
mysql_query($_sql);
    break;
case 
6:
    
$_sql "UPDATE webform_login SET ip=INET6_ATON('{$ip}') WHERE id=".$_SESSION["user"]["id"];
    
mysql_query($_sql);
    break;

Anschließend per Switch Abfage prüfe ich das Ergebnis meiner Funktion, der ich die IP-Adresse mitgegeben habe.
Im Fallle einer IPv4 lade es es mit INET_ATON('IP-Adresse') in die Datenbank.
Bei IPv6 ist es INET6_ATON('IP-Adresse').

Somit wandle ich die IP-Adresse nichtmehr PHP-Seitig um sondern MySQL-Seitig und speicher dies in einen Bin(16) in meiner Datenbank.


Hoffentlich hilft das irgendjemandem :)
02/11/2016 14:23 Devsome#10
Eine simple Methode beim erfolgreichen Login

Code:
<?php

$config['dbhost'] = "localhost";
$config['dbuser'] = "user";
$config['dbpass'] = "pw";
$config['db']     = "db";

@$db = mysql_connect($config['dbhost'], $config['dbuser'], $config['dbpass']);
if($db==false){
	return "database error {1}";
}
@mysql_select_db($config['db'], $db);

if(filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
    $ver = 1; //IPv6
} else {
    $ver = 0; //IPv4
}

// Bei jeder aktion ausführen
$query = "INSERT INTO `ipsave` (`ip`,`ver`) 
		VALUES
		('" . $_SERVER['REMOTE_ADDR'] . "','" . $ver . "')";


@mysql_query($query, $db);

echo "Saved.";
Tabelle
Code:
CREATE TABLE `ipsave` (
  `ID` int(11) NOT NULL,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `ip` varchar(50) COLLATE latin1_german1_ci NOT NULL,
  `ver` tinyint(4) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;
Bei mir speichert er so IPv4 und IPv6 Adressen.