Sehnal jsem funkci Get_Visitor_Identifier(), je na identifikaci uživatele. Najdete ji na:
http://unas.unas.cz/visitor.txt
Problém je v tom, že mi ta funkce cosi posílá na výstup (ještě jsem nezjišťoval co). Nevidím tam ale žádné echo ani set_cookie, takže se tomu divím.
Když funkci neuzavřu mezi:
Ob_Start();
$visitor = Get_Visitor_Identifier();
Ob_End_Clean();
Tak už se mi patrně neodešlou XML hlavičky na konci skriptu a díky tomu nic nefunguje tak jak má. Na webzdarma jsem tyhle problémy neměl, ale na placeném hostingu vznikly (PHP 4.4.2).
Napadá vás vysvětlení?
Co děláš s tím returnem? Tenhle skript po zběžném shlédnutí nic nevypisuje... zkus tu fci spustit v jinak prázdném dokumentu a uvidíš.
IMHO by bylo zahodno skript prepsat, aby pouzival superglobalni $_SERVER['REMOTE_ADDR'] misto $REMOTE_ADDR a podobne, protoze skript nebude fungovat, pokud jsou vypnuty register_globals, coz muze byt ten rozdil mezi wz (reg. glob. zapnute) a tim druhym hostingem (nevim, jestli by to mohlo vypisovat i nejakou chybu).
Jé, to zkoušel spustit jenom jako deklaraci funkce, ale ono to vypisuje warning až když tu funkci spustím (no jo pochopitelně :o)
Warning: gethostbyaddr(): Address is not a valid IPv4 or IPv6 address in /httpd/html/kolbdancecz/www/include/F_Get_Visitor_Identifier.php on line 72
Takže tý hlášce ale stejnak moc nerozumim. Co je to IPv4 a IPv6?
Jinak s tim $_SERVER má donny pravdu. To přepíšu.
>> Address is not a valid IPv4 or IPv6 address
Zadana adresa neodpovida formatu IP adresy. Proste tam davas neco jineho nez XXX.XXX.XXX.XXX, kde XXX je od 0 do 255.
>> Co je to IPv4 a IPv6?
Zkracene IP adresa. v4 a v6 jsou verze. Dnes se nejvice pouziva IPv4. IPv6 je "novejsi" verze, ktera se ale nejak masove nepouziva. Rozdil mezi nimi je v rozsahu adres. IPv6 nabizi mnohonasobne vic adres nez IPv4.
Jo ták, už mi buňky v mozku seply. Je to jak říkal donny. Register globals je OFF a tak on nezná tu adresu (jak vysvětluje zase Tomík). Díky vám všem.
Opravil jsem to všechno na $_SERVER[''] a už to fachá bez warningu. Kdyby to někdo potřeboval, tu je funkční verze.
Typické použití - při přihlášení se uloží výstup funkce do $_SESSION[''][''] a při ověřování uživatele se pak porovnává obsah session s aktuálním výstupem funkce.
<?php
function Get_Visitor_Identifier ()
{
if($_SERVER['HTTP_X_FORWARDED_FOR']) {
$b = Ereg("^([0-9]{1,3}\.){3,3}[0-9]{1,3}", $_SERVER['HTTP_X_FORWARDED_FOR'], $array);
if ($b && (Count($array)>=1)) {
return (GetHostByAddr($array[0]));
}
else {
return ($_SERVER['REMOTE_ADDR'].'_'.$_SERVER['HTTP_VIA'].'_'.$_SERVER['HTTP_X_FORWARDED_FOR']);
}
}
elseif($_SERVER['HTTP_X_FORWARDED']) {
$b = Ereg("^([0-9]{1,3}\.){3,3}[0-9]{1,3}", $_SERVER['HTTP_X_FORWARDED'], $array);
if ($b && (Count($array)>=1)) {
return (GetHostByAddr($array[0]));
}
else {
return ($_SERVER['REMOTE_ADDR'].'_'.$_SERVER['HTTP_VIA'].'_'.$_SERVER['HTTP_X_FORWARDED']);
}
}
elseif($_SERVER['HTTP_X_FORWARDED_FOR']) {
$b = Ereg("^([0-9]{1,3}\.){3,3}[0-9]{1,3}", $_SERVER['HTTP_X_FORWARDED_FOR'], $array);
if ($b && (Count($array)>=1)) {
return (GetHostByAddr($array[0]));
}
else {
return ($_SERVER['REMOTE_ADDR'].'_'.$_SERVER['HTTP_VIA'].'_'.$_SERVER['HTTP_X_FORWARDED_FOR']);
}
}
elseif($_SERVER['HTTP_FORWARDED']) {
$b = Ereg ("^([0-9]{1,3}\.){3,3}[0-9]{1,3}", $_SERVER['HTTP_FORWARDED'], $array);
if ($b && (Count($array)>=1)) {
return (GetHostByAddr($array[0]));
}
else {
return ($_SERVER['REMOTE_ADDR'].'_'.$_SERVER['HTTP_VIA'].'_'.$_SERVER['HTTP_FORWARDED']);
}
}
elseif($_SERVER['HTTP_VIA']) {
return ($_SERVER['HTTP_VIA'].'_'.$_SERVER['HTTP_X_COMING_FROM'].'_'.$_SERVER['HTTP_COMING_FROM']);
}
elseif($_SERVER['HTTP_X_COMING_FROM'] || $_SERVER['HTTP_COMING_FROM']) {
return ($_SERVER['REMOTE_ADDR'].'_'.$_SERVER['HTTP_X_COMING_FROM'].'_'.$_SERVER['HTTP_COMING_FROM']);
}
else {
return (MD5(GetHostByAddr($_SERVER['REMOTE_ADDR']).$_SERVER['HTTP_USER_AGENT']));
}
}
?>
Trochu jsem to prepsal. Co takhle toto:
<?php
function ip2int($ip) {
$ex = explode(".", $ip);
if (count($ex)!=4) return -1;
list($a, $b, $c, $d) = $ex;
$a = $a*16777216;
$b = $b*65536;
$c = $c*256;
$ret = $a+$b+$c+$d;
if ($ret<0) {return 0;}
else {return $ret;}
}
/*function by Marc Meurrens*/
function Get_Visitor_Identifier ()
{
if($_SERVER['HTTP_X_FORWARDED_FOR'])
{
// case 1.A: proxy && HTTP_X_FORWARDED_FOR is defined
$b = Ereg ("^([0-9]{1,3}\.){3,3}[0-9]{1,3}", $_SERVER['HTTP_X_FORWARDED_FOR'], $array) ;
if ($b && (Count($array)>=1) )
{ return ( GetHostByAddr($array[0]) ) ; } // first IP in the list
else
{ return ( ip2int($_SERVER['REMOTE_ADDR']) . '_' . ip2int($_SERVER['HTTP_VIA']) . '_' . ip2int($_SERVER['HTTP_X_FORWARDED_FOR']) ) ; }
}
elseif($_SERVER['HTTP_X_FORWARDED'])
{
// case 1.B: proxy && HTTP_X_FORWARDED is defined
$b = Ereg ("^([0-9]{1,3}\.){3,3}[0-9]{1,3}", $_SERVER['HTTP_X_FORWARDED'], $array) ;
if ($b && (Count($array)>=1) )
{ return ( GetHostByAddr($array[0]) ) ; } // first IP in the list
else
{ return ( ip2int($_SERVER['REMOTE_ADDR']) . '_' . ip2int($_SERVER['HTTP_VIA']) . '_' . ip2int($_SERVER['HTTP_X_FORWARDED']) ) ; }
}
elseif($_SERVER['HTTP_FORWARDED_FOR'])
{
// case 1.C: proxy && HTTP_FORWARDED_FOR is defined
$b = Ereg ("^([0-9]{1,3}\.){3,3}[0-9]{1,3}", $_SERVER['HTTP_FORWARDED_FOR'], $array) ;
if ($b && (Count($array)>=1) )
{ return ( GetHostByAddr($array[0]) ) ; } // first IP in the list
else
{ return ( ip2int($_SERVER['REMOTE_ADDR']) . '_' . ip2int($_SERVER['HTTP_VIA']) . '_' . ip2int($_SERVER['HTTP_FORWARDED_FOR'] )) ; }
}
elseif($_SERVER['HTTP_FORWARDED'])
{
// case 1.D: proxy && HTTP_FORWARDED is defined
$b = ereg ("^([0-9]{1,3}\.){3,3}[0-9]{1,3}", $_SERVER['HTTP_FORWARDED'], $array) ;
if ($b && (count($array)>=1) )
{ return ( GetHostByAddr($array[0]) ) ; } // first IP in the list
else
{ return ( ip2int($_SERVER['REMOTE_ADDR']) . '_' . ip2int($_SERVER['HTTP_VIA']) . '_' . ($_SERVER['HTTP_FORWARDED']) ) ; }
}
elseif($_SERVER['HTTP_VIA'])
{
// case 2:
// proxy && HTTP_(X_) FORWARDED (_FOR) not defined && HTTP_VIA defined
// other exotic variables may be defined
return ( ip2int($_SERVER['HTTP_VIA']) .
'_' . ip2int($_SERVER['HTTP_X_COMING_FROM']) .
'_' . ip2int($_SERVER['HTTP_COMING_FROM'])
) ;
}
elseif( $_SERVER['HTTP_X_COMING_FROM'] || $_SERVER['HTTP_COMING_FROM'] )
{
// case 3: proxy && only exotic variables defined
// the exotic variables are not enough, we add the REMOTE_ADDR of the proxy
return ( ip2int($_SERVER['REMOTE_ADDR']) .
'_' . ip2int($_SERVER['HTTP_X_COMING_FROM']) .
'_' . ip2int($_SERVER['HTTP_COMING_FROM'])
) ;
}
else
{
// case 4: no proxy
// or tricky case: proxy+refresh
return ip2int($_SERVER['REMOTE_ADDR']);
}
}
echo Get_Visitor_Identifier ();
?>