2012/10/14 Paolo P. [email protected]:
Appunto quella linea guida non dice “dipende dal codice” dice di nn fare
defensive programming senza se senza ma e questo imho senza senso.
Poi altra cosa tu dici in un mio metodo interno nn trovo sensato fare prog
difensiva perch nn c’ input dell’utente. Ok ma questo implica che tu hai valutato
tutti i possibili percorsi che i dati che quel metodo usa fanno e quindi hai detto
ok sono al 100% sicuro che in nessun modo anche agendo in altri punti del codice
un attaccante nn possa fare tampering di qualcosa che alla fine propaga al mio
metodo.
no, basta controllare solamente i boundary del sistema. Non serve una
coverage C2, serve semplicemente che ogni input sia clean Cio, in
teoria basterebbe #taint (ma in ruby passato di moda) o passare da
classi ad hoc che rappresentano i dati (Category, Name, whatever).
Al che l’obiezione me la faccio sa solo “ma non sai dove sono i
confini del sistema”.
E allora il problema che non chiara l’architettura, e quello
garantito che crei problemi
Ci sta ne ma valutare tutti i possibili Data flow diagram pi dispendioso che
mettere un raise per rendere robusto un metodo a prescindere.
Poi ovviamente son gusti. Mettere quel raise tu dici essere inutile, va bene ma
dannoso secondo me proprio no
per quello che deve farlo il sistema! La situazione, per come l’ho
vista ia, che se non sono chiari confini e responsabilit, ti trovi
con
#read_input: () ->String che valida l’input
#build_logic: String → Result che valida l’input
#find_data_for_keys: List[String] → Result che valida l’input
dbi,jdbc o che altro che valida l’input
e chiaramente per ogni metodo che ha adesso un doppio
comportamentodevi scriverti un test, perch senn domani lo rompi.
Poi quando cambi una cosa (tipo, l’input viene encodato diversamente o
decidi che la key non deve avere spazi) devi cambiare 9 pezzi di
codice diversi, ed al crescere del sistema garantito che te ne perdi
un pezzo.
A quel punto uno che fa, si tira fuori un metodo
“getValidNameFromString(name)” (che credo sia tipo quello che c’
nelle ESAPI di OWASP) e lo riusa in 3 metodi.
E questo equivalente ad aver fatto una classe di dominio (Name,
Category, etc) ed aver fatto il codice come
#read_input: () → Name che valida
#build_logic: Name → Result
#find_data_for_keys: List[Name] → Result
e dove invoco jdbc/dbi/AR invoco Name.to_key.
Con la differenza che quando aggiungo un pezzo nuovo il sistema mi
aiuta, oppure no.
Comunque si, solo la mia modestissima opinione.
–
twitter: @riffraff
blog (en, it): www.riffraff.info riffraff.blogsome.com
work: circleme.com