In un precedente articolo vi ho parlato di come sia possibile effettuare una richiesta POST verso un sito Web utilizzando Java, con il meccanismo dei Socket. Il metodo che vi avevo illustrato si basava principalmente sull’analisi del form presente nella pagina Web che normalmente si occupa dell’invio dei dati. Quindi successivamente in Java, si inviavano i dati al Server Web sostituendosi al Browser ed inviando gli stessi dati che il form avrebbe inviato.

Il problema, o la limitazione principale di questa tecnica, è che non tiene conto di altri eventuali dati che il Browser potrebbe inviare al Server Web. Ad esempio, il Browser quando invia qualsiasi richiesta GET o POST invia anche un identificativo di esso, tramite il parametro User-Agent. Il Server Web che riceve una richiesta GET o POST, potrebbe analizzare i dati che riceve, e non accettare tutte le richieste dove questo parametro non è impostato. Da notare che questo parametro non compare assolutamente nel codice HTTP della pagina.

Il parametro User-Agent non è l’unico utilizzato dai Server Web per scartare richieste non provenienti da Browser comuni. Esistono molti altri parametri, che possono essere utilizzati a tale scopo. In questo articolo, utilizziamo Live HTTP Headers per sniffare tutto il traffico HTTP da e verso il Server Web, per capire quindi come configurare nel migliore dei modi il programma Java visto nel precedente articolo.

Live HTTP Headers è un plug-in per Firefox che permette di monitorare tutte le richieste che il Browser fa al Server Web, e tutte le risposte inviate da esso. In questo modo, è possibile visualizzare esattamente una richiesta POST inviata verso il Server, e quindi riprodurla fedelmente in Java. Nel seguito, vediamo come ci si dovrebbe comportare nel caso in cui si volesse riprodurre in Java un meccanismo di login presso un Sito Web, simile, ma più potente, a quello visto nel precedente articolo.

Login su Facebook

Per realizzare questo esempio ho preso come cavia il sito Web più conosciuto al mondo, Facebook. Il meccanismo di login di Facebook è molto semplice, e del tutto analogo a molti altri metodi utilizzati dalla maggior parte dei siti web.

Come prima analisi del sito, si può visualizzare il codice HTML ed individuare il form che effettua il login. Questo passaggio sarà successivamente reso superfluo dall’uso di Live HTTP Headers, però è comunque interessante capire come realizzano alcune tecniche. Di seguito, potete vedere la porzione di codice HTML dove viene costruito il form dell’immagine precedente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<form method="POST" action="https://login.facebook.com/login.php?login_attempt=1" id="login_form">
    <input type="hidden" name="charset_test" value="&euro;,´,€,´,æ°´,Д,Є" />
    <input type="hidden" id="locale" name="locale" value="it_IT" autocomplete="off" />

    <table cellpadding="0" cellspacing="0">
        <tr>
            <td class="login_form_label_field login_form_label_remember">
                <input type="checkbox" class="inputcheckbox" value="1" id="persistent" name="persistent" tabindex="3" />
                <label id="label_persistent" for="persistent">Resta collegato</label>  
            </td>
            <td class="login_form_label_field">
                <a href="http://www.facebook.com/reset.php" rel="nofollow">Hai dimenticato la password?</a>
            </td>
            <td class="login_form_last_field login_form_label_field">
            </td>
        </tr>
        <tr>
            <td>
                <input type="text" class="inputtext  DOMControl_placeholder" title="E-mail" placeholder="E-mail" id="email" name="email" value="E-mail" tabindex="1" />
            </td>
            <td>
                <input type="password" class="inputpassword" id="pass" name="pass" value="" tabindex="2" />
                <input type="text" class="inputtext hidden_elem DOMControl_placeholder" id="pass_placeholder" name="pass_placeholder" value="" tabindex="2" />
            </td>
            <td class="login_form_last_field">
                <div class="inner">
                    <label class="uiButton uiButtonConfirm uiButtonMedium">
                        <input value="Accedi" tabindex="4" type="submit" />
                    </label>
                </div>
            </td>
        </tr>
    </table>

    <input type="hidden" name="charset_test" value="&euro;,´,€,´,æ°´,Д,Є" />
    <input type="hidden" id="lsd" name="lsd" value="VwSKT" autocomplete="off" />
