Apache Spark JDBC SQL 注入 (pyspark)

Posted

技术标签:

【中文标题】Apache Spark JDBC SQL 注入 (pyspark)【英文标题】:Apache Spark JDBC SQL Injection (pyspark) 【发布时间】:2017-12-08 20:08:14 【问题描述】:

我正在尝试向 jdbc 提交 sql 查询,同时受到 sql 注入攻击的保护。我有一些代码,例如

from pyspark import SparkContext
from pyspark.sql import DataFrameReader, SQLContext
from pyspark.sql.functions import col
url = 'jdbc:mysql://.../....'
properties = 'user': '', 'driver': 'com.mysql.jdbc.Driver', 'password': ''
sc = SparkContext("local[*]", "name")
sqlContext = SQLContext(sc)
from pyspark.sql.functions import desc
pushdown_query = """(
    select * from my_table 
    where timestamp > 
) AS tmp""".format(my_date)
df = sqlContext.read.jdbc(url=url, properties=properties, table=pushdown_query)

我可以以某种方式使用绑定参数吗?

任何阻止 SQL 注入的解决方案都可以。

如果有帮助,我也会使用 SQLAlchemy。

【问题讨论】:

【参考方案1】:

如果你使用 SQLAlchemy,你可以试试:

from sqlalchemy.dialects import mysql
from sqlalchemy import text

pushdown_query = str(
  text("""(select * from my_table  where timestamp > :my_date ) AS tmp""")
      .bindparams(my_date=my_date)
      .compile(dialect=mysql.dialect(), compile_kwargs="literal_binds": True))

df = sqlContext.read.jdbc(url=url, properties=properties, table=pushdown_query)

但是在一个简单的情况下,比如这个,不需要子查询。你可以:

df = (sqlContext.read
    .jdbc(url=url, properties=properties, table=my_table)
    .where(col("timestamp") > my_date)))

如果您担心 SQL 注入,您可能会遇到更大的问题。如果单独有 (almost) 没有内置安全机制,可能不应该暴露在不受信任的环境中。

【讨论】:

以上是关于Apache Spark JDBC SQL 注入 (pyspark)的主要内容,如果未能解决你的问题,请参考以下文章

SparkSQL介绍与Hive整合Spark的th/beeline/jdbc/thriftserve2shell方式使用SQL

scala mysql jdbc oper

CVE-2022-33891 Apache spark shell 命令注入漏洞复现

在 Apache Spark JDBC DataFrame 中使用 Postgis 几何类型

在 Spark SQL 中使用 Presto JDBC 时无法识别的连接属性“url”

教程:Apache Spark SQL入门及实践指南!