2015-04-16 15 views
5

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.

+0

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. –

+0

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

+0

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. –

risposta

1

Un'opzione potrebbe essere quella di utilizzare thriftserver to expose jdbc, quindi è possibile utilizzare le normali tecniche (PreparedStatement ecc.) Per impedire l'iniezione di SQL.

Problemi correlati