sto iniziando a imparare JPA, e ho una notevole quantità di codice legacy EJB2.0 che dovrà essere riscritta per usare le nuove funzionalità, così come ogni nuova funzionalità che aggiungerò alla base del codice. Ci sono nuovi vettori di attacco che dovrò rendere conto nel mio codice, o la programmazione difensiva mi coprirà?Quali sono i problemi di sicurezza che ho bisogno di guardare fuori per con Java Persistence API (JPA)
risposta
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.
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.
Non sono sicuro se questo abbia qualcosa a che fare con JPA. – Kdeveloper
+1 Grazie per l'input, sono problemi validi. – bakoyaro
@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. –
- 1. Java Persistence API
- 2. Ho bisogno di aiuto per capire i problemi di accesso di sicurezza PowerShell e di file
- 3. Ho bisogno di imparare i servizi Web in Java. Quali sono i diversi tipi in esso?
- 4. JPA o Hibernate for Java Persistence?
- 5. Ho bisogno di aiuto con Java Generics
- 6. Quali sono i problemi reali con Ruby?
- 7. Ho bisogno di generare uuid per la mia applicazione di rotaie. Quali sono le opzioni (gemme) che ho?
- 8. Ho bisogno di aiuto su Bump Api che invia immagini
- 9. Ho bisogno di servlet per la programmazione Java lato server?
- 10. JAXB va bene finché non ho bisogno di fare qualcosa di complesso. Quali sono le alternative?
- 11. Quali sono i rischi angolari di sicurezza per l'implementazione di aree di amministrazione restful?
- 12. Kafka Quickstart: quali dipendenze ho bisogno?
- 13. Che cosa sono le variabili di trasmissione? Quali problemi risolvono?
- 14. Quali sono i metodi di riordino validi per Java sincronizzati?
- 15. Ho davvero bisogno di libgcc?
- 16. Quali sono i problemi del pattern MVVM?
- 17. Quali sono i potenziali problemi di sicurezza che eseguono codice non affidabile in un contenitore Docker come utente non root?
- 18. Perché ho bisogno di un'interfaccia funzionale per funzionare con lambdas?
- 19. Quali sono i gruppi di sicurezza predefiniti creati quando ho configurato AWS EB per la prima volta?
- 20. Mi sono unito all'ACM. Quali risorse dovrei guardare prima?
- 21. Problemi di sicurezza nell'accettare i caricamenti di immagini
- 22. Quali problemi di sicurezza derivano dal chiamare i metodi con la riflessione?
- 23. Non ho bisogno di salvare. Come mantenere i buffer di Emacs sincronizzati con i file?
- 24. Quali sono i rischi per la sicurezza nell'utilizzo di XMLHttpRequest tra domini diversi?
- 25. Perché ho bisogno di interfaccia?
- 26. Ho bisogno di mangimi con graphql?
- 27. Ho bisogno di una libreria client stomp java che funzioni con ssl
- 28. Ho bisogno di un abbonamento MSDN
- 29. Quali sono i problemi con le classi interne non statiche e la serializzazione in Java
- 30. Ho bisogno di aiuto per iniziare con Boost.Python
Crei PreparedStatements nel livello dell'app? Usarli (AFAIK) è la principale difesa contro l'iniezione SQL e di solito vengono creati sul livello dati. – bakoyaro
Buon punto. Se la pratica migliore diventa un'abitudine, a volte dimentichi le cattive alternative. L'ho aggiunto alla mia risposta. – Kdeveloper
Ogni volta che sviluppi un protocollo in chiaro, gli hacker russi sfruttano la tua mancanza di sicurezza del tipo. –