IP Adresse mit Formular übermitteln
Günther
- php
0 Matthias Jütte0 Tom
Hallo,
ich habe ein Formulat gebastelt, mit dem man Datensätze in eine MySQL-DB einpflegen kann. Nun sollte allerdings auch die IP-Adresse oder noch besser der Rechnername des jeweiligen "Einpflegers" zusammen mit dem Datensatz abgespeichert werden. Dazu habe ich in der DB neben den anderen Feldern auch ein Feld "Ident" angelegt.
Hier drin sollte dann die IP bzw. der Rechnername gespeichert werden.
Mit den Daten einpflegen klappt ja ohne Probleme, allerdings weiß ich nicht wie das mit der IP bzw. Rechnernamen klappen soll.
Hinweis: Das Formular wird NUR im Intranet eingesetzt.
Zusätzlich, wenn sowas überhaupt machbar ist, sollte im Hintergrund geprüft werden, ob der jeweilige Rechnername oder die IP schon mal einen Datensatz eingepflegt hat und ggf. sollte dann eine Hinweisseite erscheinen, dass man keinen weiteren Datensatz in die Db einpflegen darf.
Geht sowas ? Bitte um Tipps oder auch Beispiele !
Danke
Gruß
Günther
Hallo Günther!
Hier drin sollte dann die IP bzw. der Rechnername gespeichert werden.
Mit den Daten einpflegen klappt ja ohne Probleme, allerdings weiß ich nicht wie das mit der IP bzw. Rechnernamen klappen soll.
Zum Rechnernamen weiß ich auch keinen guten Rat, die IP gibt's über $_SERVER['REMOTE_ADDR']: http://www.php.net/manual/de/reserved.variables.php#reserved.variables.server
Zusätzlich, wenn sowas überhaupt machbar ist, sollte im Hintergrund geprüft werden, ob der jeweilige Rechnername oder die IP schon mal einen Datensatz eingepflegt hat und ggf. sollte dann eine Hinweisseite erscheinen, dass man keinen weiteren Datensatz in die Db einpflegen darf.
Dazu dann eine ganz einfache Abfrage auf die DB laufen lassen ...
Gruß
Matthias
Hello,
Zum Rechnernamen weiß ich auch keinen guten Rat, die IP gibt's über $_SERVER['REMOTE_ADDR']: http://www.php.net/manual/de/reserved.variables.php#reserved.variables.server
Zusätzlich, wenn sowas überhaupt machbar ist, sollte im Hintergrund geprüft werden, ob der jeweilige Rechnername oder die IP schon mal einen Datensatz eingepflegt hat und ggf. sollte dann eine Hinweisseite erscheinen, dass man keinen weiteren Datensatz in die Db einpflegen darf.
Den Namen des Hosts, über den die Verbindung zustande kommt, kann man bei Apache ab 2.0 in $_SERVER['REMOTE_HOST'] ablesen. Ich glaube, der 1.3.x stellt dieses Feld noch nicht automatisch zur Verfügung. Da muss man dann eine Hosts-Abfrage machen.
Die Berechtigung sollte man aber nicht an die IP koppeln, sonder an eine vernünftige Benutzer-Authentifizierung. Die erreicht man nur durch zweiteiligen Schlüssel (z.B. Username/Passwort)
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo,
nur wie mach ich das genau mit dem Befehl $_SERVER['REMOTE_ADDR']
Wo wird der und wie eingebaut ??
Gruß und Danke !
Günther
Moin!
nur wie mach ich das genau mit dem Befehl $_SERVER['REMOTE_ADDR']
Das ist kein Befehl, sondern eine vorbelegte Variable. Genau wie $_POST auch. Und die wird auch genauso benutzt.
- Sven Rautenberg
Muss ich da irgendwie ein verstecktes Feld einpflegen und mit der Variablen verknüpfen ?
Moin!
Muss ich da irgendwie ein verstecktes Feld einpflegen und mit der Variablen verknüpfen ?
Hä? Versteckt? Im Formular? Nein.
Du denkst zuviel! Einfach machen, ausprobieren und sehen, was passiert.
- Sven Rautenberg
Hä ??
:-))
Sorry für die Anfängerfrage, aber wo muss ich denn den Wert $_SERVER['REMOTE_ADDR'] hinschreiben ?
Danke für die Info
Gruß Günther
Moin!
Sorry für die Anfängerfrage, aber wo muss ich denn den Wert $_SERVER['REMOTE_ADDR'] hinschreiben ?
Da, wo er hin soll: In deine Datenbank.
Du schreibst doch auch die Inhalte aus dem Formular in deine Datenbank.
- Sven Rautenberg
Aha, hat jetzt endlich geklappt.
Wie mach ich den so eine IP-Überprüfung, die vor dem Abschicken prüft, ob diese IP-Adresse schon einmal einen Datensatz eingepflegt hat oder nicht?
Gruß
Günther
Hallo Günther,
Wie mach ich den so eine IP-Überprüfung, die vor dem Abschicken
prüft, ob diese IP-Adresse schon einmal einen Datensatz
eingepflegt hat oder nicht?
Vorher ein entsprechendes SELECT abfeuern oder die Spalte auf UNIQUE
setzen.
Grüße,
CK
Hi,
hab ich ja so schon mal richtig angefangen.
Allerdings bestehen meine Probleme in der If-Anweisung:
Wenn der Wert > 0 ist, dann soll man auf eine Seite weitergeleitet werden auf der ganz einfach steht, dass man keinen neuen datensatz einpflegen darf.
Im anderen Fall sollte man zu der Einfügeseite weitergeleitet werden.
Geht sowas ?
Hier mein bisheriger Code:
<?php
mysql_select_db($database_conUmfrage, $conUmfrage);
$query_Recordset1 = "SELECT ID FROM tbl_Fragen WHERE IP > 0";
$Recordset1 = mysql_query($query_Recordset1, $conUmfrage) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
if (mysql_num_rows ($Recordset1) > 0)
{
dann ;
} else {
sonst;
}
}
?>
hi,
Geht sowas ?
ja, und hinweise zur lösung hast du bereits bekommen.
wie wär's, wenn du jetzt endlich mal anfängst, deine eigenen grauen zellen mal ein wenig zu beschäftigen?
bisher hast du dir hier alles vorkauen lassen ...
gruß,
wahsaga
Hi,
Wie mach ich den so eine IP-Überprüfung, die vor dem Abschicken
prüft, ob diese IP-Adresse schon einmal einen Datensatz
eingepflegt hat oder nicht?Vorher ein entsprechendes SELECT abfeuern oder die Spalte auf UNIQUE
setzen.
Da Datenbankabfragen teuer sind, würde ich evt. einen Bloomfilter zwischenschalten.
Eine Beschreibung mit Beispielen für Perl gibt's hier:
http://www.perl.com/pub/a/2004/04/08/bloom_filters.html (Das sind _zwei_ Seiten! Falls jemand genauso schusselig/kurzsichtig ist, wie ich und den kleinen Hinweis am Ende übersieht ;-)
Als Hashfunktion wird da aber SHA vorgeschlagen, das finde ich etwas aufwendig. Je nach Menge reicht da auch MD5 oder, bei sorgfältiger Wahl des Polynoms, läßt sich auch ein ein CRC passender Größe mißbrauchen.
Schlußendlich dürfte wahrscheinlich sogar simples polynomiales Hashing (wahrscheinlich besser als "addierendes Hashing" bekannt, was aber nicht ganz korrekt ist). Falls sich keiner erinnert (ja, lang ist's her, was? ;-) hier noch ein Beispiel in C (mehr oder weniger kackfrech geklaut von Kernighan&Ritchie):
#define HASH_CONSTANT 31
int hash(char *s, size_t len){
int hash = 0;
char *t = NULL;
if(len <= 0 || !*s){
/*Don't forget to set errno appropriatly!*/
return -1;
}
t = s;
while(len--){
hash = hash * HASH_CONSTANT + *t++;
}
return (hash & INT_MAX);
}
(Integergrößen sind natürlich anzupassen!)
Günstige Werte für HASH_CONSTANT sind neben der 31 auch 33 (recht guter Wert für indogermanische Sprachen in 8 Bit Zeichencodierungen; wird auch von der Bercley DB benutzt), 37 oder 131. Die Mathematik dahinter ist relativ kompliziert und auch für das Aussuchen eher unnötig, da einfaches Ausprobieren hier genauso gut, wenn nicht sogar noch besser funktioniert.
Bei rotierendem Hashing, das etas schneller wäre, da die Mutiplikation rausfällt, ist die Auswahl an verschiedenen Werten leider zu gering, als das man es für eien Bloomfiletr nutzen könnte.
so short
Christoph Zurnieden
Hallo Christoph,
Wie mach ich den so eine IP-Überprüfung, die vor dem Abschicken
prüft, ob diese IP-Adresse schon einmal einen Datensatz
eingepflegt hat oder nicht?Vorher ein entsprechendes SELECT abfeuern oder die Spalte auf
UNIQUE setzen.Da Datenbankabfragen teuer sind, würde ich evt. einen Bloomfilter
zwischenschalten.
Ich nicht, ich wuerde ein UNIQUE-Constraint setzen und dann einfach
ein INSERT abfeuern. Im guenstigen Fall ist der Datensatz drin, im
unguenstigen Fall ist der Datensatz nicht drin und ich kann ueber
die Error-Nummer herausfinden, warum -- was in den meisten Faellen
wohl ein Verstoss gegen die UNIQUE-Verordnung sein duerfte.
Grüße,
CK
Hi,
Ich nicht, ich wuerde ein UNIQUE-Constraint setzen und dann einfach
ein INSERT abfeuern. Im guenstigen Fall ist der Datensatz drin, im
unguenstigen Fall ist der Datensatz nicht drin und ich kann ueber
die Error-Nummer herausfinden, warum -- was in den meisten Faellen
wohl ein Verstoss gegen die UNIQUE-Verordnung sein duerfte.
Ja, das ist eine billige Abfrage. Es geht aber um die Abfrage selber, den Kontakt mit der DB. Das kostet, da nicht auf der gleichen Maschine, stets einige Millisekunden. Wenn die Datensätze nicht allzugroß sind dauert es jedoch nur einige Microsekunden für die Berechnung der nötigen 3-4 Hashwerte für den Bloomfilter mitsammt dem Vergleich. Ein Faktor 100 und mehr ist durchaus erreichbar.
so short
Christoph Zurnieden
Hallo Christoph,
[... Connect zur DB & Abfrage verhindern ...]
Gut, da hast du wahrscheinlich recht, ja.
Grüße,
CK
Hello,
Wie mach ich den so eine IP-Überprüfung, die vor dem Abschicken
prüft, ob diese IP-Adresse schon einmal einen Datensatz
eingepflegt hat oder nicht?Vorher ein entsprechendes SELECT abfeuern oder die Spalte auf UNIQUE
setzen.
In einer Multiuserumgebung, die das Internet ja wohl eindeutig darstellt, muss man dann aber das Select und das Insert durch ein Lock klammern, damit nicht jemand "dazwischenfummelt".
Besser wäre es aus DB-Sicht, einfach einen Unique-Index auf das Feld zu setzen und dann den Fehler abzufragen, was ordentliche Programmierer ja sowieso tun *gg*
Allerdings wird das ganze Unterfangen nicht sehr sinnvoll sein, da eine IP keinesfalls einen User über längeren Zeitraum identifiziert. IPs werden sehr kurzfristig wieder an den nächsten User weitergegeben. Ggf. wechselt der User mit jedem Click (Request) seine IP.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Moin!
Den Namen des Hosts, über den die Verbindung zustande kommt, kann man bei Apache ab 2.0 in $_SERVER['REMOTE_HOST'] ablesen. Ich glaube, der 1.3.x stellt dieses Feld noch nicht automatisch zur Verfügung. Da muss man dann eine Hosts-Abfrage machen.
Auch der Apache 2.0 wird den Rechnernamen nicht wissen können, ohne eine Reverse-DNS-Abfrage machen zu müssen. Und genau wie beim Apache 1.3 wird man das an- oder abstellen können, je nachdem, ob man einen recht kleinen Server mit wenigen Anfragen oder einen großen Server mit vielen Anfragen hat.
Aus Performancesicht für den Benutzer ist das ständige DNS-Abfragen jedenfalls ungünstig.
- Sven Rautenberg
Hallo Sven,
Den Namen des Hosts, über den die Verbindung zustande kommt,
kann man bei Apache ab 2.0 in $_SERVER['REMOTE_HOST'] ablesen.
Ich glaube, der 1.3.x stellt dieses Feld noch nicht automatisch
zur Verfügung. Da muss man dann eine Hosts-Abfrage machen.Auch der Apache 2.0 wird den Rechnernamen nicht wissen können,
ohne eine Reverse-DNS-Abfrage machen zu müssen. Und genau wie beim
Apache 1.3 wird man das an- oder abstellen können, je nachdem,
ob man einen recht kleinen Server mit wenigen Anfragen oder einen
großen Server mit vielen Anfragen hat.
Man wird es nicht nur koennen, man kann :-) Die entsprechende
Direktive ist HostnameLookups {On|Off}.
Aus Performancesicht für den Benutzer ist das ständige
DNS-Abfragen jedenfalls ungünstig.
Eindeutig. Und fuer den Provider ist der Traffic zu teuer, den diese
brauchen.
Grüße,
CK