Code Security? Code Review? Quali strumenti open-source

January 19, 2010

Scrivere bene codice non è facile, lo sappiamo, spesso l’ impegno non basta. I nostri errori possono essere però rintracciati, osservati, analizzati e se possibile risolti aiutandoci con strumenti quali :

Findbugs (static java bytecode analyzer) http://findbugs.sourceforge.net

OWASP Orizon (source code analyzer) http://orizon.sourceforge.net/

Sonar (platform to manage code quality) http://sonar.codehaus.org/


JSON + Java = Jackson

January 4, 2010

Jackson è una libreria che permette di gestire (read&write, marshall&unmarshall) messaggi di tipo JSON (www.json.org). Il messaggio di tipo JSON si adatta perfettamente ad elaborazioni client-side poiché il codice Javascript riesce ad elaborare il dato molto più velocemente rispetto ad un file XML: invece eseguire il parser del messaggio XML e quindi leggere il DOM, tramite JSON la lettura del dato è più “leggera” essendo strutturato come key-value.

Attraverso Jackson (http://jackson.codehaus.org) risulta semplice costruire e leggere messaggi JSON.

@JsonProperty :definisce il nome del campo nel messaggio, da posizionare sui metodi get()

@JsonIgnore: definisce i campi da ignorare

@JsonWriteNullProperties: definisce se scrivere o meno il campo quando nullo

@JsonValue: tratta il campo come una stringa (i.e. “a”=1 diventa “a”=”1″)

Esempio JSON:

{"number_json":1,
"model_json": {  "bar_json":[{<myObject>}],
                                  "foo_json":[{<myObject>}]  }
}

Di seguito un esempio di una classe:

/**
* JSON message
*
* L' ordine dei "get" è rispettata nella scrittua del file .json
*
* @author Federico Casani - 04/dic/2009-19.42.55
*
*/
@JsonWriteNullProperties(false)
public class JsonMessage {
private Integer number;
private Model model;
@JsonProperty("model_json")
public model getModel() {
return model;
}
public void setModel(Model model) {
this. model = model;
}
@JsonProperty("number_json")
public Integer getNumber() {
return number;
}
public void setNumero(Integer number) {
this. number = number;
}
}
@JsonWriteNullProperties(false)
public static class Model{
List<MyObject> fooList;
List<MyObject> barList;
@JsonProperty("bar_json")
public List< MyObject > getBarList() {
return barList;
}
public void setBarList(List< MyObject  > barList) {
this. barList = barList;
}
@JsonProperty("foo_json")
public List< MyObject  > getFooList() {
return fooList;
}
public void setFooList(List< MyObject  > fooList) {
this. fooList = fooList;
}
}

Un canale di comunicazione basato su messaggi JSON possiede notevoli vantaggi riguardanti

- pesantezza del dato scambiato (più snello di un dato in formato XML)

- velocità di esecuzione (il browser riesce a leggere velocemente il messaggio JSON)

Il problema più grande riguarda la sicurezza: un messaggio JSON interpretato tramite il linguaggio JavaScript è potenzialmente soggetto ad eseguire codice malevolo a causa dell’ esecuzione del metodo eval(). E’ caldamente sconsigliato utilizzare il metodo eval()!

Bisogna utilizzare il metodo parse()! Vedi http://www.json.org/js.html

Riassumendo i consigli più importanti per quanto riguarda canali di comunicazione JSON based sono:

  1. Non fidarsi mai del Browser
  2. Mantenere il messaggio pulito (non includere funzioni nel dato)
  3. Evitare JSON di terze parti
  4. Lato server devono essere authenticate tutte le richieste
  5. Lato server bisogna assicurarsi della corretta codifica
  6. Se presenti dati sensibili, utilizzare il protocollo SSL/TLS

Link utili:

http://stackoverflow.com/questions/395592/json-security-best-practices

http://www.json.org

http://www.fortifysoftware.com/servlet/downloads/public/JavaScript_Hijacking.pdf


SHIP validator

September 28, 2009

Un progetto molto interessante sul tema: data validation

Il progetto è raggiungibile all’ url:

http://www.owasp.org/index.php/Category:OWASP_Content_Validation_using_Java_Annotations_Project_-_SHIP_Validator_0.3_Release_-_Assessment