</form>

Una volta fatta una prima analisi della pagina Web, e di come il form invia i dati al Server, vediamo di iniziare ad imparare ad usare Live HTTP Header. Innanzitutto, bisogna scaricare ed installare il plug-in per Firefox, da link apposito: Live HTTP Headers Download. Una volta installato, il plug-in sarà disponibile dal meù Strumenti.

Una nota molto importante, è che una volta avviato il plug-in, questo visualizzerà tutte le richieste HTTP che al momento Firefox sta effettuando. Quindi abbiate l’accortezza di posizionarvi sulla pagina che volete monitorare, farla caricare completamente, e solo dopo avviare il plug-in. Infatti, come potete vedere dall’immagine seguente, il plug-in è avviato, ma non sta ancora intercettando nulla.

Una volta avviato il plug-in, potete inserire i vostri dati all’interno del form, e successivamente effettuare il login, come fate di solito. Adesso, potete vedere Live HTTP Headers popolarsi di numerose linee di codice, che rappresentano semplicemente le richieste e le risposte che il Browser fa e riceve dal Server Web. Per individuare quale è la richiesta contenente i dati del form, che quindi vi permette di effettuare il login, dovete semplicemente ricercare la prima richiesta POST che è stata effettuata.

Come potete vedere dall’immagine precedente, la richiesta POST è molto più complessa di quella vista e realizzata in Java nel precedente articolo. In questa richiesta infatti, sono presenti molti campi impostati dal Browser e non dal form HTML, che quindi solo in questo modo potete visualizzare. L’ultima riga della richiesta POST, sono invece i dati inviati tramite il form HTML al Server Web, che dipendono esclusivamente ed interamente da come il form è stato implementato.

In quest’altra immagine, ci tengo a farvi vedere che nonostante la vostra password non sia visibile nella casella di testo relativa ad essa e nemmeno nell’URL della pagina, viene comunque inviata al Server Web in chiaro. Quindi semplicemente sniffando le richieste HTTP di un Browser, sarà possibile visualizzare tutte le informazioni trasmesse, soprattutto le password.

Di seguito trovate il codice della richiesta POST per intero, che potete usare per semplice curiosità, o per provare ad implementare una richiesta POST in Java leggermente più completa.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST /login.php?login_attempt=1 HTTP/1.1
Host: login.facebook.com
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; it; rv:1.9.2) Gecko/20100115 Firefox/3.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://www.facebook.com/
Cookie: datr=1273922752-7f53f02bbc25f61b71562a08d1db5c02169342202a5a2c11c0482; lsd=VwSKT; reg_fb_gate=http%3A%2F%2Fwww.facebook.com%2F; reg_fb_ref=http%3A%2F%2Fwww.facebook.com%2F; test_cookie=1
Content-Type: application/x-www-form-urlencoded
Content-Length: 236
charset_test=%E2%82%AC%2C%C2%B4%2C%E2%82%AC%2C%C2%B4%2C%E6%B0%B4%2C%D0%94%2C%D0%84&locale=it_IT&email=email_login%40email.com&pass=tua_password&charset_test=%E2%82%AC%2C%C2%B4%2C%E2%82%AC%2C%C2%B4%2C%E6%B0%B4%2C%D0%94%2C%D0%84&lsd=VwSKT

Spero che questo semplice esempio sia utile a molti di voi, e preciso che non è stato realizzato con secondi fini e non è stato scelto il sito di Facebook a caso. Facebook infatti impone molti ulteriori controlli quando si tenta di effettuare il login, che rende quindi impraticabile la realizzazione in Java di un programma apposito. Per effettuare un login su Facebook, ma anche molte altre operazioni, sono disponibili API che consentono di usare molti degli strumenti di Facebook in modo molto semplice e soprattutto consentito.