Uso ottimale di ibernazione con le stored procedure di mysql

1

Sto lavorando a un progetto (da usare come riferimento). Il progetto utilizza mysql, hibernate e spring (REST) e dovrebbe essere un singolo microservizio.

Sono venuto a scoprire che limitare l'accesso al database utente / consumatore alle stored procedure in mysql è considerato una pratica migliore per quanto riguarda la sicurezza (nessuna operazione non intenzionale e nessuna sql-injection). Di conseguenza ho creato stored procedure per ogni possibile interazione utente / consumatore con il database.

Per utilizzare la modalità di sospensione con stored procedure. Ho dichiarato @NamedStoredProcedureQuery per ogni stored procedure.

Il problema (pratica) è che questo approccio sembra essere molto prolisso. specialmente quando si tratta di stored procedure che restituiscono query personalizzate (a più tabelle) (quasi tutte le query di stored procedure). Poiché dovrò definire @SqlResultSetMapping ( come mostrato qui ) per ogni query personalizzata restituita da una stored procedure.

Devo continuare a utilizzare questa pratica?

Ci sono modi migliori per ottenere lo stesso (o migliore) risultato?

    
posta zessi 12.04.2018 - 14:53
fonte

2 risposte

1

Non hai bisogno di stored procedure per prevenire l'iniezione SQL. Certo, fornisce un'ulteriore barriera tra il database e il mondo esterno, ma se si utilizzano query con parametri HQL, i criteri API, ecc., Nulla può davvero "scivolare" in ogni caso.

L'utilizzo di stored procedure per tutto può anche diventare complicato in quanto la logica è divisa tra il database e il codebase, per non parlare del fatto di giocare con diversi ruoli utente all'interno del database.

Ho visto un sacco di codice farlo comunque, e ho sempre pensato che sia dovuto alle politiche aziendali che gli sviluppatori e gli amministratori di database sono isolati gli uni dagli altri (o piuttosto gli sviluppatori sono isolati dal database). Vedo i vantaggi degli amministratori di database scrivere query efficienti e assegnarle agli sviluppatori (che potrebbero non comprendere molto sui database sfortunatamente). Come misura di sicurezza non vedo alcun vantaggio (a meno che non stiamo cercando di proteggere il database dagli sviluppatori che potrebbero distruggerlo).

Risposta basata su anni di Java, SQL e altri sviluppi.

    
risposta data 12.06.2018 - 08:04
fonte
0

Che cosa so di ibernazione:

  • Sicurezza: usa Hibernate API e Hibernate Criteria invece di scrivere il tuo HQL e sei al sicuro. È estremamente improbabile che tu voglia gestire più utenti per il tuo database. Nel peggiore dei casi potresti aver bisogno di una connessione normale e di un amministratore per le tabelle sensibili.
  • Hibernate è un ORM, l'obiettivo di un ORM non è quello di sostituire il database, ma per semplificarti la vita non dovendo scrivere la tua query, specialmente inserire / eliminare / aggiornare scrivendo la tua stored procedure sembra come sconfiggere questo scopo.
  • Prestazioni: Hibernate utilizza una cache a due livelli, la prima è una cache a livello di transazione ed è sempre abilitata per utilizzare metodi come "flush" / "refresh" se i dati vengono modificati senza Hibernate, il secondo è un'interconnessione cache delle transazioni disabilitata per impostazione predefinita.
  • Funzionalità, Hibernate può fornire funzionalità OptimisticLocking, modulo per generare automaticamente la cronologia delle modifiche e così via.

C'è una cosa che non conosco sulla procedura memorizzata in ibernazione e memorizzata: Hibernate ha un modo per sapere quale oggetto sarà modificato dalla procedura di memorizzazione al fine di svuotare la propria cache? se non lo fa, è chiaramente un enorme rischio di andare nei guai. Ma anche senza questo, vedo già un sacco di svantaggi nell'usare la stored procedure.

Anche se l'intento di gestire l'accesso alle tabelle sembra buono, in realtà non c'è molto da fare nella pratica. Poiché si esegue il microservizio, è probabile che tutte queste tabelle debbano essere accessibili dallo stesso utente, quindi non vedo il punto di aggiungere ulteriore sicurezza. Se si desidera avere più microservizi separati sullo stesso server di database, utilizzare uno schema diverso o un'istanza di database pari.

In conclusione, usando la procedura memorizzata, sarai estremamente limitato in ciò che puoi fare con Hibernate mentre hai il peso extra di usarlo. Fondamentalmente, avrai la mappatura e basta.

    
risposta data 12.04.2018 - 15:15
fonte

Leggi altre domande sui tag