Tutti gli articoli di Nicola Ferraro

Sea Surf – Protezione CSRF

LockCSRF o XSRF è uno dei più noti attacchi informatici che possono essere diretti a qualsiasi sito web, indipendentemente dalla tecnologia di backend. Una grande percentuale di siti, infatti, non sono protetti nei confronti di questo tipo di attacco o possiedono delle pagine vulnerabili facilmente individuabili da un attaccante.

La vittima di un attacco CSRF è quasi sempre l’utente. L’attacco sfrutta l’assunto che le operazioni fatte da un browser web, all’interno di una sessione autenticata, corrispondono sempre a richieste fatte esplicitamente dall’utente. Si tratta di un assunto molto rischioso perché facilmente sfruttabile da un attaccante che, indirizzando l’utente su un sito creato ad hoc, riesce a comandarne il browser con l’utilizzo di javascript.

Continua a leggere

OAuth made easy

OAuth2OAuth è un protocollo per l’autorizzazione d’accesso alle risorse utilizzato principalmente dai social network. Le specifiche OAuth 2.0, tuttavia, descrivono un framework generale per lo scambio di autorizzato di informazioni, non un insieme di regole precise perché questo possa avvenire. Di conseguenza, ogni service provider OAuth, anche rispettando le specifiche, richiede un’implementazione diversa del client.

Il protocollo OAuth è diverso da OpenID, per scopi e principio di funzionamento. Nonostante questo, OAuth può essere utilizzato come strumento di autenticazione e rende OpenID relativamente inutile. Il supporto a OpenID da parte dei service provider, infatti, è decisamente limitato.

Continua a leggere

Dependency injection fatta in casa

JavaVisto il moltiplicarsi dei framework per la dependency injection in Java negli ultimi anni (CDI, Guice…), sembra ormai scontato che questo pattern sia fondamentale per la realizzazione di applicazioni enterprise complesse.

Creare un dependency injector, al contrario, è qualcosa di molto semplice. Basta usare un po’ di refection.

Prendiamo un esempio: PrizeManager è una semplice classe che, dati degli utenti e dei premi, assegna questi randomicamente, informando un altro oggetto (MainController) dello stato delle cose.

package it.nerdammer;

import java.util.Collections;
import java.util.List;

public class PrizeManager {

	@Inject
	private MainController mainController;
	
	@Inject
	private List<User> users;
	
	@Inject
	private List<Prize> prizes;
	
	public void assignPrizes() {
		mainController.start();
		
		Collections.shuffle(users);
		Collections.shuffle(prizes);
		
		for(int i=0; i<users.size() && i<prizes.size(); i++) {
			// assegna i premi
			users.get(i).winPrize(prizes.get(i));
		}
		mainController.stop();
	}
}

Il compito del dependency injector è quello di impostare i riferimenti dei campi annotati con l’annotazione @Inject.

Continua a leggere

Input-type: Image

Internet BrowsersChiunque si sia mai avventurato nella giungla della realizzazione di siti web avrà certamente capito che, nonstante tutti gli standard che sono stati definiti negli ultimi anni, ogni browser interpreta il codice html/css a modo suo. Il risultato è che il 60% del tempo di sviluppo di un sito web non si perde nella fase di testing (come diversi teorici dell’ingengeria del software sostengono), ma nel cercare di trovare degli “hack” per Internet Explorer !

Fino a l’altro ieri pensavo che le incompatibilità tra browsers riguardassero solo la presentazione del sito, ma ci è voluto poco a trovarmi di fronte a un problema legato al submit delle form, in particolare, al tag input con immagine incorporata. Che differenza c’è tra i seguenti due campi di input ?

<input type="image" name="pulsante" value="Click" src="img/img.png" />
<input type="submit" name="pulsante" value="Click" />

Continua a leggere

SimpleDateFormat: quante insidie

JavaProprio qualche giorno fa mi trovavo a parlare della proprietà lenient della classe SimpleDateFormat, cioè un booleano che, se lasciato al valore di default, permette di riconoscere come “date ben formate” giorni come il 31 febbraio 2012 o cose del genere. Ma le insidie dietro questa classe sono altre, e molto più gravi.

Leggendo la documentazione della classe si trova il seguente commento:

Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.

Ebbene, quelli della Oracle consigliano di creare delle istanze separate della classe per ogni thread che la usa. Ma cosa succede se non si segue questo consiglio ?
Continua a leggere

Microsoft ClickOnce su Apache Server

Apache ServerMicrosoft ClickOnce è una tecnologia promettente disponibile dalla versione 2.0 del framework .Net (per chi non lo sapesse.. siamo quasi alla 4.5), che si sta diffondendo rapidamente. Consente di avviare delle applicazioni .Net con un solo click da una pagina web, gestisce automaticamente l’aggiornamento software in caso di nuove versioni e sembra poter sostituire completamente il vecchio file Setup.exe. Continua a leggere

Java Reflection Proxy

javaLa classe java.lang.reflect.Proxy è, senza troppi preamboli, la base di tutti i framework Java che si fondano sui principi della programmazione ad aspetti, e forse anche di tutti quelli che ne fanno a meno.

Attraverso questa classe, è possibile generare a runtime degli oggetti che implementano un determinato insieme di interfacce, anche se tali interfacce sono sconosciute al momento della compilazione o addirittura ancora non concepite dal programmatore. E’ attraverso questa classe che l’application server riesce a fornire una implementazione per gli EJB della nostra applicazione, arricchendo dei semplici metodi con funzioni definite dalle specifiche JPA, JTA, JMS, JNDI etc. etc.
Continua a leggere

Java Native Access (JNA)

Java Native AccessParliamo di una libreria davvero interessante che potrebbe risolvere non pochi problemi nel lavoro quotidiano: JNA, ovvero come utilizzare una DLL di Windows direttamente dal linguaggio Java. Java Native Access (JNA) è una libreria open source che permette di invocare funzioni presenti in librerie del sistema operativo in maniera molto rapida e con la scrittura di poche righe di codice.

A differenza delle librerie JNI (Java Native Interface), per utilizzare JNA non sono richiesti dei passaggi aggiuntivi di preparazione, come la generazione di file intermedi o la compilazione di codice nativo. JNA nasconde al programmatore tutti i dettagli “scomodi” per consentirgli di concentrarsi direttamente sull’obiettivo da realizzare. Al programmatore Java, infatti, è lasciato il solo compito di definire l’interfaccia delle funzioni esportate dalla libreria e queste divengono direttamente utilizzabili. Niente generazione di file di intestazione, niente scrittura o compilazione di codice nativo: solo scrittura di codice Java.

La “magia” diventa possibile attraverso la generazione automatica di stub per le interfacce native, eseguita da JNA al primo tentativo di utilizzo della libreria. Tali stub sono responsabili dell’effettiva traduzione dei tipi di dati (eseguono una conversione in entrambe le direzioni) e del collegamento al codice nativo da eseguire.

Ecco un esempio di codice Java che utilizza le librerie JNA per eseguire una chiamata ad una DLL definita in precedenza. Il codice presuppone che la libreria si trovi nel classpath dell’applicazione con nome “MiaLibreriaNativa.dll” ed abbia una funzione denominata “sayHello” con parametri e valore di ritorno “void”.

import com.sun.jna.Library;
import com.sun.jna.Native;
 
public interface LibreriaNativa extends Library {
    public static LibreriaNativa INSTANCE = (LibreriaNativa) Native.loadLibrary("MiaLibreriaNativa.dll", LibreriaNativa.class);
 
    public void sayHello();
}

Con tali accorgimenti è stata definita l’interfaccia Java LibreriaNativa la cui definizione è del tutto simile a quella della corrispondente interfaccia nativa definita nella libreria DLL. La variabile INSTANCE è lo stub generato da JNA (tramite il metodo loadLibrary della classe Native) che consente l’utilizzo della funzione esportata.

La libreria così “importata” in Java può essere utilizzata in maniera molto semplice attraverso le istruzioni seguenti.
Continua a leggere

Codemotion 2012

image

Si è appena concluso l’evento dell’anno per tutti i nerd d’Italia: il codemotion 2012. Tanti argomenti nuovi, javascript e HTML 5 su tutti, solita caccia al gadget più figo.

I talk interessanti si contano sulla punta delle dita, ma è sempre un momento di incontro di cui non si riesce a fare a meno.