【问题标题】:What is the preferred way to avoid SQL injections in Spark-SQL (on Hive)在 Spark-SQL 中避免 SQL 注入的首选方法是什么(在 Hive 上)
【发布时间】:2015-06-22 12:40:48
【问题描述】:

假设 SchemaRDD rdd 具有注册表 customer。您想根据用户输入过滤掉记录。您可能有以下一个想法:

rdd.sqlContext.sql(s"SELECT * FROM customer WHERE name='$userInput'")

然而,从 PHP 的旧时代开始,我们就知道这会导致糟糕的事情。 有没有等价的 PreparedStatement?我能找到的唯一与远程相关的是org.apache.commons.lang.StringEscapeUtils.escapeSql

【问题讨论】:

  • 等等...所以.... Spark-SQL 上的 SQL 注入。 Spark-sql 是实现一些类似 SQL 的功能的试验。不是全部。同样,像 sql 转义这样的东西曾经是 php 的一部分,而不是 SQL 本身。另外...使用org.apache.commons.lang.StringEscapeUtils.escapeSql 有什么问题。除此之外 - 记住“试用”和“一些”部分......这些转义查询不能保证与 Spark-SQL 一起使用。
  • 嗯,是的,它是 SQL 的一个子集,但这并不意味着它不能被注入利用,例如使用户能够看到他不应该访问的数据。如果您查看 escapeSql 的文档,它似乎重复了 ' 字符( ' => '' ),这不是字符串在 spark-sql 中转义的方式。另外我认为需要一种规范的方式来实现我所要求的。
  • 我的意思是......因为即使他们瞄准的子集也没有完全实现,他们肯定不会专注于转义。因此,您必须自己进行查询卫生处理。
  • 在 DataFrame API 中查看 lit(value) - 我看到了这个 on the mail list today;没试过。

标签: scala security hive apache-spark apache-spark-sql


【解决方案1】:

一种选择是使用thriftserver to expose jdbc,然后可以使用常用技术(PreparedStatement 等)来防止 sql 注入。

【讨论】:

    【解决方案2】:
    def safeSql(query,**args):
        spark.udf.register("arg", lambda x: args[x])
        return(spark.sql(query))
         
    safeSql("select arg('a'),arg('b')",a=4,b="O'Malley").show()
    

    以上是在 pyspark 中,但它可以在 Scala 或其他语言中完成。诀窍是注册一个 udf。

    【讨论】:

      猜你喜欢
      • 2014-12-15
      • 1970-01-01
      • 2020-05-05
      • 2017-11-10
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 2017-12-02
      相关资源
      最近更新 更多