Newsgroup: it.comp.www.php
Titolo: Script per validazione Url (era: espressione regolare per url)

Ciao a tutti,
ho cambiato denominazione al thread perchč ho ritenuto migliore procedere 
secondo un altra strada per la validazione di una url.
In sostanza, fornita l'url, fare in modo che il sistema tentando un accesso 
all'url indicata verifichi se il webserver restituisca o meno un errore.
Qualche script, classe in merito da suggerire?
Credo che questa soluzione sia piů efficiente in quanto una url pur essendo 
corretta sintatticamente potrebbe indurre a un indirizzo internet 
inesistente e in questo modo, posso verificare a priori se č corretta e al 
tempo stesso se l'indirizzo internet scritto esiste (č raggiungibile, privo 
di errori dal webserver) oppure no.
Grazie in anticipo,
Cooper.
-- 
www.blueware.it
www.italchat.it
 

di errori dal webserver) oppure no.
E' un po' come tenere la porta di casa aperta per non dover cercare tutte
le volte la chiave. In teoria e' un'ottima idea, ed in un mondo ideale ti
funzionerebbe in modo grandioso.
In pratica, purtroppo...
Leonardo
-- 
Dawn is near, the time is short (Human aircraft! Hard to port!)
We eight reindeers of the night work as one in silent flight.
Let not one damn house pass by (Who taught that guy how to fly?)
Each year sees more girls and boys: how many of them can we bring toys?


Perchè la paragoni alla porta di casa? la casa è di tua proprietà privata, 
il sito internet a cui si tenta di accedere è di pubblico dominio.
Quello che voglio fare si può tranquillamente fare manualmente, basta 
inserire l'url nel browser e controllare, non eppure non mi sembra che stia 
entrando in questo modo abusivamente nella tua casa come un ladro.
Se cosi fosse, digitando l'url dal browser dovrei avere restituito il 
messaggio: spiacente, ma qui non puoi entrare è proprietà privata... e in 
quel caso pazienza, non muore nessuno.
In altre parole, quello che ho chiesto, non è altro che una versione 
elementare di spider, ovvero un principio ampliamente usato dai motori di 
ricerca per indicizzare le pagine.
Nel mio caso, non mi serve per questo, ma semplicemente per validare un 
form, dove l'utente inserendo l'url del sito internet, sia in grado di 
stabilire se questa url è valida oppure no, basandomi sulla raggiungibilità 
o meno del sito internet a cui l'url fa riferimento.
Infatti, se il sito non è raggiungibile la validazione fallirebbe pur 
essendo corretta semanticamente l'url, mentre se il sito è raggiungibile 
implica che è corretta semanticamente anche l'url.
Quindi in conclusione non chiedo nulla che sia sbagliato, chiedo solo lo 
script (o la classe) sicuramente già sviluppata, che mi consenta ciò dal 
momento che è una problematica comune in parecchi ambiti di applicazione.
Grazie ancora,
Cooper.
-- 
www.blueware.it
www.italchat.it
 

momento che è una problematica comune in parecchi ambiti di applicazione.
OK, OK. Non ti scaldare :-)
Puoi usare
	if file_exists($url)
	{
		print "$url e' valido";
	}
...devi avere i fopen_wrapper abilitati.
Per curiosita': tu sei nel giusto, MA IO NO. Io posso essere stronzo come
mi pare, no? Siamo persone diverse. Tu, non fai nulla di sbagliato: pero'
io posso farlo e lo faccio.
Allora, se io - stronzolo - volessi validare
 
http://www.poliziadistato.it/searcher.asp?q=DOVE+TROVO+FILM+PEDO
?
...il tuo server cosa farebbe, di preciso? (E che ne penserebbero, quelli
di 
www.poliziadistato.it
 ?).
(Il caso di un vulnerability scan di host di terze parti e' lasciato come
esercizio per lo studente).


 Leonardo
David
- --
Linux Registered User #334216
Get FireFox! >> 
http://www.spreadfirefox.com/?q=affiliates&id=48183&t=1
Staff >> 
http://www.debianizzati.org
 <<
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.9.20 (GNU/Linux)
Comment: Using GnuPG with Mozilla - 
http://enigmail.mozdev.org
iD8DBQFE/D/j5sXXcRsFI+cRAspsAJsGXhFtu+I3VjGL2KcD78LWMd66CwCdEzRm
+pEVShzz8Awjn/CFIyBDyTk=
=9Uud
-----END PGP SIGNATURE-----


Ho risposto sopra :)
Ma ripeto, come per le email, a me ribadisco, mi interessa qualcosa che 
passato in input l'url, interroghi il webserver, e quest'ultimo restituisca 
l'errore 404 o equivalente se la pagina non esiste, non è raggiungibile etc 
o il codice X (non ricordo quale codice restituisce) in caso in cui non 
trova alcun errore.
Tutto qui, non sei a conoscenza di una classe già testate e funzionante in 
tal modo da consigliarmi?


 da consigliarmi?
No :-)
Ma ti suggerisco almeno di schermarlo con CAPTCHA o altri sistemi che non
lo rendano facilmente scriptabile.



