posts - 644, comments - 2003, trackbacks - 137

My Links

News

Raffaele Rialdi website

Su questo sito si trovano i miei articoli, esempi, snippet, tools, etc.

Archives

Post Categories

Image Galleries

Blogs

Links

Elucubrazioni sulla sicurezza parlando di MVC e POST in formato Json

Sto facendo una serie di indagini per la stesura di un progetto di un sito web e valutando le tecnologie da adottare. E così ecco questo post, che è solo una trascrizione dei miei pensieri.

A parte una serie di piccole scocciature che credo presto verranno colmate, Asp.net MVC 3 è decisamente maturo.

Mi manca molto una formalizzazione più evidente del concetto di ViewModel che non solo casca a fagiolo in asp.net mvc ma è, a mio avviso, un passo irrinunciabile per creare una applicazione che abbia un ciclo di vita gestibile. Tutto facilmente sopperibile ma visto che il wizard di vs.net guida ad uno sviluppo molto più pattern-oriented rispetto a tutti gli altri wizard di vs.net, la formalizzazione del viewmodel la sento proprio come una vera e propria mancanza. Probabilmente il wizard più pattern-oriented dopo mvc è quello della document-view di VC++.

Facendo una piccola digressione viene da chiedersi perché asp.net goda del privilegio di un wizard che sposa un pattern, mentre WPF invece sia lasciato totalmente libero, laddove MVVM è a mio avviso irrinunciabile per qualsiasi cosa vada oltre la mera demo. Ma qui uscirei OT rispetto al titolo del post.

MVC è una tecnologia nata per un web di nuova generazione. MVC oggi ha senso (e a mio avviso non lo avrebbe avuto 10 anni fa) per una serie di motivi:

  • i postback perché abbruttiscono l'esperienza utente
  • tanto scripting perché i browser di oggi sono più potenti
  • tanto scripting perché jQuery funziona egregiamente
  • tanto scripting perché i browser aderiscono agli standard molto più di prima
  • il dev vuole più controllo sull'html
  • le architetture e le tecnologie service-oriented favoriscono/semplificano l'uso di chiamate ajax-like

Detto questo nascono però tutta una serie di problematiche relative alla sicurezza come gli attacchi di Cross-Site Request Forgery (CSRF) che consistono nel validare che una richiesta (tipicamente una POST) provenga dal dominio corretto. Per esempio se un sito di hacking che state inavvertitamente visitando vi fa eseguire una POST Ajax con l'ordine di esecuzione di un bonifico, è sperabile che qualcuno si sia posto il problema e la blocchi Smile.

MVC ha built-in un sistema di anti-CSRF, l'attributo ValidateAntiForgeryToken, che consente di evitare che questo accada. Stupisce un po' leggere che uno dei suoi padri, Phill Haack, dica: “we haven’t run extensive security analysis on our approach” a questo link:
http://blog.stevensanderson.com/2008/09/01/prevent-cross-site-request-forgery-csrf-using-%20aspnet-mvcs-antiforgerytoken-helper/

A parte questo, il meccanismo è valido se si scambia XML ma appare inusabile con formato Json, altrimenti si perde il mapping dei dati postati sul model, caratteristica molto comoda in MVC3.
D'altra parte se i dati sono Json il meccanismo di validazione è in teoria inutile, visto che i post Json cross-domain sono disabilitati da parte di tutti i maggiori browser. Un layer addizionale di sicurezza certamente non guastava, ma questo è quanto sia disponibile oggi in MVC3.

E allora veniamo al dunque. Siamo sicuri che quello sia l'unico problema di sicurezza in una tecnologia che fa di json, ajax etc. uno degli aspetti chiave?

Possiamo identificare diversi altri punti:

  • Evitare post multipli (per esempio in un meccanismo di voting)
  • Permettere un numero massimo di post (simile al precedente ma con un numero di post >=1 e <n)
  • Permettere un numero di post pari al numero di get. Cioè puoi sottomettere un risultato ma solo ad ogni refresh (GET) di quella pagina (questo evita le post da pagine che non sono inerenti o addirittura di un altro dominio)

Da notare che i problemi di cui sopra devono essere risolti anche in assenza di autenticazione di un utente. Posso anche volere il voto di qualcuno senza necessariamente autenticarlo. Certo, l'utente può barare aprendo un altro browser, cancellando i cookie, chiudendo il browser, etc. Ma esistono una serie di casistiche in cui questo tipo di casi sono accettabili (come avviene su un voting su larga scala).

Tipicamente questo tipo di problemi fanno uso di token e/o hash, cioè dati crittografati che contengono le informazioni come data/ora della richiesta, numero di post, etc.

Se voglio scalare, questo token dovrebbe essere messo in un campo hidden sul browser anziché sul server … ma il ViewState non c'è più (o meglio c'è ancora ma è in pratica inutilizzabile). Non parlo di ViewState per i controlli, ma di un "blob" minimale di dati criptati che faccio custodire al browser invece di intoppare il server.

A quanto ho capito non ci sono soluzioni built-in ma quando si sceglie una tecnologia, in questo casi MVC, queste sono cose da sviluppare e hanno un costo di cui dovrò tenere conto. Mi meraviglio che non siano popolari come mi sarei aspettato.

