La nostra applicazione ha rilevato alcune vulnerabilità di AppScan e abbiamo dovuto aggiungere la validazione lato server per rilevare i tentativi di iniezione SQL.
Ma la mia domanda è: fino a che punto si va nella convalida sul lato server? In teoria, non c'è fine a quanto sia complicato riuscirci.
Supponiamo che sto solo convalidando che non ci sono caratteri speciali nel mio modello, che è il minimo indispensabile
public boolean validateModel(Model model) {
// Email address has no special chars
try {
InternetAdress emailAddr = model.getEmailAddr();
emailAddr.validate();
} catch (Exception e) {
return false;
}
// FirstName has no special chars
if (!StringUtils.isAlphanumeric(model.getFirstName())
return false;
// LastName has no special chars
if (!StringUtils.isAlphanumeric(model.getLastName())
return false;
}
// ...
return true;
}
Ma perché fermarsi qui? In qualsiasi operazione CRUD, dobbiamo anche proteggere da ID o numeri non validi, quindi ogni Insert può controllare che l'ID non esista ancora; che tu appartenga o non appartenga a qualsiasi area tu dichiari di essere affiliata (ad esempio, l'ID è un ID valido per te); o qualsiasi aggiornamento / cancellazione può controllare che l'ID debba esistere per primo. Per essere veramente sicuri, possiamo davvero analizzare l'input dell'utente perché gli hacker possono sostituire i dati non validi anche senza caratteri non validi.
Il mio punto è, per raggiungere un livello adeguato di sicurezza lato server, c'è un enorme controllo che si può fare sul lato server. Dove ti fermi? Quali sono le migliori pratiche?