Assumere uno SchemaRDD rdd
con una tabella registrata customer
. Si desidera filtrare i record in base a un input dell'utente. Un'idea potrebbe essere come fare questo è la seguente:Qual è il modo migliore per evitare le iniezioni SQL in Spark-SQL (su Hive)
rdd.sqlContext.sql(s"SELECT * FROM customer WHERE name='$userInput'")
Tuttavia, dal momento che i vecchi tempi di PHP sappiamo che questo può portare a cose brutte. Esiste un equivalente di PreparedStatement? L'unica cosa che ho trovato che sembrava remotamente rilevante è org.apache.commons.lang.StringEscapeUtils.escapeSql
.
Attendi ... Quindi .... SQL injection su Spark-SQL. E Spark-sql è una prova di implementazione di alcune funzionalità simili a SQL. NON TUTTO. Di nuovo cose come sql escape erano una parte di php e non di SQL stesso. Inoltre ... cosa c'è di sbagliato nell'usare 'org.apache.commons.lang.StringEscapeUtils.escapeSql'. Oltre a questo - ricorda la parte "trial" e "some" ... Quelle query con escape non sono garantite per funzionare con Spark-SQL. –
Beh, sì, è un sottoinsieme di SQL che non significa che non possa essere sfruttato da iniezioni che, ad esempio, consentono all'utente di vedere i dati a cui non dovrebbe avere accesso. Se si guarda il documento di escapeSql sembra duplicare 'characters (' => '') che non è il modo in cui le stringhe sono sfuggite in spark-sql. Suppongo anche che ci debba essere un modo canonico per ottenere ciò che è ciò che sto chiedendo. – DanielM
Quello che sto dicendo è ... dal momento che anche il sottoinsieme a cui mirano non è completamente implementato, non si stanno certamente focalizzando sulla fuga. E quindi, dovrai lavorare tu stesso sul risanamento delle query. –