Background:Fuggi-fuggi SQL stringhe in Java
Attualmente sto sviluppando un front-end Java per un database di Enterprise CMS (Business Objects). Al momento, sto costruendo una funzionalità per consentire all'utente di creare una query di database personalizzata. Ho già implementato misure per garantire che l'utente sia in grado di selezionare solo un sottoinsieme di colonne disponibili e operatori approvati per l'accesso utente (ad esempio SI_EMAIL_ADDRESS può essere selezionato mentre non possono essere più potenti campi come SI_CUID). Finora le cose sono andate avanti bene, ma è giunto il momento di proteggere questa funzionalità da potenziali attacchi di SQL injection.
la domanda:
Sto cercando un metodo per sfuggire stringhe di input dell'utente. Ho già visto PerparedStatement, tuttavia sono costretto a utilizzare API di terze parti per accedere al database. Queste API sono per me immutabili e l'accesso diretto al database è fuori questione. I singoli metodi accettano stringhe che rappresentano le query da eseguire, invalidando quindi PreparedStatement (che, a mia conoscenza, deve essere eseguito su una connessione diretta al database).
Ho pensato di utilizzare String.replace(), ma non voglio reinventare la ruota se possibile. Inoltre, sono molto diverso dagli esperti di sicurezza che hanno sviluppato PerparedStatement.
Avevo anche esaminato il riferimento API Java per PerparedStatement, sperando di trovare una sorta di metodo toString(). Ahimè, non sono riuscito a trovare nulla del genere.
Qualsiasi aiuto è molto apprezzato. Grazie in anticipo.
Riferimenti:
Java - escape string to prevent SQL injection
Java equivalent for PHP's mysql_real_escape_string()
Quel primo link del tuo è possente interessante. Mi interessa il comportamento potenzialmente indefinito del metodo toString() implicitamente definito. Gli architetti aziendali hanno compiuto sforzi notevoli per garantire che il database stesso sia ben nascosto (come dovrebbero). Non so nemmeno cosa DBMS sia in esecuzione o se verrà modificato in futuro. – phobos51594
In realtà, vieni a pensarci, non sembra che PreparedStatement abbia anche un costruttore accessibile pubblicamente. Dal momento che non ho un oggetto di connessione JDBC, non sono sicuro di come potrei anche ottenere un oggetto PreparedStatment con cui iniziare. Hm. – phobos51594
Sì, posso vedere come sarebbe un enigma. Non ho usato Log4JDBC ma sembra che potrebbe essere in grado di generare l'SQL per te in base alla dichiarazione preparata. – ametren