복붙노트

[HADOOP] Apache Spark : SparkSql에서 SQL은 Sql Injection에 취약합니다 [duplicate]

HADOOP

Apache Spark : SparkSql에서 SQL은 Sql Injection에 취약합니다 [duplicate]

대본:

Hive에 테이블이 있고 Apache Spark의 아래 SparkSql을 사용하여 테이블 이름이 인수로 전달되고 쿼리에 연결되는 쿼리가 있다고 가정합니다.

비 분산 시스템의 경우 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()


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

}

해결법

  1. ==============================

    1.Spark 2.0에서 다음을 시도 할 수 있습니다.

    Spark 2.0에서 다음을 시도 할 수 있습니다.

    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()
    
    
    ................
    ...............
    

    }`

  2. ==============================

    2.Java에서 일반적으로 SQL 주입 위협을 처리하는 가장 일반적인 방법은 prepared statement를 사용하는 것입니다.

    Java에서 일반적으로 SQL 주입 위협을 처리하는 가장 일반적인 방법은 prepared statement를 사용하는 것입니다.

    스칼라에서 Java 라이브러리 또는 google 준비 문을 사용하여 스칼라 라이브러리를 찾을 수 있습니다. 스칼라가 웹 애플리케이션에서도 사용되기 때문에 그러한 라이브러리가 존재한다고 확신합니다.

  3. from https://stackoverflow.com/questions/41941472/apache-spark-in-sparksql-are-sqls-vulnerable-to-sql-injection by cc-by-sa and MIT license