2017-01-30 9 views
6

シナリオ:Apacheのスパーク:SparkSqlでは、SQLの脆弱SQLインジェクションにしている

ハイブ内のテーブルがあると言う、そしてそれは、テーブル名が渡され、以下のSparkSql Apacheでのスパークを、使用して照会されます引数として渡され、クエリに連結されます。

非分散システムの場合、私はSQLインジェクションの脆弱性を基本的に理解しており、JDBCのコンテキストでは、このようなシナリオでcreateStatement/preparedStatementの使用法を理解しています。

sparksqlの場合、このシナリオはどうですか?このコードは脆弱ですか?どんな洞察?

def main(args: Array[String]) { 

    val sconf = new SparkConf().setAppName("TestApp") 
    val sparkContext = new SparkContext(sconf) 
    val hiveSqlContext = new org.apache.spark.sql.hive.HiveContext(sparkContext) 

    val tableName = args(0) // passed as an argument 

    val tableData = hiveSqlContext.sql("select IdNUm, Name from hiveSchemaName." + tableName + " where IdNum <> '' ") 
             .map(x => (x.getString(0), x.getString(1))).collectAsMap() 


    ................ 
    ............... 

} 

答えて

2

あなたは、Spark 2.0で次のように試すことができます:

Javaでは
def main(args: Array[String]) { 
val conf = new SparkConf() 

val sparkSession = SparkSession 
    .builder() 
    .appName("TestApp") 
    .config(conf) 
    .enableHiveSupport() 
    .getOrCreate() 

val tableName = args(0) // passed as an argument 

val tableData = sparkSession 
.table(tableName) 
.select($"IdNum", $"Name") 
.filter($"IdNum" =!= "") 
.map(x => (x.getString(0), x.getString(1))).collectAsMap() 


................ 
............... 

} `

+0

SparkSessionはv2.0以降で利用できます。制限は1.5で完了させる必要があります。 sqlContextまたはhiveSqlContextを介してSparkContextを使用して同様のことを行うことは可能ですか? –

+2

SparkSessionの代わりにSqlContextを使用することができます –

0

通常のSQLインジェクションの脅威に対処するための最も一般的な方法は、プリペアドステートメントを使用することです。

あなたはScalaのライブラリを探すためにScalaのJavaライブラリやgoogle prepared statementsを使うことができます。 ScalaはWebアプリケーションでも使用されているので、そのようなライブラリが存在すると確信しています。

+0

はい、通常のアプリケーションでは、あなたが言ったように行っていますが、Apache Spark Sqlのコンテキストで調べていました。 –

+1

私は、sparkの組み込みのソリューションがあるかどうかはわかりません。ユーザーからの入力を受けるアプリケーションdbであることを意図していないので意味があります。 "spark way"に行く場合は、SQLフレームなしでデータフレームAPIを使用できます –

関連する問題