Visualizzazione risultati 1 fino 24 di 24

Discussione: Blocco TOR

  1. #1
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito Blocco TOR

    Ciao a tutti
    Ho scoperto solo ieri mattina un codice che ha smesso di funzionarmi all'improvviso (ha sempre funzionato, fino a ieri).
    Come prima cosa ho creato un file chiamato blocco.inc.php

    Codice PHP:
    function ReverseIPOctets($inputip){
    $ipoc = explode(".",$inputip);
    return
    $ipoc[3].".".$ipoc[2].".".$ipoc[1].".".$ipoc[0];
    }

    function
    IsTorExitPoint(){
    if (
    gethostbyname(ReverseIPOctets($_SERVER['REMOTE_ADDR']).".".$_SERVER['SERVER_PORT'].".".ReverseIPOctets($_SERVER['SERVER_ADDR']).".ip-port.exitlist.torproject.org")=="127.0.0.2")
    {
    return
    1;
    } else {
    return
    0;
    }
    }
    Dopodiché, in una pagina che è nella stessa directory, ho ultimato la funzione:

    Codice PHP:
    require_once('blocco.inc.php');
    $IS_TOR_CONNECTION = IsTorExitPoint();
    if(
    $IS_TOR_CONNECTION > 0)
    {
    header("location: sgamato.php");
    }
    Solo che, all'improvviso, ha smesso di funzionarmi.
    Sapreste dirmi il motivo?
    Ultima modifica di personalthings : 24-08-2017 alle ore 20.16.13

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Cosa intendi per "smesso di funzionare"? Messaggi di errore? Ti aspetti che succeda qualcosa e invece succede qualcos'altro?

    PS: Usare 0 e 1 al posto dei valori booleani ha un retrogusto à la C, sarebbe preferibile usare true e false.

  3. #3
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Cosa intendi per "smesso di funzionare"? Messaggi di errore? Ti aspetti che succeda qualcosa e invece succede qualcos'altro?

    PS: Usare 0 e 1 al posto dei valori booleani ha un retrogusto à la C, sarebbe preferibile usare true e false.
    Ciao, buongiorno :)
    Ti ringrazio per la risposta prima di tutto.
    Niente, semplicemente l'IF viene riconosciuto come false e, pur usando TOR, il reindirizzamento alla pagina sgamato.php non avviene :) (fino a settimana scorsa, invece, non c'era nessun problema). Ed è strano perché in questo mese non ho toccato nulla.

    PS: Il tuo PS, soprattutto la parte corsiva, mi ha fatto sorridere tantissimo. Pur sostituendo il valore booleaniano con true e false, il risultato non cambia.

  4. #4
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    La funzione ritorna del testo cosa vietata per un redirect.. 1) racchiudi il valore dentro una variabile.. Grazie facci sapere
    Codice:
    IsTorExitPoint();
    /*Testo*/
    Ultima modifica di darbula : 26-08-2017 alle ore 10.23.36

  5. #5
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    La funzione ritorna del testo cosa vietata per un redirect.
    Ciao, ti ringrazio della risposta :)
    Perdonami, non ho proprio capito cosa intendi con questa parte e a quale funzione delle due tu ti riferisca (suppongo questa

    Codice PHP:
    function IsTorExitPoint(){
    ).
    Ultima modifica di personalthings : 26-08-2017 alle ore 11.04.42

  6. #6
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Niente, semplicemente l'IF viene riconosciuto come false e, pur usando TOR, il reindirizzamento alla pagina sgamato.php
    Capito, allora il problema deve essere nella funzione IsTorExitPoint. Ho visto che si basa su gethostbyname per controllare se un certa stringa che costruisci sia il nome di un host il cui indirizzo IPv4 risulti essere 127.0.0.2.
    Probabilmente c'è qualcosa che non va qui, o la stringa che costruisci è "sbagliata" (magari perché recentemente il servizio su cui ti appoggi ne ha modificato il formato), oppure è sbagliato il confronto e non è più 127.0.0.2 l'IP di riferimento. Oppure ancora il servizio/metodo che usi non dà garanzia di riconoscere gli exit point TOR nel 100% dei casi.
    Non conosco ip-port.exitlist.torproject.org, se riesci a darci qualche documentazione a riguardo diventa più facile inquadrare il problema :)



    PS: Il tuo PS, soprattutto la parte corsiva, mi ha fatto sorridere tantissimo. Pur sostituendo il valore booleaniano con true e false, il risultato non cambia.
    Certo, era solo una modifica "estetica" ;)

  7. #7
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Assembla le parole, cos'è considerato testo in tutti i linguaggi? Un testo non è altro che una rappresentazione grafica che può essere statico o dinamico... Altresì in un linguaggio sarebbe meglio chiamarlo sequenza di bytes (così si tiene in mente che non sono solo i caratteri stampabili ad essere compresi ma tutti i caratteri cioè qualsiasi sequenza di byte) .. L'istruzione di return senza variabili equivale a echo 0 o echo 1.. Leggiamo insieme la documentazione di header e return per require http://php.net/manual/en/function.header.php non è permesso alcun outup prima degli header.
    http://php.net/manual/en/function.return.php
    Beh prova stampando il valore dell'if
    Codice:
    if($a = ($IS_TOR_CONNECTION > 0))
    {
        header("location: sgamato.php");
    }
    var_dump($a);
    Ultima modifica di darbula : 26-08-2017 alle ore 11.42.17

  8. #8
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Citazione Originalmente inviato da darbula;1354085
    Beh prova stampando il valore dell'if
    [code
    if($a = ($IS_TOR_CONNECTION > 0))
    {
    header("location: sgamato.php");
    }
    var_dump($a);[/code]
    No no, avevo capito il concetto. Non avevo proprio capito cosa avevi scritto ahah
    Comunque la soluzione da te proposta è stata la seconda cosa che ho fatto l'altro ieri e, come risultato, mi ha restituito un umilissimo

    bool(false)
    Per questo, nella disperazione, ho aperto un topic.

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Non conosco ip-port.exitlist.torproject.org, se riesci a darci qualche documentazione a riguardo diventa più
    E' spiegato quihttps://www.torproject.org/projects/tordnsel.html.en

    In breve:

    Il primo codice effettua una chiamata a un servizio ospitato da TOR Project e confronta l´IP dell´utente con l´elenco dei server (gli exit node) inviando una risposta.
    La funzione ReverseIPOctets inverte le triplette di numeri che compongono l´ip address da verificare, dal momento che l´IP deve essere fornito in questo formato al servizio TOR che verifica la presenza dell´IP nell´elenco dei nodi d´uscita della rete TOR.
    L´Ip "invertito" viene passato alla funzione IsTorExitPoint che effettua materialmente la chiamata al servizio e controlla la risposta. Se la risposta e´ "127.0.0.2" l´IP fornito fa parte dei nodi d´uscita della rete TOR e viene riconosciuto come tale.
    Ultima modifica di personalthings : 26-08-2017 alle ore 12.00.30

  9. #9
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Chiaro!

    Suggerirei un controllo manuale delle stringhe utilizzate per il controllo, prima di procedere con idee più complicate.
    Codice PHP:
    function IsTorExitPoint() {
    $reversed_client = ReverseIPOctets($_SERVER['REMOTE_ADDR']);
    $port = $_SERVER['SERVER_PORT'];
    $reversed_server = ReverseIPOctets($_SERVER['SERVER_ADDR']);

    $query = $reversed_client . "." . $port . "." $reversed_server . ".ip-port.exitlist.torproject.org";
    echo
    "Query: " . $query . "\n";
    echo
    "Result: " . gethostbyname($query) . "\n";

    return (
    gethostbyname($query) == "127.0.0.2") ? 1 : 0;
    }
    la funzione è la stessa, scritta in maniera un po' più prolissa e chiara, con in più la stampa della stringa costruita. Prova a controllare se la stringa costruita in questo modo è ragionevole e, se lo è, prova ad interrogare il servizio manualmente con strumenti come dig o analoghi per controllare se i risultati ottenuti sono coerenti.

    PS: Come osservato da darbula, avendo aggiunto delle istruzioni echo nella funzione, il redirect non funzionerà, per il momento.
    Ultima modifica di mzanella : 26-08-2017 alle ore 12.54.58

  10. #10
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    funzione di return con variabile.
    Codice PHP:
    function ReverseIPOctets($inputip){
    $ipoc = explode(".",$inputip);
    return
    $ipoc[3].".".$ipoc[2].".".$ipoc[1].".".$ipoc[0];
    }

    function
    IsTorExitPoint(){
    $a = 0;
    if (
    gethostbyname(ReverseIPOctets($_SERVER['REMOTE_ADDR']).".".$_SERVER['SERVER_PORT'].".".ReverseIPOctets($_SERVER['SERVER_ADDR']).".ip-port.exitlist.torproject.org")=="127.0.0.2")
    {
    $a++;
    }
    return
    $a;
    }
    Cioè $a sarà uguale a 1 solo se è vera la condizione espressa, altrimenti $a sara uguale a 0 (come default o nel caso che la/le condizione/i espressa/e è falsa)
    Concettualmente la verifica IP può essere falsa positiva .. esistono ipv4 e ipv6 e non si tiene considerazione se si usa un proxy... La query al servizio di TorDNSEL in caso di esito positivo ti ritorna NXDOMAIN? c'è scritto nella documentazione :)
    Ultima modifica di darbula : 26-08-2017 alle ore 14.52.09

  11. #11
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Okay ragazzi, penso di aver capito l'origine dell'errore.
    Ho provato con due siti, che usano lo stesso codice.
    Solo che uno ha CloudFlare attivato (incluso l'https), l'altro no.
    Ebbene, nel secondo lo script funziona alla perfezione.

    A questo punto suppongo di dover aggiungere qualcosa al file .htaccess?
    Ultima modifica di personalthings : 26-08-2017 alle ore 14.54.57

  12. #12
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Anche se funziona può non essere codice valido... Header con output, non controlli bene l'ip è sono sicuro che la porta in HTTPS non sia la 443 cioè $_SERVER['SERVER_PORT'] punta sempre alla porta 80 (ricordo e spero di non sbagliarmi, altervista concede lo spazio d'archiviazione solo su http e non https) .. Quindi codice invalido ma funzionante
    Ultima modifica di darbula : 26-08-2017 alle ore 15.38.19

  13. #13
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Il che funzioni non vuole dire che sia scritto valido ;)
    Ho dimenticato di dire che ho usato il tuo codice ahah

  14. #14
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Leggi sopra ho modificato... Mi fai un esempio testuale della query per interrogare il servizio TorDNSEL? scusami se sono insistente :) uhm attualmente non ho idea su come differire con htpps poiché ne la porta (443) che HTTPS sono definiti per apache... Se ho capito bene tu devi prelevare l'indirizzo ip del visitatore beh devi sistemare la verifica ip (se esiste solo $_SERVER['REMOTE_ADDR'] oppure è seguito da uno o più proxy, verifica in modo sequenziale la validità dell'ip (range non riservati con filter_var() e bitmask ipv4 e ipv6)) al primo intoppo sospendi tutto altrimenti parsi i restanti ip.
    Disponibile da PHP 5.2.0 http://php.net/manual/en/function.filter-var.php
    Da PHP 5.2.10 è disponibile la verifica per il range reserved di ipv6
    http://php.net/manual/en/filter.filters.flags.php
    Prova se con HTTPS $_SERVER['SERVER_PORT'] rimane sull'80..
    Ultima modifica di darbula : 26-08-2017 alle ore 16.05.30

  15. #15
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Prova se con HTTPS $_SERVER['SERVER_PORT'] rimane sull'80..

    Sì, ho appena fatto una prova e resta su 80.

  16. #16
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Se ho capito bene hai due hostname differenti.. Con l'header Host: www.personalthings.altervista.org (con o senza www è un dominio differente ma risiede nello stesso ip per altervista)..
    Scegliamo quale server può essere con il protocollo (http default porta 80) invece nello script sarà 443..
    Codice PHP:
    $legal_host = strtolower('personalthings.altervista.org');
    $fake_host = strtolower($_SERVER['SERVER_NAME']);
    $port = 443;
    if(
    strpos($fake_host,'www.'.$legal_host) === 0 || $legal_host == $fake_host) {
    $port = 80;
    }
    $_SERVER['SERVER_NAME'] può essere falsificato se si è pensato di verificare solamente l' header Host per questo ho creato un valore fisso dentro la variabile $legal_host..
    Adesso potrebbe succedere che CloudFare blocchi le richieste da certi ip, quindi effettua la richiesta e controlla che risposta ti viene ritornata (3 tipi di risposta) NXDOMAIN,127.0.0.2,unknows)..
    Ultima modifica di darbula : 26-08-2017 alle ore 18.34.51

  17. #17
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Sì, avevo già provato una cosa simile questa mattina (non proprio così, ma ci si avvicina) ma il risultato è lo stesso.
    Sostanzialmente mettendo questo pezzo sopra il primo codice (in #1), l'HOST assume lo stesso nome (ad esempio: IP 1.1.1.1 Host 1.1.1.1)
    Con connessioni da browser normali, invece, l'host e l'IP sono corretti.

    La porta resta 80.
    Ultima modifica di personalthings : 26-08-2017 alle ore 18.52.02

  18. #18
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Se i dati https possono essere pubblici, mi stampi l'intero contenuto di $GLOBALS o $_SERVER? cerco di capire come differenziare da http... Però esiste solo http http://personalthings.altervista.org/ non è presente la versione del sito in https quindi potresti differire come ti ho mostrato prima e cioè con un valore fisso $legal_host
    Ultima modifica di darbula : 26-08-2017 alle ore 19.08.50

  19. #19
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Se i dati https possono essere pubblici, mi stampi l'intero contenuto di $GLOBALS o $_SERVER? cerco di capire come differenziare da http... Però esiste solo http://personalthings.altervista.org/ non ci sta in HTTPS quindi potresti differire come ti ho mostrato prima
    Inviato mex privato con dati :)

  20. #20
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Le variabili $_SERVER faranno sempre riferimento a http.. Mi dice sessione scaduta.. Devo controllare solamente $GLOBALS perché altrimenti non c'è modo da differire da http (crea una pagina con solo la stampa di $GLOBALS)... Il browser fa il dnslookup poi Se è attivo CloudFare lui le redirige al server e quindi capirai che lato server possiamo fare ben poco..
    Ultima modifica di darbula : 26-08-2017 alle ore 19.29.23

  21. #21
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Corretto

    EDIT: No, non avevo corretto.
    Ora è giusto.
    Ultima modifica di personalthings : 26-08-2017 alle ore 19.57.32

  22. #22
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Bene c'è quello che cercavamo... Adesso il problema è implementarlo..
    Tutte le richieste che fa un cliente potrebbero essere false, quindi si dovrebbe distinguere quando la richiesta sia originaria a CloudFare.. Se c'è una lista di cosa può aggiungere CloudFare abbiamo il principio di noto e cioè quello che noi conosciamo... Potrebbero esserci dei dati in più tipo i cookie, i vari proxy ma senza violare il principio di noto.. uhm in breve se la sicurezza non è importante si può fare riferimento alle variabili create da CloudFare (iniziano con il prefisso HTTP_CF_) ovviamente inizialmente sono header che tramite una regola imposta nel server aggiunge tali valori a $_SERVER... Purtroppo lo spazio di archiviazione risiede nel server privo di HTTPS anzi non ne è proprio a conoscenza di tale protocollo, ne deduciamo che solo le variabili per gli ip (proxy) e $_SERVER['SERVER_NAME'] con un confronto per l'autenticità del sito siano attendibili..
    C'è anche da considerare che potrebbero esistere richieste rivolte a http .. Qui c'è tutta la logica applicativa resta a te implementarla.
    Ultima modifica di darbula : 26-08-2017 alle ore 21.59.49

  23. #23
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Ti ringrazio mille darbula, con queste direttive sono riuscito a ultimare il problema :)
    Ti ringrazio della lezione teorica :)

  24. #24
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Prego figurati :)
    In caso di CloudFlare attivo si deve verificare l'IP (in realta esiste una sintassi per più ip il separatore è la virgola ma non è il caso di CloudFlare) $_SERVER['REMOTE_ADDR'] se non corrisponde a CloudFlare si nega l'accesso..
    PS. L'IP può essere ipv6 o ipv4 (dipende dal cliente)..
    Ps2. Il DNS lookup (riferito a http/https CloudFlare e cioè l'uri della barra del browser) è differente da $_SERVER['REMOTE_ADDR'] ma è sempre un ip di CloudFlare.
    Questo sovrascrive quanto detto prima... Verifica uguale sicurezza :)
    Perché tutto questo? Data la natura di internet gli indirizzi ip sono pubblici, si immagini di falsificare una richiesta con l'ip dove risiede fisicamente $_SERVER['SERVER_ADDR'] e un header Host: nick.altervista.org dove nick va modificato con il nome del proprio dominio
    Codice PHP:
    <?php
    $opts
    = array('http' =>
    array(
    'method' => 'GET',
    'header' => 'Host: nick.altervista.org'
    )
    );

    $context = stream_context_create($opts);

    $ip = '0.0.0.0'; // Dovrebbe esserci $_SERVER['SERVER_ADDR']
    $extra = '/'; // Deve esserci la root con eventuale percorso
    $result = file_get_contents('http://'.$ip.$extra, false, $context);

    echo
    $result;
    ?>
    Le richieste internet con CloudFlare attivo devono passare solo attraverso lui.
    Se altervista riuscisse a creare e mantenere aggiornata una variabile d'ambiente che segnali quando CloudFare è disattivato/attivato si potrebbero evitare conflitti (quando si disattiva temporaneamente CloudFlare).
    Per completezza la risoluzione (verificata da CloudFlare) ip reale del cliente sarà disponibile in $_SERVER['HTTP_CF_CONNECTING_IP'] ma non sarebbe una cattiva idea dover verificare se non sia un ip nel range dei riservati, ip CloudFlare, indirizzo/i del/i server.
    Ultima modifica di darbula : 28-08-2017 alle ore 13.34.31

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •