2010-12-13 10 views

risposta

6

JPA è come JDBC: una tecnologia back-end. Gli stessi problemi di sicurezza che si applicano a JDBC si applicano a JPA. Quindi la maggior parte delle considerazioni sulla sicurezza verrà implementata a livello di applicazione o gestita dalle API front-end. Ma in effetti l'iniezione di JPQL è ovvia da non dimenticare.

JPQL iniezione:

come solo quando si utilizza SQL o l'API JDBC, non si dovrebbe mai aggiungere direttamente i parametri per una stringa di query. Si dovrebbe lavorare con setParameter sull'oggetto Query (si applica sia adhoc che a query denominate) oppure è possibile utilizzare JPA criteria API (sebbene le query denominate offrano le migliori prestazioni).

Query query = em.createQuery("DELETE Order WHERE customer = :customer"); 
query.setParameter("customer", customer); 
query.executeUpdate(); 

diritti di database:

Per maggiore sicurezza, si potrebbe fare di più unità persistenti (PU) quindi l'impatto di eventuali violazioni della sicurezza è limitata. Ad esempio, è possibile creare più PU con diritti di accesso al database diversi: uno con diritti di aggiornamento e un altro con accesso di sola lettura alla query. Basta rendersi conto che decisioni come questa avranno un impatto sul design dell'applicazione.

+0

Crei PreparedStatements nel livello dell'app? Usarli (AFAIK) è la principale difesa contro l'iniezione SQL e di solito vengono creati sul livello dati. – bakoyaro

+1

Buon punto. Se la pratica migliore diventa un'abitudine, a volte dimentichi le cattive alternative. L'ho aggiunto alla mia risposta. – Kdeveloper

+1

Ogni volta che sviluppi un protocollo in chiaro, gli hacker russi sfruttano la tua mancanza di sicurezza del tipo. –

1

Se si deserializza un oggetto da byte ricevuto da un'origine non attendibile, è possibile che venga caricata qualsiasi classe sul percorso di classe di avvio, pubblica o meno, e che venga eseguita l'inizializzazione delle classi. Può anche ottenere autorità tramite costruttori con effetti collaterali e metodi di deserializzazione personalizzati.

Se il percorso di classe comprende ben noto classi pubbliche con autorità illimitata, come l'interprete Rhino fornito con la maggior parte delle JVM recenti, o l'interfaccia javax.tools a javac, E che l'autorità è raggiungibile tramite il costruttore di una classe serializzabile, quindi un utente malintenzionato potrebbe utilizzarlo per eseguire codice java arbitrario. In pratica, questo significa un codice utente arbitrario con i privilegi dell'utente corrente tramite java.lang.Runtime.

Il primo criterio è facilmente rispettato. Il secondo è probabilmente molto meno facile da incontrare.

+1

Non sono sicuro se questo abbia qualcosa a che fare con JPA. – Kdeveloper

+0

+1 Grazie per l'input, sono problemi validi. – bakoyaro

+0

@Kdeveloper, avevo l'impressione che le entità JPA dovessero essere serializzabili. Ma hai ragione; se le entità JPA non utilizzano la serializzazione java per la persistenza, il mio post è irrilevante. –

Problemi correlati