Intercettare array ip e spider

  • Creatore Discussione Creatore Discussione Shyson
  • Data di inizio Data di inizio

Shyson

Utente Attivo
19 Ago 2012
1.179
1
38
Questo codice non mi funziona, devo bloccare gli spider e gli ip

PHP:
//Riconosce che è uno spider e non lo conteggia nei +Letti
function is_spider($agent) {
$spider = array("googlebot", "spider", "crawler", "scooter", "yahoo! slurp", "la_archiver", "lycos", "teoma_agent", "ask jeeves", "mercator", "fast", "msnbot", "bingbot", "facebookexternalhit");
//Qui metti gli ip che non vuoi vengano conteggiati nei +Letti
$bannedip = array('192.187.100.154','107.170.(.*)','213.42.176.216','38.99.82.(.*)','162.243.(.*)','104.131.217.168');
foreach( $bannedip as $check ) {
 if ( !strcmp( $_SERVER['REMOTE_ADDR'], $check))
 return true;
} 
foreach ($spider as $value) {
 if (stripos(strtolower($agent), $value) !== false) {
return true;
  }
}
return false;
}  
$agent = $_SERVER["HTTP_USER_AGENT"];
if (is_spider($agent)) { 
}
...
 
Non intercettava gli ip e gli spider, li faceva passare come conteggio di visite al sito, forse ti manca tutta la pagina.

Ora ho messo così, sembra che funzioni, solo che qualcosa non quadra

PHP:
function isBot() { 
$ip = $_SERVER["REMOTE_ADDR"]; 
$agent = $_SERVER["HTTP_USER_AGENT"];
   //Alcuni ip dinamci cambia solo l'ultima parte, perciò si scrivono così, es: 107.170.56 si scrive 107.170.
    $bot = array("googlebot","spider","crawler","scooter","yahoo! slurp","la_archiver","lycos","teoma_agent","ask jeeves","mercator","fast","msnbot","bingbot","facebookexternalhit", 
    "192.187.100.154","107.170.","213.42.176.216","38.99.82.","162.243.","104.131.217.168"); 

foreach ($bot as $item) { 
    if ( stripos($agent, $item) > -1 ) { 
        return TRUE; 
 } 
    if ( stripos($ip, $item) > -1 ) { 
        return TRUE; 
    } 
} 
return FALSE; 
}

Es, se metto così, lo blocca, ho visto che lo intercetta anche se non sono uguali.


PHP:
$ip = "453.10.65"; 
    $bot = array("192.187.100.154"); 
...
 
Sicuramente sbaglio qualcosa io, però usando (sempre con php 5.5.8) il tuo codice in questo modo:
PHP:
<?php
function isBot() { 
$ip = "453.10.65"; 
$agent = $_SERVER["HTTP_USER_AGENT"];
   //Alcuni ip dinamci cambia solo l'ultima parte, perciò si scrivono così, es: 107.170.56 si scrive 107.170.
    $bot = array("googlebot","spider","crawler","scooter","yahoo! slurp","la_archiver","lycos","teoma_agent","ask jeeves","mercator","fast","msnbot","bingbot","facebookexternalhit", 
    "192.187.100.154","107.170.","213.42.176.216","38.99.82.","162.243.","104.131.217.168"); 

foreach ($bot as $item) { 
    if ( stripos($agent, $item) > -1 ) { 
        return TRUE; 
 } 
    if ( stripos($ip, $item) > -1 ) { 
        return TRUE; 
    } 
} 
return FALSE; 
}  
$controllo = isBot();
if($controllo){echo 'è un bot';}
else{echo 'non è un bot';}
?>
Ottengo come output 'non è un bot'
 
E' strano.

La modifica del codice era nata perché come puoi vedere nel primo post, ci sono degli ip con (.*) e questo simbolo che vuol dire "qualsiasi cosa", non veniva intercettato, es: 107.170.(.*)

Adesso sono confuso anch'io.
 
I misteri della programmazione ahahah
Magari c'è qualche altro codice che interferisce (del tipo, con nomi di variabile uguali), potresti provare a metterlo in una pagina a parte e vedere se ti dice ancora che quell'ip appartiene ad un bot
 
Dovresti avere la pag. per capire (che non è neanche lunga. Di base deve bloccare quelli che intercetta nell'array e il mio tramite coockie.
 
Tieni presente che deve bloccare me (c'è il coockie) + tutti quelli che intercetta

PHP:
<?php 

function isBot() { 
$ip = $_SERVER['REMOTE_ADDR']; 
$agent = $_SERVER["HTTP_USER_AGENT"];
   //Alcuni ip dinamci cambia solo l'ultima parte, perciò si scrivono così, es: 107.170.56 si scrive 107.170.
    $bot = array("googlebot","spider","crawler","scooter","yahoo! slurp","la_archiver","lycos","teoma_agent","ask jeeves","mercator","fast","msnbot","bingbot","facebookexternalhit", 
    "192.187.100.154","107.170.","213.42.176.216","38.99.82.","162.243.","104.131.217.168"); 

foreach ($bot as $item) { 
    if ( stripos($agent, $item) > -1 ) { 
        return TRUE; 
 } 
    if ( stripos($ip, $item) > -1 ) { 
        return TRUE; 
    } 
} 
return FALSE; 
}  

//Mette i dati nel DB e aumenta il contatore ad ogni visita 
function contatore($pagina) {  
//RICORDA di memorizzare l'url cookie.php +invio IN TUTTI I BROWSERs 
if (empty($_COOKIE["contavisite"])) { //Richiama il cookie che c'è in cookie.php 
  $continua = false;  
  if (isset($_SERVER['HTTP_REFERER']) != "") { 
  $from = parse_url($_SERVER['HTTP_REFERER']); 
  $from = $from['host']; 
}  
else { 
  $from = ""; 
}  
$whitelist = array(  
/*Qui scrivi l'url del mio sito in modo che quando l'utente vi arriva DA TERZI, anche se digita url +pagine, il contatore non sale. 
Se poi è nel mio sito e ci clicca su, ovviamente il contatore nel db sale*/ 
"localhost" //Scrivi gli url senza http:// 
  ); 
  foreach ($whitelist as $sito) {  
    if ($from == $sito) $continua = true;  
  }  
if ( isBot() ) { 
} 
else {  
if ($continua) {  
    $data_localeS=time(); 
    $mysqli = new mysqli("localhost", "root", "root", "gruppoalveo");     
    $giorno=array('Dom','Lun','Mar','Mer','Gio','Ven','Sab');  
    $mese=array('gen','feb','mar','apr','mag','giu','lug','ago','set','ott','nov','dic'); 
    $dataGmtS=$giorno[date('w')].' '.date('d').' '.$mese[date('m')-1].' '.date('Y - H:i:s'); 
    $ip = $_SERVER['REMOTE_ADDR'];  
    $url = $_SERVER['PHP_SELF'];   
    $esiste = $mysqli->query ("SELECT * FROM visitate WHERE url='$url'");  
    if ($esiste->num_rows == 0) {  
       $visite = 1;   
       $mysqli->query ("INSERT INTO visitate(data_localeS, dataGmtS, pagina, url, visite, ip)  
                                VALUES ('$data_localeS', '$dataGmtS', '$pagina', '$url', '$visite', '$ip')");        
}  
else {  
      $old = $esiste->fetch_array(MYSQLI_ASSOC);    
      $visite = $old['visite'] + 1;  
      $mysqli->query("UPDATE visitate SET data_localeS='$data_localeS', dataGmtS='$dataGmtS', pagina='$pagina', visite='$visite', ip='$ip' WHERE url='$url'");  
    }  
  }  
}    
} 
 } 
//Estrae i dati dal DB e crea la sequenza delle pagine più viste   
$mysqli = new mysqli("localhost", "root", "root", "gruppoalveo");   
   $pag_viste = $mysqli->query("SELECT * FROM visitate ORDER BY visite DESC LIMIT 0,8"); //Visualizza il numero di items 
  if ($pag_viste->num_rows > 0) { 
    echo "<div class=\"menuVisti\">"; 
    while ($link = $pag_viste->fetch_array(MYSQLI_ASSOC)) {   
    echo "<div class=\"numeroVisite\">".$link["visite"]." volte</div>";   
    echo "<a class=\"visti\" href='".$link['url']."'>&bull;&nbsp;&nbsp;&nbsp;".$link['pagina']."</a>"; 
    } 
  echo "</div>"; 
  } 

error_reporting (E_ALL);  
?>
 
Shyson, sul server dove l'hai provato tu queste due istruzioni che cosa riportano?
$ip = $_SERVER['REMOTE_ADDR'];
$agent = $_SERVER["HTTP_USER_AGENT"];

il valore di ritorno di stripos puoi confrontarlo con l'operatore ternario piuttosto che usare > -1
if ( stripos($agent, $item) === true ) {
ma nell'insieme non mi pare per quanto io guardi che ci siano errori di sorta.
 
Ho fatto una prova con un visitatore, quando lui clicca un link, nel Database segna 2 volte per via del reindirizzamento doppio. Perciò, fino a quando Altervista non si decide a mettere un virtual host, è così. La soluzione è mettere un "tempo" di 1 secondo per posticipare l'inserimento nel database, ma non so cosa toccare.
 
Purtroppo il virtual host non c'è ancora. Come posso fare per ritardare di 2 secondi l'inserimento nel db?
 
Ciao,
Neanche io noto errori nel codice completo, l'ho provato anche sul mio sito hostato su altervista e funziona...
Se vuoi evitare di inserire due visite in caso di reindirizzamento, potresti usare:
PHP:
header("Location: http://example.com/paginaacuireindirizzare");
Prima del codice che inserisce le visite.
Se invece preferisci posticiparlo, potresti usare AJAX per richiamare il codice dopo alcuni millisecondi, ma temo che verrebbe qualcosa di poco preciso visto che javascript si può disattivare e l'utente potrebbe lasciare la pagina prima che il codice sia eseguito
 
Ho messo così se lo metto prima da errore

PHP:
if ($esiste->num_rows == 0) {  
       $visite = 1;   
      header("Location: echo $_SERVER['PHP_SELF'];");
       $mysqli->query ("INSERT INTO visitate(data_localeS, dataGmtS, pagina, url, visite, ip)  
                                VALUES ('$data_localeS', '$dataGmtS', '$pagina', '$url', '$visite', '$ip')");        
}
 
Non da più errore ma si inserisce ancora 2 volte nel db. Non si può intervenire nel db?
 

Discussioni simili