【发布时间】: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