Ok grazie della dritta, io avevo trovato qualcosa qui:
http://www.zend.com/zend/spotlight/securevariablepart1.php
suddiviso in 4 parti, in cui spiega il tutto, farebbe al caso mio, ma non 
riesco a trovare lo script completo, e ricostruirlo da li si è fattibile, ma 
non masticando molto bene l'inglese mi viene piu difficile, hai 
dimistichezza con quel sito?
Mi sapresti eventualmente dire se riesci a trovare lo script completo, già 
pronto da scaricare?
Grazie ancora, per la disponibilità.
Cooper.
-- 
www.blueware.it
www.italchat.it
 

 ha scritto nel messaggio 
news:mclof2pf37ko2pafj...@4ax.com...
[cut]
Ho provato a ricostruire lo script di cui al 
http://www.zend.com/zend/spotlight/php-link-validation1.php
 riporto il 
codice ottenuto seguendo passo passo:
<?php
    $timeout = 30;
    $check_freq = 300;
    $statuses = array();
    $hostnames = array();
    session_register('statuses');
    session_register('hostnames');
    function flush_cache() {
       global $statuses;
       global $hostnames;
       $statuses = array();
       $hostnames = array();
     }
    function disp_link($url, $text='') {
       global $timeout;
       global $statuses;
       global $hostnames;
       global $check_freq;
       $now = time();
       $e = error_reporting();
       error_reporting($e & (E_ALL-E_WARNING));
    if 
(!preg_match('/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\//i', 
$url, $m)) {
          $sstatus = '';
        } else {
          $proto=$m[1];
          $hostname=strtolower($m[2]);
          $port=$m[3];
          if (preg_match('/^\d+\.\d+\.\d+\.\d+/', $hostname)) {
             $ip = $hostname;
           } else {
             $from_cache=false;
             if (isset($hostnames[$hostname])) {
               if ($now - $hostnames[$hostname][1] <= $check_freq) {
                  $ip = $hostnames[$hostname];
                  $from_cache=true;
                }
              }
             if (!$from_cache) {
                $ip = gethostbyname($hostname);
                if ($ip === $hostname) { $ip=''; }
                $hostnames[$hostname]=array($ip,$now);
              }
             if (!$ip) {
                $sstatus = 'HOST NOT FOUND';
              } else {
                if (!$port) {
                   switch ($proto) {
                     case 'http':  $port = 80;
                       break;
                     case 'https': $port = 443;
                       break;
                     case 'ftp':   $port = 21;
                       break;
                    }
                 }
                $key = "$ip:$port";
                $from_cache = false;
                if (isset($statuses[$key])) {
                   if ($now - $statuses[$key][2] <= $check_freq) {
                      $sstatus = $statuses[$key][0];
                      $from_cache = true;
                    }
                 }
                if (!$from_cache || ($from_cache && ($sstatus != "OK"))) {
                   $fp = fsockopen($ip, $port, &$errno, &$errstr, $timeout);
                 }
                if ($fp) {
                   $sstatus = "OK";
                   fputs( $fp, sprintf( "GET %s HTTP/1.0\n\n", $url ) );
                   for ($try = 1; $try <= 3; $try++) {
                       $fstatus = "CHECKING";
                       if (($got = fgets ($fp, 256)) == NULL) {
                          break;
                        }
                  if (eregi ("HTTP/1.(.) (.*) (.*)", $got, $parts)) {
                          switch($parts[2]) {
                              case 200:
                                $fstatus = "FOUND";
                              case 300:
                                $fstatus = "MOVED";
                              case 403:
                                $fstatus = "RESTRICTED";
                              case 404:
                                $fstatus = "NOT FOUND";
                              default:
                                $fstatus = "ERROR (Code {$parts[2]})";
                            }
                        } else {
                          $fstatus = "Bad Comms";
                        }
                    } // End of for statement
     } else { // Occurs when if ($fp) returns false
                   switch ($errstr) {
                       case 'timed-out':
                         $sstatus = "TIMEOUT";
                       case 'refused':
                         $sstatus = "UNAVAILABLE";
                       default:
                         $sstatus = "UNKNOWN (DOWN)";
                        }
                     }
                   $statuses[$key] = array($sstatus, $fstatus, $now);
                 } // End of check  for  server document validation
              } // End of check of the host name was resolved
        } // End of check to determine properly formatted URL
       error_reporting($e);
       return array('url' => $url,
         'text' => ($text) ? $text : htmlentities($url),
         'sstatus' => $sstatus,
         'fstatus' => $fstatus);
     }
 ?>
tuttavia facendo una prova del tipo:
 <pre>
    <?php
          print_r (disp_link(
www.miodominio.it
, ''));
       ?>
 </pre>
non funziona :( č probabile che abbia sbagliato qualcosa, durante la 
procedura di copia e incolla anche se mi sembra strano, č piů facile che 
abbia messo qualche blocco di codice nel posto sbagliato :(
Chi ha la pazienza di controllare puň vedere se e dove ho commesso errori? e 
darmi eventuali dritte?
Grazie in anticipo.
Cooper.
-- 
www.blueware.it
www.italchat.it