2013-05-06 10 views
6

Ho un controller in primavera con un metodo come il seguenteCome configurare primavera Controller e/o JAXB per aiutare a prevenire SQL/XSS iniezione

@RequestMapping(value = "/v1/something", method = RequestMethod.POST, headers = "content-type=application/xml") 
@Valid 
public void something(@RequestBody final SomeBody myDto . . . . . 

io voglio essere sicuro che la richiesta Corpo non contiene qualsiasi carattere SQL o Javascript per evitare SQL Injection, attacchi XSS, ecc.

JAXB gestisce già questo scenario? Stavo pensando di scrivere un filtro, ma posso solo leggere il corpo della richiesta una volta sola?

Qualche suggerimento?

+2

non vorrei fare la prevenzione SQL injection a quel livello. JDBC ha già molti meccanismi di prevenzione con 'PreparedStatement'. –

+0

OK ma per quanto riguarda gli attacchi Javascript injection (XSS). – kellyfj

risposta

5

Protezione XSS e SQL corretta (e convalida dei dati in generale) può avvenire solo sul lato server. La convalida lato client è irrilevante in quanto un utente malintenzionato può semplicemente scrivere il proprio client o inviare una richiesta HTTP personalizzata. La convalida lato client è utile solo per avvisare gli utenti non malintenzionati delle convalide dei moduli senza un round trip del server (es: verificare che un campo sia un numero o un indirizzo e-mail). Anche in quella situazione il server deve anche eseguire la convalida.

Per impedire l'iniezione SQL, utilizzare le variabili di binding (ad es. Istruzioni preparate) per tutte le query con parametri parametrizzati. Non si dovrebbe mai dovere concatenare gli input client per generare un'istruzione SQL. Se non si generano mai istruzioni SQL dall'input del client e le si utilizzano solo come variabili di collegamento, non è necessario preoccuparsi dell'iniezione SQL.

String clientValue = ... 
Connection conn = ... 
PreparedStatement stmt = conn.prepare("INSERT INTO foobar VALUES (?)"); 
stmt.setString(clientValue); 
stmt.executeUpdate(); 

O con la Primavera JDBC:

String clientValue = ... 
JdbcTemplate jdbcTemplate = ... 
jdbcTemplate.update("INSERT INTO foobar VALUES (?)", clientValue); 

Per evitare XSS assicuratevi di sterilizzare tutti i dati prima di uscita esso.I dati del client con white-listing quando vengono salvati sono generalmente una buona idea anche se si dispone di un sottoinsieme esplicito di testo accettabile, ma diventa più complicato quando si calcola il supporto Unicode. In genere è molto più semplice affrontarlo solo dal lato del rendering.

Per esempio, se si utilizza JSTL per rendere la vostra uscita si usa qualcosa di simile:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> 
${fn:escapeXml(myModelVariable)} 
+1

Alleluia! Finalmente la risposta corretta a questa domanda! – LoztInSpace

3

È possibile utilizzare Filters per pulire i moduli. Riceverà tutti gli attributi della tua richiesta e li pulirà tutti. Un'altra opzione è usare le API JSoup. visita i seguenti link per saperne di più.

JSoup XSS Api's

Filter approach to prevent XSS threat

EDIT:

Leggi fogli OWASP per sapere come evitare XSS e SQL injection.

OWASP - prevention of XSS

OWASP - prevention of SQL injection

Date un'occhiata a HDIV che si integra con la molla 3.1, ha il supporto out-of-the-box per XSS, CSRF, controlli di integrità di dati.

1

Per gli attacchi XSS si tratta principalmente di modifica del lato client. Per ogni input utente è possibile disinfettare i dati di input utilizzando la codifica in modo da eliminare tutti i caratteri speciali. Il modo basilare per gestire sul lato client è utilizzare la funzione Javascript escape(). OWASP è una buona referenza per passare attraverso la lista sol degli hack dei client. Per gli hacker lato server per impedire l'SQL injection è possibile guardare utilizzando le istruzioni preparate o utilizzando la creazione di query basata su modello (QueryDSL) o HQL ecc.

Problemi correlati