Ip Adressen abfrage bringt 2 Versiedene Einträge bei Php 7

  • Wegen den Neuen Richtlinen will ich einen Hinweiß Text einblenden und wenn der Besucher den anklickt wird die Ip Adresse mit Zeit in Db gespeichert . Das Funktioniert ja auch . Aber irgendwie macht das stress $_SERVER['REMOTE_ADDR']


    Mal bekomme ich eine normale ip Adresse angezeigt zb 123.123.123.33 und dann mal so eine lange 2a02:908:2a40:c1e0:fd20:6e82:cacb:1835

    Wenn ich die Ip Adresse vorm Speichern mit echo anzeigen lasse ist sie noch kurz .In der DB ist sie auf einmal lang. Wo kommt das weg. Wenn ich wieder umstelle auf PHP 5.6 oder so ,wird immer die kurze IP Adresse genommen und macht kein Problem, Wo kommt dieser tolle Effekt weg ?


    Ich könnte ja jetzt Code posten aber ich wüßte nicht was ,weil es geht ja alles nur die ip Adresse macht diesen Tollen merkwürdigen Fehler.


    Am Anfang ging es erst gar nicht ,da wahr ich zu Blöd und habe die Spalte für ip Adresse auf 11 Zeichen begrenzt. Jetzt habe ich da schon 1000 stehen was zwar schwachsiinn ist aber irgendwie muß ich den Fehler ja versuchen zu debbungen . Aber jetzt ist ende ich weiß nicht mehr weiter

  • Guten Morgen,


    Okay. Diese lange IP-Adresse ist vom TYP

    IPv6. Da wird die IP Adresse hexadezimal hergestellt.


    Du musst dann diese hexadezimale Form der IP-Adresse in die normale umwandeln denke ich mal.


    Was wird denn ausgegeben wenn du die IP-Adresse ausgibst?


    Zeig mal bitte den betreffenden Codeteil.


    Grüße,

    Stef

  • Also da wo der Echo ist ,ist die ip adresse noch Kurz.

    Kucke ich in der Datenbank ist sie Lang


    EDIT Das ist die Abfrage bzw der Vergleich der aber ne geht weil ja lange ip Adressen da drinne stehen

    Code
    1. $suchwort=$_SERVER['REMOTE_ADDR'];
    2. echo $_SERVER['REMOTE_ADDR']."<br>".$suchwort;
    3. $mysqli = mysqli_connect('localhost', 'sebastian1012_besucher', 'bla blub', 'sebastian1012_besucher');
    4. if (mysqli_connect_errno())
    5. die ("Connect failed: " . mysqli_connect_error());
    6. mysqli_set_charset($mysqli, "utf8");
    7. $query = ("Select * FROM `besucher` WHERE ip LIKE '%$suchwort%' AND gelesen LIKE 'ja'");
    8. $result = mysqli_query($mysqli, $query) or die ("MySQL-Error: " . mysqli_error($mysqli));
    9. var_dump($result);

    Hier speichere ich. Nicht meckern wegen sql Injektion ich habe das alles rausgeworfen zum debbugen


  • Wofür umrechnen? Wenn deine Seite über IPv6 aufgerufen wird, speicherst du einfach diese Adresse.


    Das Problem scheint aber zu sein, dass Basti die Seite über IPv4 aufruft, jedoch in der DB anscheinend eine IPv6-Adresse erhält. Entweder diese Aussage ist schlicht falsch oder irgendwas ganz merkwürdiges läuft da ab...


    basti1012 Bitte mach mal ein var_dump($query) nach dem Zusammensetzen des Querys mit sprintf().


    Des Weiteren kannst du deine Feldlänge eigentlich relativ leicht bestimmen.


    Die größte mögliche IPv4-Adresse sieht so aus: xxx.xxx.xxx.xxx (15 Zeichen)


    Die größte mögliche IPv6-Adresse sieht hingegen so aus: xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx (39 Zeichen)


    Wenn du deine IP also exakt in dem Format als VARCHAR abspeicherst, brauchst du eine Länge von 39 Zeichen.

  • Das tolle ist ja das mir die echos vor den speichern die kurze adresse Zeigen aber in der Db die lange steht. Möchte ich die aber vergleichen ,weil ich kucken will ob der Besucher den Datenschutz bestätigt hat ,vergleicht er halt die kurze mit der lange und ich habe nie ein treffer. vardump sagt mir auch das nie ein treffer ist. beim rum spielen und testen hatte ich mal kurzeitig 2 oder 3 einträge wo die kurze IP Adresse gespeichert wurde ,nur habe ch keine ahnung warum das so ist. Unter Php 5 hatte jeder Browser noch eine andere Ip Adresse .Jetzt mit Php 7 haben alle Browser die gleiche lange Ip Adresse.Das ist auch noch was ich nicht ganz verstanden habe. Gibt es irgendeine einstellung in der DB die den Ip Eintrag umwandelt oder so? Es muß doch in PHP selber was geben oder nicht ? weil PHP 5 speichert die kurze IP ,da habe ich kein problem aber ich will ja bei PHP 7 bleiben und nicht mit der Zeit wieder zurück gehen.

  • Da kann man sehen das ich noch php neuling bin und nur die häfte verstehe was da steht. Wenn ich richtig verstanden habe wird da erklärt wie man checkt ob die ip Adresse Valide ist und so,nur das hilft mir gerade nicht so. Es muß doch einen Grund geben das die Datenbank das falsch abspeichert .Weil der echo vorm speichern ist ja noch alles bestens. Wie man den kram umwandelt in einer kurzen Ip habe ich auch noch nix gefunden

  • Ich glaub der Fehler muss woanders sein . wenn ich eine Seite erstelle wo nur die ip angezeigt wird ,zeigt er mir die lange

    * Link entfernt , weil existiert nicht mehr *

    Und wenn ihr auf meiner Startseite geht, steht ganz unten auf der Seite die kurze ip. Und da wahr jetzt noch keine Datenbank abfragen oder sonst was. Da muß doch ein andere Fehler sein.

    Ganz unten auf Meiner Startseite lasse ich gerade auch vardump ausgeben mit der query


    Code
    1. $suchwort=$_SERVER['REMOTE_ADDR'];
    2. $query = ("Select * FROM `besucher` WHERE ip LIKE '%$suchwort%' AND gelesen LIKE 'ja'");

    Bei mir zeigt er nix an, weil er ja die langen ips in der Datenbank speichert

  • Und wieder mal bastelst du an einer sinnlosen Sache rum!


    Die IP-Adresse ändert sich in regelmäßigen Abständen bei vielen Routern, und somit steht deine Idee schon im Regen. Mitarbeiter einer Firma serven alle mit der gleichen IP-Adresse, und somit fällt dein Script schon wieder auf die Nuss.


    Ich denke, deine Seite hat massenhaft sinnvolle Verbesserungsmöglichkeiten, aber du bastelst wieder mal an sinnlosen Dingen rum.

  • Dann hast du eine statische IP...


    m.scatello Was soll er denn stattdessen machen? Es geht doch darum, eine Beweismöglichkeit zu schaffen, dass die Datenschutzerklärung oder was auch immer akzeptiert wurde, wenn ich das richtig verstehe. Natürlich weist die IP Lücken auf, aber eine viel bessere Lösung gibt es wohl nicht.


    Oder geht es darum, festzustellen, ob der Hinweis nochmal angezeigt werden muss? Dann wäre natürlich ein Cookie tausendmal besser.

  • Es geht um beides.Da ich Daten im Chat und Forum speichere muß der blöde Text ja sein

    Ich habe jezt eine Lösung gefunden ,aber nicht DIE Lösung.

    Wenn ich auf der Startseite die ip anzeigen lassen so

    PHP
    1. <?php echo '<div id="ipsend">'.$_SERVER['REMOTE_ADDR'].'</div>'; ?>

    bekomme ich die lange Ip adressen angezeigt.

    Lasse ich die Ip adresse in den Php Script ausgeben kommt wieder die kurze.

    Aber speichern tut er ja trotzdem die lange in der DB.

    Ich schicke die Ip jetzt mit ajax zum PHP Script dann wird die lange mit der langen verglichen und nicht mehr die kurze.


    Nur warum ist das so ? Das habe ich noch nicht rausgefunden. warum er direkt im PHP Script immer die kurze Ip adresse hat .Das verstehe ich einfach nicht. So geht es jetzt ,aber zufrieden stellen tut mich das nicht warum der Fehler so ist

  • Es geht doch darum, eine Beweismöglichkeit zu schaffen, dass die Datenschutzerklärung oder was auch immer akzeptiert wurde

    Wofür beweisen? Guck dir doch mal an, wie google das macht. Lösche deine Cookies, besuche google, lösche wieder deine Cookies und besuche wieder google. Es geht doch nicht darum, ob jemand den Datenschutz gelesen hat, das interessiert doch fast niemanden. Und auf wie vielen Seiten hast du das schon mal gesehen? Und glaubst du wirklich, dass irgend ein Besucher von bastis Seiten sich dafür interessiert?

  • Es gibt doch mitlerweile Leute/Anwälte die genau solche kleine Popel Seiten wie meine suchen um zu kucken ob ich den Datenschutz einhalte oder nicht. Wenn nein Versuchen die dann Geld von dir zu holen.Kam letztens auf RTL. Mir ist das doch egal ob die einer ließt.Sobald er ja geklickt hat bin ich hoffentlich auf der Sicheren Seite.

  • Meine Güte, manchmal bist du echt schwer von Begriff, oder?


    Wichtig ist, dass du eine Datenschutzerklärung auf deiner Seite hast, bestätigen, dass man sie gelesen hat, ist nicht erforderlich. Und nein, deine Seite wird keinen Anwalt interessieren, denn die merken ja, dass da nicht viel zu holen ist. Trotzdem sollte man die Datenschutzerklärung haben.

  • Wofür beweisen? Guck dir doch mal an, wie google das macht. Lösche deine Cookies, besuche google, lösche wieder deine Cookies und besuche wieder google. Es geht doch nicht darum, ob jemand den Datenschutz gelesen hat, das interessiert doch fast niemanden. Und auf wie vielen Seiten hast du das schon mal gesehen? Und glaubst du wirklich, dass irgend ein Besucher von bastis Seiten sich dafür interessiert?

    Ich habe mich ein wenig falsch ausgedrückt: Ich bin davon ausgegangen, dass er eine Nachweisfunktion für eine Einwilligung implementieren möchte.


    1. Beruht die Verarbeitung auf einer Einwilligung, muss der Verantwortliche nachweisen können, dass die betroffene Person in die Verarbeitung ihrer personenbezogenen Daten eingewilligt hat.

  • Wer mal IP-Adressen speichern muss|will: dem MySQL-Server die Arbeit überlassen:

    Der MySQL-Server wird schneller sein als PHP.

    Außerdem wollen wir in PHP immer mit IP-Strings arbeiten.

    Der MySQL-Server (Storage) soll sich um das Speichern|Format kümmern.


    Tabelle erstellen:

    SQL
    1. CREATE TABLE `my_table_name` (
    2. -- ...
    3. `ip` varbinary(16) NOT NULL COMMENT 'INSERT: `ip` = INET6_ATON(:ip) ; SELECT: INET6_NTOA(`ip`) AS `ip`',
    4. -- ...
    5. );

    Erklärung:

    varbinary(16) stellt genug platz für ipv4 und ipv6.


    Beim INSERT lässt man den MySQL-Server den gegebenen Wert (zB ipv4 String) per INET6_ATON in einen binary String umwandeln.

    INSERT: INET6_ATON

    SQL
    1. INSERT INTO `my_table_name` SET `ip` = INET6_ATON(:ip);


    Beim SELECT das Ganze ümgekehrt:

    SELECT: INET6_NTOA

    SQL
    1. SELECT INET6_NTOA(`ip`) AS `ip` FROM `my_table_name`;


    INET6_NTOA und INET6_ATON könenn beides: ipv4 und ipv6. (Es gibt auch INET_ATON |INET_NTOA für nur ipv4. Aber wir wollen ja beides abdecken.)


    Suchen - WHERE Bedingung:

    Wir suchen im Bsp nach einer Row mit einer Bestimmten IP.

    Da die IPs in der Tabelle binary sind, können wir nicht mit `ip` = :ip suchen.

    Wir wandeln die gesuchte (!) IP in binary um, damit binary mit binary verglichen wird.

    Wir sollten NICHT die binary IPs in jeder Row umwandeln lassen.



    @basti1012

    Kann und will Dir irgendwie auch nicht helfen. Kann ja kaum Deine Texte lesen.

    Wollte das nur posten, damit es wenigstens einmal richtig im Thread steht.


    BTW: hör auf ständig angreifbare (SQL-Injection) SQL-queries zu posten!

    Ich kann es nicht mehr sehen. Die Ausrede "is ja nur um den Fehler zu finden" zieht nicht.

    Es geht mir dabei auch nicht um Deinen Code. Es geht um die Benutzer|Besucher hier im Forum, die dann vlt. noch den Gleichen Mist kopieren!


    Warum bin ich so direkt:

    Ich bin als total Anfänger hier ins Forum gekommen und habe inzwischen einen sehr schönen Job als PHP dev.

    Ich bin hier geblieben, weil ich das Forum immer als korrekt angesehen hab.

    Hat mal jemand "Mist" geschrieben, kam sofort ein Anderer und hat das klar gestellt (früher war das Basi und Lauras - beide wohl nicht mehr aktiv :/ ).

    Was Du machst, ist das Forum mit immer den gleichen Fehlern (hier im Bsp SQL-Injection) zu überfluten.

    Das muss aufhören.