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)}
non vorrei fare la prevenzione SQL injection a quel livello. JDBC ha già molti meccanismi di prevenzione con 'PreparedStatement'. –
OK ma per quanto riguarda gli attacchi Javascript injection (XSS). – kellyfj