2011-01-27 9 views
16

Odio il linguaggio Ruby perché non è tipizzato staticamente ma più tempo trascorro con Spring/Hibernate apprezzo di più le funzionalità di Ruby on Rails. In particolare il fatto che il loro modello Active Record impedisce l'iniezione SQL per te. In che modo questo problema viene in genere gestito con uno stack Spring/Hibernate? O uno dei due viene fornito con un kit di strumenti di lavaggio di qualche tipo, per assicurarsi che l'input dell'utente sia sicuro?Come in genere l'interruzione SQL viene interrotta in una configurazione Spring/Hibernate

Questo non è un grosso problema per un inserto se si stanno inserendo DAO, ma si tratta di un grosso problema quando si usano le istruzioni Select.

risposta

30

L'iniezione SQL non dovrebbe essere un rischio quando si utilizza la sospensione, a condizione che la si utilizzi correttamente.

Le query di ibernazione sono scritte in HQL (linguaggio di query simile a SQL di Hibernate) o implementate utilizzando l'API Criteri orientata agli oggetti.

HQL è il più comune e più consigliato. In genere si può scrivere una query HQL come questa:

Subscription sub = (Subscription) sessionFactory.getCurrentSession() 
     .createQuery("from Subscription sub where sub.verification = :verification") 
     .setString("verification", verification) 
     .uniqueResult(); 

In questa forma si sono protetti da SQL injection, perché Hibernate passa nella stringa come parametro; non può essere interpretato come parte di SQL.

Tuttavia, se ti comporti male uno scrivere una query come questo ...

Subscription sub = (Subscription) sessionFactory.getCurrentSession() 
     .createQuery("from Subscription sub where sub.verification = '" + verification + "'") 
     .uniqueResult(); 

... allora non si è protetti da SQL injection. Comunque non dovresti mai scrivere query come questa! Non penso che nessun framework ti proteggerà se aggiungi delle stringhe alle tue domande.

Infine, se si utilizza l'API di Hibernate Criteria, si viene automaticamente protetti dall'iniezione SQL; poiché Hibernate crea la query sottostante quando si utilizza l'API Criteria, lo fa in un modo che impedisce l'iniezione SQL.

1

Penso che tu abbia risposto alla tua stessa domanda - se stai usando solo HQL come ultima risorsa, allora questo probabilmente elimina il 95% dei potenziali punti di attacco. E, poiché lo stai usando solo in quei casi complicati, probabilmente stai prestando più attenzione a ciò che stai facendo.

Problemi correlati