Intercettare array ip e spider

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)) { 
}
...
 

Shyson

Utente Attivo
19 Ago 2012
1.179
1
38
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"); 
...
 

Altutto

Utente Attivo
30 Set 2013
262
0
16
stubborn.altervista.org
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'
 

Shyson

Utente Attivo
19 Ago 2012
1.179
1
38
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.
 

Altutto

Utente Attivo
30 Set 2013
262
0
16
stubborn.altervista.org
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
 

Shyson

Utente Attivo
19 Ago 2012
1.179
1
38
Dovresti avere la pag. per capire (che non è neanche lunga. Di base deve bloccare quelli che intercetta nell'array e il mio tramite coockie.
 

Shyson

Utente Attivo
19 Ago 2012
1.179
1
38
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);  
?>
 

MarcoGrazia

Utente Attivo
15 Dic 2009
852
20
28
62
Udine
www.stilisticamente.com
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.
 

Shyson

Utente Attivo
19 Ago 2012
1.179
1
38
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.
 

Shyson

Utente Attivo
19 Ago 2012
1.179
1
38
Purtroppo il virtual host non c'è ancora. Come posso fare per ritardare di 2 secondi l'inserimento nel db?
 

Altutto

Utente Attivo
30 Set 2013
262
0
16
stubborn.altervista.org
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
 

Shyson

Utente Attivo
19 Ago 2012
1.179
1
38
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')");        
}
 

Shyson

Utente Attivo
19 Ago 2012
1.179
1
38
Non da più errore ma si inserisce ancora 2 volte nel db. Non si può intervenire nel db?
 
Discussioni simili
Autore Titolo Forum Risposte Data
Shyson Intercettare url nell'array e traformarlo con str_ireplace PHP 0
P intercettare JSON array vuoto PHP 0
Shyson Intercettare se parola nell'array è singolare o plurale PHP 21
nivaria.achinet Intercettare form solo dopo invio Javascript 1
P [PHP] Intercettare ed aggiornare campi di un database PHP 5
A [Javascript] intercettare errori JS Javascript 1
G [Javascript] Intercettare cambio applicazione Javascript 0
L Come intercettare un DataPicker? Javascript 0
X Intercettare cambio valore radio jQuery 1
G Intercettare le righe di una tabella taggate con "id" Javascript 2
M intercettare ultimo carattere stringa con PHP PHP 5
otto9due Leggere valore da array multidimensionale a chiavi dinamiche PHP 1
M Passaggio variabili array php su un tasto jq PHP 3
M Somma inversa di Array C/C++ 2
MarcoGrazia Iterazione array PHP 5
N Passare array da php a javascript PHP 5
G Ordinare un array multidimensionale PHP 4
H Errore su array associativo PHP 1
K Array senza ripetizioni Presentati al Forum 4
A Gestione array multidimensionale PHP 6
otto9due Più chiavi in array con array_key_exists() PHP 0
M Array associativi php su 2 campi mysql PHP 10
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
T PROBLEMA CON ARRAY PHP 8
L Sessione e array per utenti PHP 0
R Importazione csv su mysql tramite array PHP 2
elpirata Ricavare e stampare indirizzo ip da array associativo PHP 0
P Ciclare tra array di oggetti PHP 1
R Raggruppare valori array PHP 5
S Come conoscere la posizione di numeri in un array escludendo i doppioni PHP 4
D Popolare array PHP 8
R Includere elementi array fra apici PHP 1
P Array da foreach PHP 2
N Variabile di sessione è un array PHP7 PHP 3
R Scorporare array e recuperare record tabella PHP 10
A Contare gli elementi di un array PHP 13
A Importare array in mysql PHP 1
A Array di immagini Sviluppo app per Android 10
D Chiave unica in estrazione dati da array php PHP 0
D Spazio vuoto in un elemento di un array php PHP 2
S Come filtrare valori di un array PHP 4
mazman mysqli_query() mi ritorna un array vuoto anche se presente un record nella tabella PHP 13
A Non è un array e nemmeno un intero, che tipo di dato è? Javascript 1
max1974 PHP, Array Multidimensionale e Grafici PHP 22
S [PHP] Confrontare due array con valori quasi uguali PHP 2
MarcoGrazia [PHP] Unioni di due array con somma di valori PHP 6
R [PHP] Visualizzazione dati Array PHP 2
S [PHP] Eliminare doppioni array e rinumerare le posizioni PHP 2
M Importare - Manipolare Json Array Sviluppo app per Android 2
M [PHP] Problemi su inserimento array nel db PHP 7

Discussioni simili