Print | posted on lunedì 11 aprile 2011 18:09 |

Feedback

Gravatar

# re: Elucubrazioni sulla sicurezza parlando di MVC e POST in formato Json

Intendo dire che il postback implica il refresh della pagina e quindi una latenza che è percepita dall'utente. Inoltre l'utente è abituato ad associare il refresh della pagina come un salto bel buio perché un problema di rete gli impedirebbe di tornare a vedere la pagina.
Quando invece fai un post tramite una chiamata ajax la tua pagina è stabilmente caricata sul browser ed anche un eventuale errore non ti impedisce di continuare a fruire del suo contenuto.
Spero di aver reso l'idea
12/04/2011 00:22 | Raffaele Rialdi
Gravatar

# re: Elucubrazioni sulla sicurezza parlando di MVC e POST in formato Json

Nel 2011 come tu sai meglio di me ci stanno ancor persone che non sanno cosa sia SQL INjection ;), purtroppo è vero che quando si parla di security spesso mancano le basi fondamentali, e come tu fai bene notare, questo si riflette anche sulle tecnologie usate.

Il problema è che cosi lo sviluppatore è lasciato un po a se, e deve per questo andare di soluzioni "custom", quando nella security sarebbe sempre meglio adottare soluzioni già provate e testate.

alk.
12/04/2011 13:37 | Gian MAria
Gravatar

# re: Elucubrazioni sulla sicurezza parlando di MVC e POST in formato Json

Esatto Alk. Il mismatch è che nell'unica tecnologia che ha un wizard di vs.net così "guidato" ci sono elementi fondamentali quali viewmodel e security che sono lasciati a realizzazioni custom.
Ovviamente come dicevi anche tu il problema di una soluzione custom di security è terribilmente pericolosa.
12/04/2011 15:02 | Raffaele Rialdi
Gravatar

# re: Elucubrazioni sulla sicurezza parlando di MVC e POST in formato Json

Eh si, il pericolo è che lo sviluppatore dovrebbe avere dei chiari metodi/librerie/wizard etc che lo guidano nella parte di security, perche magari una soluzione "custom" di partial rendering senza jquery è meno efficente o manutenibile, ma magari il suo sporco lavoro lo fa. Una soluzione custom di security poterbbe invece non fare nulla, e lasciare quindi aperte falle di sicurezza :(
12/04/2011 17:21 | Gian MAria
Gravatar

# re: Elucubrazioni sulla sicurezza parlando di MVC e POST in formato Json

No lungi da me pensare che tutti gli sviluppatori diventino dei security-master :)

Quello che intendevo si rispecchia un po' nella mia esperienza. Il mio primo evento community è stato qualche anno fa ad un evento gratuito di UGI.NET all'Arcadia di Melzo, in cui se non erro tu (Raffaele), Andrea Saltarello e altri speaker che ora non ricordo, vestiti da Spider-man, avete tenuto delle ottime sessioni sulle teconolgie del momento. Da lì ho iniziato un percorso che mi ha portato ad aumentare di molto il grado di lettura e studio anche su argomenti non inerenti a progetti che stavo/sto seguendo (oltre che a vedere la serie completa di spider-man). Tuttavia in tutte queste letture, e parlo dello strumento forse più diretto per raggiungere gli sviluppatori oggi, cioè i blog, sono molto pochi i post che cercano di sviscerare problemi di vulnerabilità come hai fatto tu in questo interessantissimo post. Ovvio che non si può sempre parlare di questo, però trovo strano che sia così difficile incappare in un argomento così centrale nel design di un applicativo.

Non so se sono stato più chiaro ora.
12/04/2011 21:08 | Francesco Milano
Gravatar

# re: Elucubrazioni sulla sicurezza parlando di MVC e POST in formato Json

Chiarissimo. Purtroppo anche negli argomenti tecnici ci sono i "trend" dettati dai prodotti del momento. La security non fa 'moda' e quindi tutti la snobbano fino a che non arriva la facciata, tutto qui.
BTW ricordo bene il workshop di Melzo. Andrea era lo spiderman :) ed io indossavo la maglietta "le so tutte" che mi avevano regalato pochi minuti prima della mia sessione ... non ho potuto oppormi ad indossarla :)
È stato uno splendido ricordo anche per me (io facevo la sessione su asp.net security).
12/04/2011 22:50 | Raffaele Rialdi
Gravatar

# re: Elucubrazioni sulla sicurezza parlando di MVC e POST in formato Json

Il discorso di 'moda' e 'trend' non volevo tirarlo in ballo io, ma penso che tu abbia letto tra le righe del mio discorso ^_^

In ogni caso ottima session davvero quella di Melzo, ne avevo seguita un'altra sempre di ugi a segrate in microsoft, in quel caso avevo avuto mal di pancia tutto pomeriggio perchè avevo mangiato troppi baci di dama. erano spettacolari. Mi ricordo comunque che c'era un'interessante preview di Indigo
13/04/2011 12:13 | Francesco Milano
Gravatar

# re: Elucubrazioni sulla sicurezza parlando di MVC e POST in formato Json

:) Quella su Indigo forse l'aveva tenuta Pierre
14/04/2011 03:24 | Raffaele Rialdi
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET