Progettazione… Programmazione… Soluzione…
Post con tag java
[Java] Invio di File ad una Servlet
4 giu
In Java le Servlet sono il primo strumento con il quale si viene a contatto, se si vuole realizzare una applicazione Web dinamica che interagisca con l’utente. Come sicuramente saprete, le Servlet sono in grado di ricevere le richieste HTTP GET o POST, e di restituire un risultato, che può anche dipendere dai parametri passati tramite la richiesta. Questa semplice caratteristica, è realizzabile grazie all’implementazione dei metodi doGet(…, …) e doPost(…, …) che la classe javax.servlet.http.HttpServlet mette a disposizione.
L’unico vero problema che ho riscontrato fin’ora con l’utilizzo di questa classe, è la limitazione da essa imposta riguardo il tipo di dati che è in grado di prelevare dalle richieste GET e POST che riceve. Infatti, con i due metodi sopracitati, è possibile solo elaborare richieste che contengono campi testuali che non fanno riferimento a codifiche particolari. Un classico esempio di questa limitazione, è l’impossibilità di inviare tramite GET o POST una immagine alla Servlet.
Java non offre nativamente altri strumenti per la gestione di contenuti di diverso tipo, quindi bisogna ricorrere ad una libreria esterna. Una libreria molto semplice ed intuitiva è messa a disposizione da Servlets.com ed è reperibile a questo indirizzo. La libreria in questione è com.oreilly.servlet, ed in particolare la classe che ci Continua >
Live HTTP Headers: sniffare ed analizzare il traffico HTTP
15 mag
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 Continua >
Java: HTTP POST con Socket
24 apr
Come potete vedere nei precedenti articoli riguardanti il Brute Force in Java e i vari metodi di attacco per le password, la sicurezza informatica è uno degli aspetti dell’informatica che preferisco, soprattutto per quanto riguarda la sicurezza in Internet. Vi sembrerà strano, ma non potete immaginare quanta gente dia per scontato il fattore sicurezza mentre naviga in rete, crea account e soprattutto quanto sceglie la password.
Proprio sulla scelta della password vorrei soffermarmi un attimo con una piccola considerazione, basata su dati statistici. Infatti, secondo alcuni studi, la password usata più spesso dagli utenti è la stringa “123456″. Questo dato mi è sembrato sconvolgente, ma posso assicurarvi che è molto realistico. Su questo argomento credo di fare a breve un articolo più approfondito, quindi per ora consideriamo semplicemente l’aspetto che riguarda Java, ed in particolare come fare una richiesta http usando il metodo POST, sfruttando i Socket.
I due argomenti sopra citati sono strettamente collegati, in quanto le applicazioni web sono costruite essenzialmente sfruttando il metodo GET per le varie richieste. Il metodo POST viene usato per elementari requisiti di sicurezza per la trasmissione di dati sensibili, quali appunto username e password al momento del login su un servizio web. Il metodo che vi mostro Continua >
MySQL con Java grazie a JDBC
9 mar
Nei miei ultimi esperimenti con Java, mi è capitato di dover interagire con database MySQL. Per la parte che riguarda il database, ho sempre usato MAMP, un ottimo programma che gestisce in una semplice interfaccia grafica, Apache, MySQL e PHP.
Per far comunicare Java ed il database MySQL c’è bisogno di un driver, in particolare ho usato JDBC. Un esempio di utilizzo del driver è il seguente:
12345678910111213141516171819202122232425import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class DataBaseTest { public static void testDB () throws Exception { // Carico il Driver Class.forName("com.mysql.jdbc.Driver"); // Connetto al Database (URL DB, USER, PWD) Connection db = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root"); // Creo uno Statement per l'invio della query Statement s = this.db.createStatement(); // Invio la query e catturo i risultati ResultSet rs = s.executeQuery("SELECT nome FROM tabella WHERE nick = 'nerthase'"); boolean o = rs.first(); // In caso non siano stati trovati risultati, inserisco l'entry nel database if (!o) s.executeUpdate("INSERT INTO tabella (nome, nick) VALUES ('mario', 'nerthase')"); s.close(); } }Questo codice, implica che sia stato creato un database chiamato test con una tabella chiamata tabella costituita da almeno due campi chiamati nome e nick. Il particolare questo Continua >
jDownloader: RapidShare e MegaUpload senza limiti
27 feb
jDownloader è un utilissimo programma open source scritto completamente in Java, e quindi compatibile con tutti i sistemi operativi che lo supportano. Il suo scopo è quello di scaricare file da siti come RapidShare e MegaUpload, ma anche tanti altri come loro. jDownloader si occuperà di attendere la disponibilità del download al posto nostro, ed effettuerà anche il bypass dei codici CAPTCHA spesso utilizzati da siti del genere.
Ma le novità e le potenzialità di jDownloader non sono finite qui. Esso infatti è in grado di effettuare il download di filmati di YouTube, MegaVideo e quanto altro possiate immaginare. Inoltre ha anche l’opzione per effettuare i download usufruendo di un account premium in vostro possesso. E se invece non possedete un account premium, jDownloader si occuperà di effettuare un cambio di IP per il vostro computer, in modo da evitare controlli e barriere applicati da alcuni siti di File Sharing. Dopo questa breve panoramica per questo meraviglioso software, veniamo ad una breve guida di configurazione ed utilizzo:
Dopo l’installazione, è necessario settare alcune impostazioni iniziali per l’utilizzo del software,
Impostiamo il percorso per i nostri download ed il comportamento che jDownloader dovrà adottare per i file scaricati. Queste semplici impostazioni sono già sufficienti per iniziare Continua >
Puzzle risolto con l’elaborazione distribuita
25 feb
Dopo avervi parlato dell’ultimo progetto realizzato per l’università, un semplice motore di ricerca che aggrega i risultati di Google, YouTube e Wikipedia, voglio condividere con voi il progetto che ho realizzato come Prova Finale per la Laurea Triennale. Si tratta di un sistema distribuito Client/Server applicato alla risoluzione di un Puzzle.
Il Puzzle Distribuito
Il Puzzle Distribuito è un progetto che simula quello che nella realtà è un puzzle, dalla sua origine (la creazione dei pezzi) al lavoro fatto dalle persone per riunire i pezzi e formare l’immagine originale. Un puzzle reale per essere risolto necessita, a volte, di tempi molto lunghi, i quali però si possono ridurre se nella risoluzione del puzzle partecipano più persone. Questo effetto nel Puzzle Distribuito è simulato attraverso l’uso dell’elaborazione distribuita.
L’elaborazione distribuita
L’elaborazione distribuita può essere facilmente descritta come lo sforzo di unire un complesso di macchine connesse in rete in modo che l’informazione o altre risorse possano essere condivise da tutte le macchine connesse. La speranza è che la divisione possa aver luogo su grandi aree, molte macchine e molti utenti, unificandoli in una consistente e coerente struttura. In questa particolare applicazione dell’elaborazione distribuita, sono presenti un sistema centrale, e molti sistemi decentralizzati che gestiscono i Continua >
Brute Force in Java
15 feb
Per scopo didattico, mi è stato più volte richiesto di realizzare un metodo che calcoli tutte le permutazioni di un insieme di caratteri dati come input. Per chi non lo sapesse, le permutazioni sono un modo di ordinare in successione n oggetti distinti.
Ad esempio abbiamo che le permutazioni dell’insieme di caratteri { ‘A’, ‘B’ } sono:
- AA
- AB
- BA
- BB
Il numero di permutazioni è molto alto in caso si considerino insiemi di ordine elevato. Questo genere di permutazioni, sono usate spesso negli attacchi a Forza Bruta, o Brute Force, per cercare di violare o rubare password. Con questo breve articolo, non vi invito a provarci, ma bensì a convincervi che questo tipo di attacco, il Brute Force puro, non vi porterà mai al successo… soprattutto se lo volete in tempi brevi… Dopo questa piccola premessa, vi mostro il codice che ho usato per realizzare questa piccola classe, da usare ogniqualvolta avrò la necessità di usare permutazioni di un insieme di caratteri.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384public class BruteForce { private char alfabeto[]; private char alfabeto_default[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; private StringBuffer corrente; private boolean prima_permutazione = true; private int lunghezza; public BruteForce (char alfabeto[], String inizio, int lunghezza) { Continua >
Java: Espressioni regolari
5 feb
Vi ho già parlato delle espressioni regolari e di come verificare il corretto funzionamento di esse in modo veloce con Regex Tester. Ora vediamo invece come usare in maniera semplice e veloce le espressioni regolari nei nostri programmi Java.
Innanzitutto ricordiamo che un’espressione regolare, è necessaria nel caso in cui vogliamo catturare o identificare le occorrenze di una certa forma o struttura all’interno di un contesto più ampio. Esistono alcuni identificatori particolari nelle espressioni regolari per identificare insiemi di caratteri:
- \d Carattere numerico
- \D Carattere NON numerico
- \s Spazio
- \S Carattere diverso dallo spazio
- \w Carattere alfanumerico
- \W Carattere speciale (non alfanumerico)
Ricordiamo che in Java il carattere \ è un carattere speciale, e quindi per usarlo dobbiamo inserire \\. Vediamo ora alcuni esempi di espressioni regolari, per chiarire meglio alcuni concetti. Per verificare la presenza di un indirizzo email all’interno di un testo, usiamo l’espressione regolare:
[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}
Se invece vogliamo estrapolare il codice fiscale di una persona dal suo Curriculum Vitae, ad esempio, possiamo usare:
[a-zA-Z]{6}\d\d[a-zA-Z]\d\d[a-zA-Z]\d\d\d[a-zA-Z]
In maniera del tutto analoga, vediamo l’espressione regolare utilizzabile per catturare un URL (questa l’ho usata molto spesso):
http\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?
Queste espressioni regolari di sopra, non possono essere riportate direttamente in Java, perché si deve inserire un carattere \ prima dei caratteri speciali che Java interpreterebbe in modo errato.
Le classi che vengono usate in Java per le espressioni Continua >
Regex Tester – RegexPal
28 gen
Spesso nei miei esperimenti, ho bisogno di ricorrere alle espressioni regolari per catturare una particolare sequenza di caratteri, da una stringa di dimensioni più elevate.
Per fare questo in Java ci sono le classi Pattern e Matcher, che richiedono come input la stringa originale, e l’espressione regolare. L’uso di queste classi è semplice ed immediato, ma non sempre è altrettanto semplice ed intuitivo, capire perché un’espressione regolare non svolge correttamente il suo lavoro. Ho quindi scoperto Regex Tester, un sito web che permette di testare in tempo reale gli effetti di un’espressione regolare. Abbiamo a disposizione una guida rapida all’uso ed alla scrittura di espressioni regolari, e possiamo anche personalizzare il comportamento di alcuni caratteri speciali dell’espressione regolare.
Fino a poco tempo fa non conoscevo nemmeno cosa fossero le espressioni regolari, ma vi assicuro che una volta che avete imparato ad utilizzarle, non ne potete fare più a meno.
Vediamo come Regex Tester può essere utilizzato per ovviare ad un problema molto comune, come può essere quello di estrarre da un testo, tutti gli indirizzi email che contiene. L’espressione regolare che uso in questo caso è:
[a-zA-Z0-9_\.]+@[a-zA-Z0-9-]+\.[a-zA-Z]{0,4}
Vediamo quindi Regex Tester come ci aiuta nel testare Continua >
Google Data API
27 gen
Google Data Protocol è un protocollo che deriva da REST ed il suo scopo è quello di interfacciare applicazioni di terze parti con gli applicativi Google.
Insieme ad alcuni amici dell’Università, stiamo sviluppando un progetto in cui è necessario interfacciarsi con YouTube. Le API di Google ci sono venute in soccorso per ogni problema o dubbio incontrato.
Le API di Google sono sviluppate per diversi linguaggi di programmazione (HTML, XML, Java, Php, .Net e Pynthon) e supportano tutti gli applicativi di Google; potete trovare un elenco completo nell’apposita API Directory di Google. Tutte le API sono ben fatte, funzionanti e soprattutto ben documentate. Per chi come me usa Eclipse, sviluppare un progetto usando le API di Google sarà ancora più facile. Ci sono infatti guide su come configurare un progetto di Eclipse, su come integrare le API ed esempi di codice già pronti.
Attualmente io sto usando solo le API di YouTube, e gli esempi di codice messi a disposizione mi sono stati più che sufficienti. Davvero un ottimo lavoro da parte di Google.